00:00
好,我们继续来看,就是除了账户之外,下面还有一个就是以太币的定义了,以太币ether是以太坊内部的主要加密燃料啊,它这里这个加密燃料应该是一个,就是我觉得翻译的其实不是特别的准确啊,其实应该把它。当然,这里它的意思其实就是说,以太币主要的功能不是用来当数字货币去转账的,对吧?不是作为价价值流转去转账的,而是以太币的主要功能是。让以太坊运转起来的一个推动力,所以可以认为以太坊是虚拟以太坊虚拟机EVM运转的一个燃料,当然我们知道了它,它真正的运转是靠盖呃,用于支付交交易费用,所以最初以太币的设计,内置的以太币主要是用来付交易费。呃,并不是说要作为一个数字货币转账啊。
01:02
当然后面就又说了这个两两种类型的账户,这个我们都清楚了,最后就是人们可以通过创建和签名一笔交易,从一个外部账户发送消息啊,这里就提到了消息和交易的这个概念,这也是以太坊里边非常重要的概念啊。呃,那大家可以看到,就是在白皮书里面的定义,以太坊的消息在某种程度上就类似于比特币的交易,但两者之间呢,三点不同,第一,以太坊的消息可以由EOA,可以由外部账户提交,也可以由合约来创建,来调用。所以就是说,消息可以由任何一个账户,任何一个类型的账户发起调用,而比特币的交易只能从外部创建。所以其实在以太坊里边交易也是这样一个定义,对吧?呃,他只不过是说就是这里专门把消息又又分化出来,因为他认为以太坊里边的所有的状态转换,其实可以归结为就是消息和交易触发他们的转换,那交易其实在某种意义上可以认为是广义上也是一种消息,呃,交易也可以认为是一种消息,对吧?所以在这里的话,他就专门把消息来跟比特币里边的交易做一个对比,那比特币交易只能从外部创建了,没有内部脚本调用的这种模式,对吧?第二,以太坊的消息里边可以包含数据。
02:38
啊,这就是我们消息调用的时候,如果合约互相之间消息调用,它的函数选择器和函数参数都要放在data里面传过去,第三如果要是说以太坊消息调用的接受者是合约账户的话。也就是说我相信调用可以发送给一个一个外部账户,也可以发送给合约账户,发送给一个合约账户的时候,那合约账户还可以回应。
03:06
不仅仅是我去给他发一个东西过去,也就是说不仅仅是我传递一份数据给他,他还可以在。给我返回一定的东西,所以这意味着以太坊的消息就跟函数调用是一样的,所以我们平常意义上说消息调用的时候,其实在以太里面就跟函数调用是一样的。好,那下面就是说交易了,交易我们都很清楚啊,就是存储storage它,呃呃,以太网中的交易啊,它是一个就是签名的数据包,那它存的是什么东西呢?主要存的就是EUA发出来的一个消息了,把这个消息做了签名之后的一个数据包,这个就叫交易,那交易我们都知道,他有消息的接收者,用于确认发送者的签名,还有以太坊账户余额,Balance,还有要发送的数据,呃,Data,另外还有两个就是GA price和start GA,呃,之前我们都一一的介绍过,对吧,From to,然后签名rsv,然后balance,呃呃,不,不是balance啊,就是value,对吧?
04:19
还有就是start gas和gas price,那为了防止代码,这里就是为了防止无限循环,假如说我们去调这么一个,呃,以太坊的一个合约,发一个交易,调它里面代码的时候,他直接写一个死循环,那我们怎么办呢?之前我们说过了,所以说为了防止这种情况出现。以太坊里面做了限制。这个限制就是用GA来限制star gas,那就是其实就是我们后来说的GAVI,就是我们这笔交易最多消耗多少GA在这里就限制了,那GA price呢?这里给的定义是每一步计算,每一个计算步骤需要支付矿工的费用啊,所以呃,我们之前一般说GA price就是GA的单价对吧?那它这里其实就是说的是从另外一个角度来理解,就是每一步计算需要付多少费用,用以态来记啊,这是GA price。
05:20
因为在以太坊系统里面认为guess其实对应的是每一步操作,对吧,操作消耗guess。好,那么接下来是如果执行交易的过程中用完了瓦斯,这个大家不要管它,就是用完了盖对吧?如果交易执行的过程中用out of gas,那么所有的状态改变就会恢复到原状态,呃,但是呢,已经支付的已经消耗的gas,那就不能再收回了,所以说已经消耗的GA会根据他的GA price然后乘起来,作为这笔交易的交易费给到矿工。还有就是如果执行交易终止的时候已经完成了,还剩下有盖没有消耗完。那么这些guess。
06:08
将会退还给发送,所以大家在给这个GA limit的时候可以不用那么吝啬,就是想给多少都可以,就尽量的大一点是没有问题的,创建合约有单独的交易类型和相应的消息类型,那我们知道创建合约的时候,我们发起的是一个。他的墓的地址是。零地址大家还记得吧,创建。创建合约的时候,对吧,发起的这个交易,它的目的是零地址,所以呃,那那这个对于这个整个以太坊里面来讲,不管是什么样的操作,合约的调用也好,创建合约也好,还是我们去发以太币也好,传递数据也好,所有的都是交易和消息来完成他的这个状态转移的。呃,那合约的地址呢?它是基于账号的随机数和交易数据的哈希计算出来,所以大家可以看到就是呃,合约的地址,我们每次部署合约的时候,直接就生成一个合约地址,那这个合约地址怎么来的呢?我们自己的账户地址,那是根据我们自己的这个私钥,或者说我们一开始有这个注基词对吧,有种子,然后生成的随机的一个一个私钥,然后去导出公钥导出的地址,那合约的地址怎么来的呢?其实它就是na和交易的哈希算出来的。
07:33
呃,所以这个东西也可以认为是一个比较随机的东西,对吧?啊,而且至少它肯定是确定,确定不会一致,确定不会一样,因为本身那就是在不停的增加的,不会再回退回去了,对吧,那稍微有一点改动,它肯定哈希是不一样的,接下来还有一个对这个交易机制的一个啊,他是说这个有这样的这种交易机制啊,它的一个重要的后果,或者应该说是一个结果吧,是什么呢?就是说在以太坊里边所有的账户都是平等的。
08:13
所有的账户对于EVM来讲都是一样处理。对于EVM来讲。外部账户EOA。和合约都是一样啊,只不过就是他们合约的话,他还有自己单独的code和这个存储空间而已,至于处理的过程当中完全一样。所以这就使得合约可以充当同时充当多个不同的角色,大家理解一下他这里的这个例子啊,他说比如说用户可以使用去中心化组织,就是像do对吧,DOS这样的一个一个组织,那本身这个DOS就是一个合约。其实。他可以用这个。
09:00
DOS里边的一个成员,让他再成为另外一个中介账户。那它用来干什么的?DOS我们知道就是在这个里边,大家就就就成了一个自制化的一个社会,小社会一样,大家在上面根据定义好的这种交易规则来互相进行价值的转移,互相转账,那他为什么还要再建一个中介账户呢?为什么还要整一个中介呢?你看这里他就说了,是因为还有可能有人他很他很偏执啊,这里的形容啊,很偏执,就这个人呢,他不愿意用我们平常的这种椭圆曲线签名算法,他就是特别执着的想要用自己定制的签名算法,比如说基于量子证明的兰伯特签名,那这个东西的话,本身以太坊不支持,呃,或者说底层是没有这样的一个签签名算法的,但是呢,因为以太坊上可以随意的创建合约,所以他可以自己再去建一个合约。
10:03
来完成自己的签名,所以这样的一个人,他去提交交易的时候,一定是提交到自己的合约上。由自己的合约去用他自己定义的这一套签名机制,签完名之后再把他的东西发出去,是这样的一个东西,对吧?啊,那当然了,就是还有可能有些人有有别的一些安全需求,比如说他这个第四个人啊,第四个合约是什么呢?是他可能是用了五个私钥来保证安全的账户,就是他要求我这是一个多重签名地址,必须这五个私钥全提供你才能从我这里边转出钱来,诶有些人想要这么干,那在以太网上怎么实现实现呢?用一个合约。对吧,这个完全是可以实现的,呃,有这样的一个合约,大家可以看到啊,就是有人他要单独在做一重签名,有些人呢,是要求实现一个多重签名地址,还那那么这些人如果要在我们的这个去中心化组织DOS上就互相做。
11:08
做转账,那怎么去做呢?那就可能还需要有另外一个人当一个中介。我来处理你们这里的所有的需求,我来告诉你们,你们怎么样加入到我们DOS里边,跟大家正常的这个以太坊的账户去做价值转移,所以这又是一个合约,去把他们互相之间的这个资产对接在一起啊,所以大家就可以看到,只要有合约的这样的一套机制的话,那他就什么样的角色都可以去去,因为合约就是账户,账户就是合约,所以我们可以用合约去实现一个复杂的账户啊,这就是这个以太坊上对合约的这种理解,合约和账户的理解,好,那接下来我们看一下这个状态转换函数啊。状态转换函数,以太网上状态状态转换函数大家看就是这里写的这个还是跟比特币或者说是其他的一些加密货币是一致的,它是什么样的呢?一个状态转换函数,它的输入是S和transaction,也就是说首先我们要知道上一个状态。
12:19
然后它的转换也是交易对吧,也是交易触发,由交易来触发状态转换,然后就会根据这个状状态转换函数就可以得到自己的下一个状态,SAP,我们看一下上面这个图。左边这是S对吧,State上一个状态,它包括哪些状态呢?大家可以看到。它其实里边就是就是一堆账户是不是,所以说以太坊上的状态,以太坊的状态,世界状态,就是所有账户的状态。所有账户当前的状态加起来就是以太坊的状态,呃,那这个东西大家可以看到,上面这里是一个账户地址,然后下面就一个余额1024个ETH,然后下面这个呢,就没那么简单了,一个地址下面是5202个ETH,然后还有一段扣。
13:15
对,他有代码,然后下面还有什么0235235,那这就是还有他自己的存储对吧,所以这应该是一个合约地址了,呃,合约账户了,同样下面也是一个合约账户,又下面又是一个外部账户,所以大家可以看到这是当前的状态。那么来了一个,来了一个交易,来了一个传单之后,这个交易包含什么信息呢?比如说包含从哪个地址到哪个地址的一个一个交易,对吧,From to,那我们看到是从一个外部和外部地址。到另外一个BB75,这是到一个合约地址了。他的交易VALUE10,那相当于是对他还还转了账对不对对对这个交易对这个合约账户转了账,另外呢,他还有data塔,因为是合约嘛,可以调用贝塔给的是二还有差理,那这应该就是。
14:11
呃,这里是没有按照我们之前给大家讲过的,就是真正封装起来的函数选择器加上函数参数的方式,这个大家可以想象到,这给的就是一个函数调用参数了,对吧,这只是只是个示例,那最后就是还有签名,大家可以想到,就是既然是从这个上面这个地址发出来的,下面签名就是他的签名。大家看他的状况,状态转换,转换之后会变成什么呢?那上面的这个账户少了十个以太,下边的这个合约账户加了十个以态,而且它的data塔里边的二的这个位置大家可以看到。啊,那大家可以看到它这大家能看到里边的这个代码吧,它是真正执行的这个代码的。大家能看到吗?看不清楚是吧?呃,当然它这个其实啊。
15:06
这这其实是个是个伪代码了,看不太清楚对吧,它是说什么呢?如果if,然后非感叹号里边contract.storage那就是说当前这个合约的存储空间。的取哪个呢?取transaction,点得零,也就是说我们这里给的这个零这个参数二。合约的存储空间的第二个位置,假如非塔,那也就是他它没东西对吧?假如是零的话,我就给个负值,然后把当前的这个二这个位置story置给transaction.data1,也就是把第二个参数给到。我们前面的这个第二个位置来,所以它就是这个意思,所以就是一个简单的赋值,就像我们solid里边写了一个写了一个data一样,对吧,大家可以理解成它是一个set data,所以这么一个调用之后,它就变成什么了呢?这边的合约大家就看到下面这就变了,0235 235,第二个位置原来是零,确实是没东西,那现在就变成差理了,对吧?啊,所以这就是一个状态的转换,那别的合约和别的账户没有受到影响就还是一样。
16:20
好,那接下来我们看一下这个状态转换函数,我们说这个状态转换的过程当中,它到底做了什么操作呢?这里是一个很详细的定义,但是这这里只是定义,没有实现,实现的话是在黄皮书里面,但看一下这个状态转换怎么怎么定义啊,第一步检查交易的格式是否正确。也就是说是否是正确的数值,然后签名是否有效,是不是我们交易发起方它有效的一个签名,还有就是说nu是否是跟发送者账户的nu是相匹配的,这三个如果这都不匹配的话,那直接就返回错误了,对吧?这个大家都知道,首先要校验一下是不是一个有效的交易,然后是要第二步计算交易费用。
17:10
这个怎么算呢?是start GA乘以GA price。所以这个其实交易费用指的是我们一开始的预扣款,对吧,就相当于是我现在先。押金就像是我现在抵押了这么多GA放在这儿,我说最多就放这么多钱,然后你就用了,那预计呢,它是多少钱呢?乘以GA price乘以单价总共的这一个价值,这是相当于是我们的预付的交易费,预扣款,而且呢,第二步确定了这一个盖盖费之后,还要从签名里面确定发送者的地址。大家知道,就是本身transaction里边,其实大家注意就是是本身应该是没有from那个,呃,就是from当然是可以给啊,就是有时候是可以呃没有的对吧,或者说即使是给了之后,我们也得从签名里面去做一个解析。
18:08
那第二步就会从签名里边去把发送者的地址解析出来,然后。就从发送者的账户里边减去交易费,先把盖扣掉,然后增加加一。呃,这是第二步,所以第二步主要是在相当于是交易的一个预处理,对吧,相当于是先要把这个交易费先扣,如果你的账户余额不足,就连这个盖都盖费都不够付的话,那就直接返回错误。所以第一步交验校验的是交易的格式,第二步验证的是交易费,第三步是设定GA等于star GA。也就是说这里第三步就是开始要真正的去处理我们的盖。
19:05
它的初始值是GA,然后这里写的是根据交易中的字节数减去一定量的GA,也就是说在这里,呃,微神的最初的设计其实很简单,就是说我们就是看这个交易有多长。交易越长,我扣的盖越多,那当然这是一个最简版的实现了,对吧?大家都能想到,你如果要是有合约调用的话,那肯定又会有不同的逻辑,所以这里给的是根据字节数减去消耗的钙。第三步,消耗GA,第四步,那就是账户的价值转移,以太到底要转多少?假如说这里大家注意啊,如果接收账户还不存在,那么就创建此账户啊,这个呃,所以说大家就看到你可以随意转,对吧,你没有人创建的一个账户,你可以直接给他转账,你随便写一串,只要是符合标准的理财账户,你给他转是没问题的,只不过这个钱就是拿不出来而已,但没有私钥拿不出来,对吧?所以整个以太坊的这个规则,他是不校验这些你到底存在不存在,而且他是只要不存在就直接创建,这是为什么呢?
20:17
其实就是因为我们一开始创建账户的时候,创建一个以太坊账户的时候,其实不需要发送交易,告诉以太坊说,诶,我现在创建了一个账户,里边余额是零,那你说这个我发送交易就一定得里边有。有以太才行,对吧,那我刚刚创建一个账户里面确实没有以太啊,我怎么告诉以太坊知道我这里边我我创建了一个账户呢?所以这是一个矛盾,所以大家就是可以随意的去生成账户,我们自己就拿一串随随机数,随机数去创建私钥,然后就可以自己导出账户了,那以太坊可以不知道,但是没关系,你只要就这个时候大家可以发现自己创造出来的账户,别人其实都不知道,在以太坊上根本就看不到这个账户,对吧?
21:05
但是如果要是说你要想用这个账户的话,只要你往这个账户里边一充钱,那以太保执行这个交易的时候发现,诶接收账户还不存在,创建这个账户就写到了以太坊的永久的数据库里面,所以这个时候大家就都查得到了。啊,这其实比特币应该也有类似的性质,对吧,就是大家在如果是自己去生成一个账户之后,不发送交易的话,其实是没有,呃,就是没有人能知道你你的这个账户的,所以而且就是说如果大家用那个就是分层确定性钱包的话,应该别人给你转账转到你这里来之后,也是就是你自己的账户是可以隐藏起来的,对吧?所以说比特币是确定性钱包,这个会比较就是比较复杂,比较好用,当然以太坊里面可以用。合约去实现这些事情,所有的比特币里面实现的东西,都在以太坊里面,都可以用合约去实现。
22:08
所以呃,如果接收账户不存在的话,那就创建,如果是一个合约的话,那就得调用他的代码,所以这是就是DVM里边怎么样去处理咱们这个交易的过程,也就是以太坊的这个状态转换的过程,直到代码运行结束,或者盖耗尽啊,所以这就是整个这个交易的第四步啊,就是开始真正的转移价值,那其实就是说一个减一个加,对吧,账户余额一个减一个加,如果没有的话就创建,如果是合约的话,再要他的代码,最后如果要是发送者账户没有足够的钱,就是要转账钱不够或者是代码执行。这个auTo Gas gas不够了,导致转移失败,那么会回退回回滚到之前原来的这个状态,但是呢,还是需要支付交易费用,交易费用加至旷工账户,所以大家可以看这样的一个交易相当于还是。
23:15
对于以太坊状态转换来讲,还是生效了,对吧,只不过是它涉及到的这个账户,这个转账可能没生效,但是你的那个盖消耗也是我们以太坊状态的一部分。所以相当于以太坊还是一定会转移到下一个状态去。所以大家会发现这个交易交易即使是回滚状态了,但是相当于还是不可能撤回的,这个盖还是消耗。啊,最后否则,那也就是说假如说没有导致失败的话,那正常执行完毕了,所有剩下的盖归还给发发送者,这是最后一步收尾的工作,找零对吧,那消耗掉的GA呢,就作为交易费用发送给矿工啊,这就是整个以太坊的状态转换函数,大家可以看到这六步啊,这个我觉得大家还是应该把它就是弄的比较清楚,对整个EVM的这种,就它处理交易的过程就会非常的清晰了。
24:18
好啊,他他这里把这个列出来了啊啊,当然这个跟我们刚才看到的上面的那个代码有点不一样,大家看一下啊,这个他假设合约的代码如下。这个代码这个大家看的清楚对吧,它是if self.storage那这应该就是啊,这当然是个伪代码啊,就是说self,那应该是调用的这个账户了,账户的storage。它的存储空间。存储空间后面加方括号,那就是要去寻址了,里边给一个给一个角标,给一个index,对吧?这个index是什么呢?Call data load0,也就是说传过来的那个DATA0的位置的那个数。
25:06
作为一个in index作为寻指的一个下角标,对吧,把传过来的那个零零位置的那个东西靠作为这里的这个角标,然后他去找在我们的这个存储空间里边这个角标有没有东西呢。非if非,那就是说如果说它里面没东西零初始化都是零对吧,没存过那就是零,如果没有的话,我就把这个东西做个赋值,把什么赋给他呢。Call data load的32。那这个是什么意思,我们看一下啊,它下面这个。这个有解释,大家看一下。呃,需要注意的是,在现实当中的合约代码是用底层这个EVM代码写成的,也就是自检码写成的,对吧?啊,这肯定不是这样的代码的,上面的合约这是用,呃,用高级语言这个S语言写的啊,这个是另外一种语言了,它可以被编译成EVM代码,可以编译成字节码,呃,这就是我们平常用的是solidity,如果大家要是想用别的语言的话,其实也有很多很多别的高级语言可以用。当然了,它的。
26:21
对这个EVM的支持上面来讲,目前为止应该还是扫是最好的,也是就是应用最广泛的,所以就这也是官方推荐大家以太网上开发用solidity,所以我们只给大家讲solidity。大家看一下它这个什么意思啊,假设合约存储器开始是空的,也就是说这个storage里边这个东西。调用的这个位置是是零是空的,那么一个值为十以态,GA是2000GAS price是0.0011态,并且还要发送64个字节的数据啊,它这个写的有点就是这是翻译的问题啊,但大家应该知道他这说的是什么吧,就是说我现在。
27:11
是要发送这样一个交易,这个交易有有哪些组成呢?首先它的value是十个以态。Guess是2000。GA GA price 0.001以态啊,这当然都不是我们实际的这种状态啊,实际可能发0.01以态这么大的GA price,然后它还有data data是64个字节的数据。那第一个32个字节,呃,它这个这这是应该是一个打印错误啊,第一个32字节就是它64个字节的数据呢,分成两部分,那大家可以想到它的数据结构应该就是BEST32对吧?BEST32前面一个参数,后面一个参数,前32个字节,BEST32代表什么呢?代表一个号码二,也就是我们所说的群指的那个角标对吧?后面一个代表呃差理,这就是前面所说的这个你要存什么的数据,这是真正的数据,相当于就是我们的调用合约时候给的参数,一个是二,一个是差力。
28:18
这个作为64个字节的data传到这个交易里边,发送这个交易,但这样一个交易发送之后,状态转这个转转换函数是怎么处理的呢?首先第一步校验交易是否有效,格式是否正确,这就是上面第一步对吧?第二步大家还记得是做什么吗?先算交易费用先扣。预预留的那些盖对吧,先把那个盖扣掉好,那么我们看检查他这里给的那个盖是2000。GA price0.001,所以先算一下,那一共你这笔交易费两个一台好贵啊,就是这就是你预预设的对吧,设好的GA price和GA,那我就先得把这个扣掉。
29:08
那我得先检验你要发的话,你有没有两个以态,如果有的话先扣掉再说,然后第三步,那就是要消耗该死。从指定的GA start start ga2000开始,假如说这个交易啊,他这里就直接假设了啊,是170个字节,然后他假定了这个设设设定好的这个每个字节消耗盖是五,那170个就消耗850,对吧。所以要消耗的盖总共是八百五还剩2000减去八百五还剩1150,这是他第三步em就会算这个你还剩多少GA,那如果这里如果要是GA就消耗out GA的话,那肯定就报错了,对吧?好,接下来第四步。那就是状态转状态转移对吧,整个账户就会就会去变化了,从发送者账户减十个,合约账户增加十个,那这个就是非常简单的,因为前面给了value是十嘛。
30:10
好,那最后第五,呃,这不是最后啊,就是第五步,因为我们调用的是就是to的地址,是一个合约地址。检EVM检测到它有代码,那么就会调用代码,那在这个合约里边代码就是这样了,就是它就是会检测,检查一下这个位置,我们传进来的这个贝塔零,就是靠贝塔的这个零的这个位置开始的这个字节,那其实就是我们传的那个二,对吧,前32位传的这个二。那这个位置storage的这个位置到底有没有数呢?没有数的话就执行下面这一句,那这一句这里为什么又是考32呢?那就是第二个字节了,对吧?呃,不是第二个字节啊,就是第二个32位字了,第二个BY32。
31:01
所以第二个字是什么呢?就是差力。那就是把差理付给storage的二这个位置,所以它其实就是做这个位置对吧?呃,那那大家可以看到,就是注意到他未被使用,就是看到,因为这里边确实是零,那他没没有被使用,就把差理付给他。假如这里又消耗了187。那么剩余的该还得减。前面的110 1150再减187,剩963,如果这里要是又不够的话,那就又是auTo Ga抛出异常,然后回滚啊,最后一步他这个排版啊,最后一步向发送者的账户,那大家会发现就是你已经消耗掉了这么多盖,最后还留下963个盖盖。那剩余的要返回给发送者对吧,消耗不完的再再找另找回去,所以乘以它的PRICE963乘以0.963个以态。
32:05
在。把这个加回到发送者的账户余额里面去,那整个这个过程就就返回到最终状态,这就完成了,那如果说合约没有合约接受交易的话,就假如说我们调用的这个合约地址没有。是一个就是所有的这个这个这个这个前面我们说的这些,那其实就不需要了,就是不需要再去消耗这个合约的,合约里面执行的盖了。那所有的交易费用就是GA price乘以字节长度,就每个交易交易的这个字节长度交易的数据,这里给的这个贝塔二和查理,那就跟。交易费用就没关系了,因为这个合约都不可用吧,呃,另外这里就是还有一个说的需要注意的是合约发起的消息可以对他们产生的计算。分配该的配额,这是什么意思呢?就是说合约里边,我们在合约里边不是可以去send一个消息吗?Send的时候可以指定guess,大家还记得吗?我们其实是在那个时候可以指定guess,那个是什么意思呢?就是说我去在合约里边调另外一个合约的时候,我指定就这么多盖,你如果到另外一个合约里面执行。
33:27
好,这个盖消耗完了,那就算了,那个合约我就不执行了,就返回,就是返回到我发出这个消息之前的状态啊,这是就是合约互相调,调用的时候也有盖的这个消耗啊,盖的状态,所以呢,就像交易一样,合约也可以通过对他的这个子计算设置限制,来保护他自己的计算资源,就是因为我的合约有可能还要调一个别人的合约,那这个时候有可能我本身的计算并不耗多少资源,结果呢,掉了一个别人的合约,他那有一个非常复杂的计算,或者说非常复杂的一个循环,把我这边的GA盖盖全给消耗尽了,那这个肯定是就是我认为是不合理的,我要保护我这边能正常执行,所以我可能会给我这边的调用再设置一个盖,这就是盖这部分的内容。
我来说两句