00:00
啊,大家如果要是说已经正常的把合约部署到链上的话,应该能看到跟我现在一样的界面啊,就是大家可以看到多了一样东西,就是在RO这个选项卡下面,刚才我们只看到上面deploy,然后at address这这两个按钮,我们去点了上面这个红色的按钮去部署合约,现在呢,它下面又多了一栏,它叫做deploy contracts,意思就是说已经部署了的合约。而且下面还有一条就是叫做foret at后面有一有一串数,后面还有一个括号block Cha,这是这是什么呢?这其实就是我们刚刚的发送的那个交易,真正的已经成功的创建了一个合约,而这个合约已经在区块链上生效了,它的名字叫做fo,就是我们定义好的,然后后边这个at哪里,这就是我们合约的地址,大家如果感兴趣的话,可以点一下后面的这一个copy,这就会把合约的地址添加到我们的,呃,就是剪贴板里面,我们可以到eer上去看一下,但是大家要记住,现在我们用的应该是测试网络,像我的话应该用的是RBY,有些同学可能用的robson,对吧,如果是RI by的话,就得RI by.lier sc.IO,我们到这个浏览器里边去看一下刚才的这笔交易。
01:33
直接把刚才复制好的这个合约的地址放到这个搜索框里面,直接点购去查询,诶大家可以看到这里的这个页面,它跟我们平常看到的那个就不一样,它上面直接就写了contract,然后后面它的地址,所以它已经直接识别出来,告诉我们这是一个合约,这个合约下面只有一笔交易,就是从一个地址,呃,这是一个transaction哈西啊,然后这是在从在哪个块,然后三分钟之前从哪个地址,然后。
02:13
传进来to,大家看,To是到contract creation。所以大家就可以看得出来,刚才咱们发送的其实也是一个交易,一个特殊的交易,它的发送人是谁呢?From这里就是发送人对吧?这个是谁?这个肯定就是咱们自己嘛,看一下是不是我的地址啊,9FD0就是这个,而two呢,它是一个特殊的地方,其实在这个就是合约创建的过程当中,它to的地址就是全零的一个地址,如果要是发送到这里的话,它就默认认为这是一个合约创建的交易。所以就会把我们的合约直接部署到区块链上啊,这就是刚才给大家解释一下,刚才我们点ma MAS上那个确认按钮的时候,传送到区块链上之候,发送这整个的这个部署合约的过程到底发生了什么事情,大家可以看到就是这一笔交易后面的value就是零,对吧?这也就是为什么我们自己看到那个页面上也是零,然后看到交易成功之后,后面那个显示的也是零,这就是因为这笔交易我们就没给他发以态嘛,所以它就是零,最后还有一个transaction fe,那肯定就是我们消耗掉的GA乘以乘以我们的那个单价对吧,这就是我们的手续费。
03:33
好,这个大家应该改啊,什么修改什么不可以修改,呃,你说就是这个合约的内容是吗?这个这个。你你说你说这个内容不能修改是吧,已经上链,对这个内容是的,他已经上链了,就永远不能修改了,咱们可以看到它下面除了这个交易这一项之后,后面还有一个选项卡叫code。
04:04
我们点开看。大家可以看到,这就是我们发送的所有这个交易的就是编译好的字节码。当然在这个里边,就是他没有专门给咱们做这种就是解析出solidity源码的这个工作啊,所以说咱们看到的就是一串,呃,自己也不认识是什么的东西,这就是咱们写的那几行代码合约编译出来的字节码就是这个样子,呃,我看看会不会可以。哦,不行,他只能去看到这个操作码的这个显示啊,或者是字节码的显示,他可能没有办法,这个是看相似的合约,所以大家可以看到这个代码都已经布到上面了,那这个合约就不能改了,如果我们想改代码,那我们再去部署的话,部署出来的就已经是另外的合约了。在这个地址上的合约,它就是这个样子的,他再也改不了了,这就是区块链的特性嘛,对吧,不可篡改。
05:07
好,接下来我们就还是回到这里来,其实刚才已经看到啊,有同学其实已经试了一下了,这一个合约已经成功部署之后,我们看到remix做的非常好的一点,就是他把我们这个能用的函数,能用的方法直接就列到下面了。咱们是不是在里面定义了一个withdraw的一个方式,诶,这里它就直接列出来了,而且咱们不是需要传递一个参数吗?它后面也直接就给出来了,就是一个输入框让我们去选啊,所以这真的是非常方便的一个一个模式啊,有同学刚才可能已经试过了,就是假如说我给一个一,大家可以看到这里会变成一只小手,那说明这个是可以点的。我直接点一下这个withdraw,就相当于是跟我们那一个水龙头那个地址一样,去点我们要拿一个一胎的这个,这个状态是一样的,只不过我们只点给了一的话,我们这个动作不是拿一个以态,是要拿一个尾,对吧,点一下试试,诶,哦,GA limit feel了,大家可以看到这个,这就是呃,在这一笔交易的过程当中,这个GA limit是有问题的啊,我先把它cancel掉,我们。
06:27
我们可以把这一个数量再改大一点啊,好,还是在提示再limit,呃,我们看一下这里的limit。仔细的这如果他频繁的出现,就是不符合我们预期的这个报错的话,呃,这就需要我们去看一下他的这个详细的信息了,他的这个说说明的意思是什么呢?是。
07:00
该死的,这个估计错误,然后他的信息是下面的这些信息啊,呃,这里这个交易的执行是很有可能fail的,是很有可能失败的,所以就是现在我们还没有发送交易,这就是remix自己检查,他检查出来。我们这个交易可能有问题,所以他就直接弹一个弹一个框就告诉我们有问题了,然后他说你是否要想要去强行发送这笔交易,我我不知道其他同学是不是在发送的时候也看到这个,那有同学可能就想要去强行发送,对吧,我们可以去试一下啊好,我点了3TRANSACTION,好,好吧,我现在似乎这个网络又会,哎,还行啊。大家可以看到我们刚才的这一笔交易,是不是又又是这个输入的金额是零,因为我们是想从水龙头提币,对吧,肯定不会给他转币,这一笔交易是咱们提交给,就是从咱们提交给水龙头from自己的账户to水龙头账户的一个一个交易,那我们当然不能在这个交易里边去给他转币,如果转的话,那就是我们花钱了,而不是从他那里拿钱了,好,我们在这里confirm一下。
08:27
鼠标出了点问题,希望网络能稍微给一点力啊。好,非常好,这笔交易已经成功了,大家可以看到下面的这一个控制台的输出栏里边,已经把这一个它的交易哈希这个链接都放到这里了,对吧,我们直接可以,诶大家看下面好像又报了一个错,我们可以直接点开在这里看一下他的信息啊。呃,大家如果要是觉得这一个看着不方便的话,可以把这个界面调整一下这一个块,他说呃,出了就是这笔,刚刚才我们出的这个这笔交易啊,他有点问题。
09:11
就是他在挖矿卖,就是挖矿的意思嘛,在挖矿的过程当中去执行的时候,执行失败了。如果我们点开这个交易的话,他会直接跳到easter sky,其实如果要是说大家自己也发了这样一笔交易也失败了的话,应该能够在eer sc上看到一个类似的消息,他会说这笔交易在执行过程当中失败了,那大家可以想一想这个东西为什么会失败,我们这个提币有问题吗?这个是不是给的参数太大了,因为咱们当时好像是有一个参数限制的,对吧?如果要是说。大于,它必须要求要小于等于一个以态,或者大家设置可能是0.1个以太,但是我们这里这个好像零没有,根本没有那么多对吧,差很多呢,那应该满足我们的条件啊,为什么他会失败呢?
10:05
呃,这就是昨天我们给大家还专门又说了一句,大家如果对比我们昨天贴出来的那个代码的话,会发现这里少了一个函数,对吧?对,这就是这里需要有另外一个函数,这个函数相对来讲,可能这会儿跟大家解释会有一点复杂啊。大家可以先有一个印象,就是这个函数叫做回退函数,这个函数是没有函数名的,在一个合约里边允许有一个这样的函数,而且它最多只能有一个,只要它是没有函数名的函数,我们定义在这里,这就代表这是一个回退函数,好,那么我们在这里定义它的函数的特性,这里有一个大家没有见过的关键字叫做payable payable是什么意思呢?就代表说我们调用到这个合约的时候,Help是可支付的,所以就是说这个合约是可支付的,大家可以简单这么理解啊,具体的实际的这个原理可能会比较复杂,就是什么时候会调用这个回推函数,大家在在一开始接触它的时候,可以理解成假如说我们想要给这个。
11:26
合约去就是发币的时候,转币的时候就会调用到这个回推函数,那如果我们想给他转币的它的回退函数,它是不是可支付的话,那肯定就不能不能转币了,所以我们现在需要给他加一个可就是相当于是可以转币的回退函数,这样我们就可以给他转币了,这个稍微有点绕啊,我们就。先把这个删掉,先把这个删掉,还是刚才我们这个合约,呃,我们刚才是直接去点水龙头去提币的时候出出了错,我们要不我们就给他转一个币试试吧,我们看一下这个地址是什么。
12:11
刚才我们不是说,呃,我们每次发交易的时候给他转币都是零吗?那提币提失败了,那转币能转成功吗?我们试一下。转币就是send对吧?诶大家可以看到刚才的这个页面,其实能看到这个费,这是刚才我们发送的那笔交易对吧?这里前面的这个成功的部署合约的交易就就显示的是绿色的confirmed,然后这里就是红色的field,我们点send。然后这里选择合约的地址,合约也是有地址的,它也是一个账户,然后假如说我们选择给他发一个以太GAP,我们就不去设置了,直接next。现在大家就会看到,哎,这个页面这里就变成一了,所以这是我们真正要给他发以态的时候,这里才是一,之前我们所有的操作部署合约和从他那里提币,我们都不给他发币,所以说这里肯定就是零和。
13:17
好,现在这个已经已经发出去了,现在是判定的一个状态啊。呃,今天好像本身测试网络也不是很给力,Riby其实大家如果要是这两天经常在用的话,会发现RY其实还是很快的,对吧?因为它不需要像主网或者是robsson我们的主测试网那样,它需要用pow,就是真正的矿工在那里不停的挖矿,他用这个权威认证算法的话,证明算法的话其实是出牌很快,呃,那这里他判定我们查一下他吧。好,刚才的这一笔交易大家可以看到啊,刚才失败的那一笔交易我们查到了,这里也有一个错误信息,跟我们在控制台里面看到的应该是一样的,他说warning error,然后在这个合约执行的过程当中发生了错误,然后执行给回退了。
14:15
我们再来查一下现在自己的这个地址,刚才发的这笔交易有没有成功,还在盘定啊,呃,不能,因为大家想为什么我们可以在这个浏览器里边直接能查到,因为这个交易已经广播出去了,所以即使我们想撤销,除非你能检测到自己给哪些节点,就是哪些节点收到了你这个网络信息,然后你去告诉他们说,哎,我要撤回啊,你把我那个交易从从那个交易池里边给我撤掉,除非你告诉所有的人,所有的节点,但这这在我们的互联网上几乎就是不可能的一件事情,所以这也是我们在这个区块链上,比方说像以太坊上,如果要是发送发币的时候的一个,就是很多人觉得很不安全,或者说很危险的一个事情,就是说一旦我们发现发完了之后,发现发错。
15:16
了,在判定状态已经没有用了,我们只能眼睁睁的看着等他确认变成一个生效的交易,撤是撤不回来的,呃,当然也是有某种可能的,只有一种可能啊,就是说我们在发送,用用很快的速度再发送另外一笔交易跟这一笔交易。呃,这就可能更专业一些,大家先有个概念就好,跟这一笔交易要定义成同一个NUS,然后矿工就会认为,假如我们后发的那个交易先被矿工打进包的话,这笔交易先发的这个交易判定的交易就会被拒绝,因为他认为这两笔交易就是他的先后顺序是一样的,就是他不应该都发生,如果那个发生了,这个就不能发生,是可以用这种方式实现某种意义上的撤回,但是他不保险,你也不知道会不会后面那个,呃,发出去了之后也判定了,然后还是这个先生效,然后后面那个被拒绝了,就所以嗯,这个是不保险的。
16:20
这也就是说,呃,昨天跟大家提到我们这个一些所谓的安全规则,安全须知的时候,为什么说大额转账之前先做一笔小额测试,呃,这就是你一旦很大的一笔钱,我要转100个以太坊,呃,以太币直接一下子就转过去,然后发现地址发错了,好撤不回来,这笔钱就转给别人了,或者说转到一个没人用的地址,或者说一个黑洞地址上,那这笔钱就再也找不回来了,呃,他他就是这样的一个特性了,我刷新一下页面,这个判定时间确实有点长。呃,这个确实是有一点奇怪的一个状况啊,按道理现在测试网络可能不会有这么长时间的判定,大家可以自己测试一下看看,用自己的账户给刚才自己创建的那个合约发一个仪态。
17:15
大家看看能不能做这样的事情,可以先试一下,前面呃说的这一个可能有同学试了,有同学还没试啊,没有试的同学可以先试一下,这个就是咱们既然是一个水龙头合约嘛,我们肯定就是输一个数,我一提币,我我得提出来才行啊。呃,大家可以先尝试一下。对,其实到现在大家已经发现了,刚才那个交易就是水龙头合约直接取的时候为什么会失败的,很简单,咱们取的时候是让他要往出发,它里面根本就没钱,好像那那这个他往出转怎么能转的出来嘛,所以说肯定会失败,所以咱们现在的做法就是想要去给他转一点币,但我现在的这个问题在于这笔交易给判定了。
18:11
呃,大家可以试一下,就是试一下刚才我提到的这两个操作,一个是先从这个里边去试着提币,看是不是确实失败了,然后再试着去给用自己的mama钱包给他转一笔账,我尝试着再转一笔啊。重新布。为了跟刚才不一样,我这次转两个仪态看一下是不是该K太小了哦。呃,大家可以看到,但按道理说,在这个RI by网络上给这个一纪委的guess是没有问题的啊,在正常来讲,我们之前的交易应该都是纪委的,盖,我去confirm这个交易。
19:11
还是一个判定状态,嗯,交易看守是吧?呃,是在是在哪里看到看索马是吗。这个是吗?哦,这里有一个看守啊,咱们可以看一下,这个确实是我没有尝试过的一个功能啊,这个非常这个点非常好啊,我看一下,呃,因为我们知道真正如果是发送出来的交易广播出去的话,是不能cancel这笔交易的。
20:09
那大家可以想一想,如果说我们在这里真的要去cancel这笔交易的话,会发生什么事情,大家可以看一下他的这个说说的这个描述啊,现在我们要去cancel cancel要花一笔gas费。然后要收这么多个仪态。然后他下面的说法说,提交这样一个尝试并不能够guarantee,就是并不能够保证你的原来的那一笔交易能够被cancel,如果说这个cancel的尝试是成功的话。你就可以。哦,你你就会被就是收上面的这笔交易费,所以大家大家觉得他是干什么了,他其实就是又发了一笔交易,对吧,想要顶掉刚才的那笔交易,尝试在那笔交易没有没有真正被确认之前把它顶掉,但是他说这个保证不了。
21:14
所以说这就是就是区块链上的一个特性,就是我们只要把这个广播出去之后,这个其实已经不由自己控制了,我们可以去做尝试,但是不好说最最后的结果到底是什么这样一个状况啊呃,如果说我们点这个let's try的话,它其实就是会另外发一个交易去顶他,我现在去let's try,因为这里一直在攀顶,那我觉得还是很有可能可以把它顶掉的,对吧,我们试一下。发一个交易。哦,我们这个cancel的这笔交易好像也在判定,所以现在似乎是网络的一个问题,大家有同学能在网络上去给别的账户转账吗?哦,我这里边看到了啊好,所以大家可以看到刚才我们的这个取消,刚才那笔交易他成功了,然后这就说明刚才我们发送的那笔交易顶掉了我们之前判定的那笔交易。
22:18
所以这就是一个成功的回撤的一个一个状态啊,但是他刚才已经说的很明确了,大家要注意这个不是能够就是一定保证我们能够把刚才那笔交易撤回的,这只是燃料给高点,对,所以一般情况为了要是想要撤回的话,这个是在网络上,就是它燃料给多少,测试网络可能矿工也不在意这个事情,对吧,但是如果要在主网上的话,一般一般我们的做法就是说,如果刚好现在网络比较卡,我们那个在潘DY,我们就会马上发送一个手续费很高的一个一个交易,就GA price给的很高,然后希望矿工看到这笔交易,能先把这笔交易打进去,那这样的话,我们之前的那笔大额的转账,尽管那个手续费低,但是他转账数额更大啊,所以那笔交易我们可以撤回来,是这样的一个做法,这是可以去去尝试的,呃,下面这一笔交易还是在一个。
23:18
判定的状态,所以在这里其实我是有一个猜测啊,因为按照RI by网络的一个特性的话,正常来讲不应该判定这么久,而且刚才咱们撤回的操作那笔交易也发送成功了,咱们可以看一下我的地址上面是不是。多了一笔撤回的交易,我们看一下大家可以看到啊,这里边有两个是发送到我自己的交易。呃,这这笔交易是不是已经确认了,后来发的这笔交易已经确认了。好,我们大家可以看到,就是这是这一笔交易的信息,它的交易哈希,然后下面是从我们自己的地址,然后转向自己的地址,这可能是当时我在输地址的时候,可能对点错了啊,有可能是点到自己的地址了,所以大家可以看,其实我们的交易能不能是昨天有同学提的问题,还是是不是有同学提这个问题,就是能不能给自己发交易,能不能给自己转币,我们可以看是能给自己转币,只要把转账的地址也写自己就可以,那这个效果是什么呢?那其实就是转了两个以太。
24:36
然后两个以太还在,还在我们这里一点都没少,但其实我们是少了一点东西的,对,因为这笔交易是有手续费,所以就是自己给自己转账,其实没有任何的意义,就是钱上是相当于是净赔手续费的,但是有些人其实是会去构建这样的交易,为什么呢?是因为大家可以看到下面它还有一个东西。
25:08
叫做。Input data,所以就是说在构建一笔交易的时候,其实我们是可以加一些东西的,加一些数据进去的,所以有些人他会他会用这种方式来去记录一些东西,呃,这是另外一个用法了,就是之后我们可能给大家就是做交易详解的时候,再给大家说这些具体的,嗯,每一个选项啊。好,所以大家可以看到我们刚才的这个尝试其实是不成功的,所以我刚才是又点到了这个这个散的是吧,我们先把它取消掉,所以可以,呃,我们可以看到就是大家如果有同学已经尝试过的话,有没有同学刚才这个合约给他发币,已经发成功的有没有没有是吧,大家的状态是什么,是判定还是失败,直接失败了是吧?对,所以正常这一个操作的预期的结果其实就是失败,为什么?就是因为刚才给大家说的这解释的这一部分内容本身,如果说我们要给一个合约发币的话,它的回退函数必须是可支付的函数,就是必须有可支付那个特性才能给他发币,而我们这里边根本没有定义,那他当然默认就是不可发币了,所以我们想给他转币就不行,现在我们改一下这个合约。
26:34
Function回退函数没有任何的名称,然后里边也没有任何的内容,但是我们要记得给它一个特殊的函数属性,叫做payable,大家把这一句加上来之后,呃,有同学可能说,那我好,这个已经加进来了,我直接在这里再点一下,大觉得这个可以直接这么这么点吗?但里边还是没钱,对不对?那有的同学说我这个已经加进来了,我现在去给他转币吧,是不是就可以了,大家说我现在直接去去给刚才那个地址上转币行吗?行不行?对,就是刚才我们说的,之前我们的合约已经部署到链上,它的代码不能改了,所以说那个合约相当于就作废了。
27:25
我们的那一个水龙头合约就是一个废的合约,因为它里边既没有钱,也不能接收B,所以也就提不出来B,所以现在如果说我们修改了代码的话,我们得把刚才的流程再来一遍,我们先看一下,呃,首先是我们去编译,编译一看没有没有问题,通过了,然后再去做一次。部署。呃,我先不把刚才那个删掉啊,直接点一下部署,部署当然还是要部署到链上,要花手续费,大家看到部署的时候还是转账的费用是零。
28:02
好,这笔交易应该已经成功了。他是已经发出来了,但是可能还在判定状态。呃,大家可以照着我的这个好,我们这里已经成功部署上去了啊,大家可以看到在wrong的这一页下面,已经部署的合约里边是不是又加了一个。在刚才的这个合约下面又加了一个,然后我们点开一看。诶,跟刚才不一样了,当然首先了,就是它的名字都叫foret,都叫水龙头,但是它后面的地址本来就不一样了,对吧?所以我们就发现每一次部署合约,即使你的代码刚才我们这代码是改了,即使你的代码一样,大家也可以试着去连续点deploy,可以发现部署出来的地址也都是不一样的,所以就是说同一份代码我们部署多次,它可以就是在区块链上有多份的这种副本存在,然后它有不同的地址,我们调用的时候地址不能调错,刚才我们已经部署的这个合约,大家点开之后发现比之前我们的东西就又多了一个fall back。
29:18
这就是我们所说的回退函数,就是我们单独定义的这个东西。好,现在。同样这里还是有一个withdraw的函数,我们可以就是输一个数据提,但是我们能够想到现在提肯定还是失败的,因为里面没钱,现在我们要做的是先给他转一笔账。呃,大家注意不要把这两个合约地址搞混,我们复制的是下面这个合约的地址,然后点开mask。Send,呃,我刚才可能一不小心点到了这个合约啊,所以就有了一笔自己给自己的转账,确认一下,624开头跟自己的账户不一样。我们转两个以太next来确认一下这个信息confirm,好,现在这一笔交易就已经发发送出去了,呃,但是现在这个状态还是在判定的一个状态啊。
30:21
哎,大家看现在这个已经成功提交了,我们看一下这笔交易,我们直接在这里应该开着的是吧。我们可以看一下这个合约,呃,大大家看我们直接在这个easter sky里边看这个地址的时候,诶这里怎么还是一个判定的状态啊,哪出问题了,注意地址,这个是刚才咱们打开的那个合约的地址啊,所以说这个就是就是大家如果一不小心的话,很可能就会出现各种各样的问题,对吧?呃,我们还是看一下这个我们部署的合约地址是这个624开头的,直接在在这里输入搜索框里边输入它的合约地址,我们去搜索,大家可以看到这个合约现在它的balance就是余额,它是有两个,然后它有两笔交易,一笔交易是最初的创建这个合约的交易,还有一笔就是刚才我们给他转转账,现在成功转进来了,好,大家现在可以再试试我们。
31:35
刚才说的这一部分,把我们家境回退函数的这个合约部署到链上,然后去给他转,呃,一个或者两个,以态或者随心随随大家心愿啊,转多少都可以,大家把这个再试一下。
我来说两句