00:00
再说一下这个指令集D的指令集呢,它它里边针对的这一个操作的单元全都是256位子。就是它的操作单元就是256位的,所以这是它的一个基本的单位,这就有点像,呃,我们说这个我们的操作系统是32位还是64位一样,对吧?他去寻址的时候拿到的那个字到底是多大,因为M里面它直接就是256位,所以它针对的似乎就是要处理大大规模的存储,对吧?所以这个特点也会造成就是有些时候可能它就会有一些这种就是存储上的浪费,所以这也是涉及到我们。在后面,如果要是智能合约有一些优化的空间的话,我们怎么样去处理这些内存的消耗?呃,基本常用的一些算术的操作啊,或者是位运算,逻辑运算,还有一些比较的运算。
01:00
这都是em的指令集可以做到的事情,这就是常规的,常规的只要是一个计算机系统肯定都可以做这些,对吧?呃,另外就是条有条件和无条件的跳转,EVM也都是可以直接做到的,这都是常规的东西。呃,最后就是合约可以访问当前区块的一个相关的属性,比如说它的块高度和时间戳,这就是呃,比较。特殊的一些地方了,因为它是一个区块链系统嘛,所以除了我们常规的电脑系统,它的指令集能做的事情之外,还能够做一些特殊的操作,就是访问我们区块链这样的相关属性。主要的就是块高度和时间戳。呃,接下来我们再看一下消息调用相关的东西,消息调用呢,呃,这其实是已经已经就是规定到我们的那个交易和。合约之间的那种互相之间的消息调用了,大家可以看到合约如果要是想要调用其他的合约的话,那一定是要发起一个消息的。
02:10
它它合约发出来的不叫交易,我们叫他消息嘛,所以这种方式就是我们所说的消息调用,它在它的内部的消息调用里边,它可以决定剩下的就是调到我现在的我我自己的这个合约,调到我这一步,它可以决定我剩下的guess。在下一步我调别人的时候,发多少可留多少,这个是合约内部可以去设置,在这里给大家提一句,就是合约是有这个功能的,因为我们知道guess不是一步一步消耗的嘛,那消耗到。之前的这个合约的时候,肯定是已经消耗掉一部分了,那接下来我这个合约又要调别的合约的时候,那怎么办呢?我可以去设置给他发送的合约,如果不设的话,当然就是剩下的所有的都会都会先发过去,所有的盖子都会发过去。
03:05
如果在内部消息调用发生我们的GA用完燃料耗尽的状况,AuTo Ga异常了,呃,那这个时候呢,就会有一个被压入站顶的错误指指明。我们知道就是整个消息的调用,它都是会有一个就是站里边的一个机制来保证它的调用顺序的吧,所以说出错的时候也是会有一个错误被压到站顶,那这个时候呢,只有是内部消息调用一起发送的GA会被消耗掉。如果要是前面我截留了一部分,还有一部分没有被消耗的话,那那一部分是不会扣的,那那个时候就相当于还会还会返回给到用户账户里面去。呃,最后再说一类很特殊的消息调用啊,有一类调用叫做委托调用。委托调用是什么意思呢?这个会比较奇怪,就是说消息调用,我们知道是在合约内部,一个合约要调另外一个合约,那他们互相之间的调用呢?如果是,呃,比方说我现在这个合约A调到合约B的时候。
04:17
B里边如果要去获取我们转币的,不是转币的时候,不是写了一个messages.sand sander嘛,对吧,MSG.thunder他指代的不是我们发起这笔交易的那个人的地址嘛。如果说A合约又掉了一个B合约。B合约里边写messenger ther的时候,这个TH指的是A合约,对他指的是他的消息,消息的发送者。所以这可能会就会导致有一点问题,就是我们在某种情况下可能要求你的地合约,你不要获取我这边的消息,我只是要操作同一同样的那个就是调用者那发起人的那个状态而已,你不要拿我这边合约的地址,所以为了解决这个问题,就有了一个委托调用。
05:12
在这种调用模式下的目标地址代码就是B合约的代码。他就会直接在发起调用的A合约那里上下班去执行,也就是说他如果去写message.value6的话,还跟A合约里边的message点,呃,Ther和value都都一样啊,就是message.ther的话,和A合约里边的ther是一样的。那A合约里边的三应该是谁呢?就是提起交易的那个人对吧?对,所以说B合约里边去执行的时候,还是这这种方式叫做委托调用。那大家想想就是如果实现这样的一个状况之后。那就可以看到,其实这样就把B合约的代码可完全可以独立出来了,对吧,它就不依赖于A合约了,那所以就是不同的合约,不光是A合约,可能别的C合约,B合约也都可以调B合约的代码,而调用他的这些合约根本不会影响到他的行为,他的行为只跟最初发起交易的那个那个人有关,而那个一般就是一个普通用户嘛,所以这样的功能就可以实现我们所说的库了。
06:26
Library,我们就可以把刚才的B合约当成一个po,它的代码就是可复用的,而不是说我A合约调用它的时候,它行为不一样,C合约它就变成另外一种行为了,就不会有这这样的状况,他的逻辑完全是可控的,他会通过委托调用引入B合约的相关的代码。可可能稍微有一点有,有一点难,有一点绕,但大家就是知道这样的概念就可以能理解是最好啊。最后再来说一下,就是合约的创建和自毁。
07:03
就是在EVM里边,它有一个,首先是有有有这个创建了,我们都知道创建的时候会把一个交易发送到零地址上去嘛,呃,那这个发送到零地址上的这个消息调用。呃,发送到零地址上的这个交易,这是一笔交易,是会被EVM特别的去解析的,他一解析到你发送到零地址,他就会认为这是一个创建合约的一个交易,那另外呢,就是在合约内部也可以创建合约,所以在合约内部呢,它可以用new这样的关键字去创建合约,这个时候他发起的也是一个消息调用,这个消息调用就是特殊的叫做create Co。就是创创建调用,那那这样的一个一个调用的消息也会被EVM特殊处理,它的操作和我发送到零地址上的交易是一样的,也是创建一个新的合约,大家可以看到这样的一个一个状态啊,当然它也有区别,就是交易提取的创建性合约的要求,Em是会把它直接写到区块链上永久存储的。
08:17
但是合约去创建一个新的合约的时候,这个不会写到我们的链上,它就是在内存里面,到时候完了之后就销毁掉了,是这样的,另外呢,除了创建,那还有自毁,自毁这个就又又比较可能大家会比较难理解一点,但是其实简单说就是说我们既然可以把它布到区块链上去嘛,那按道理也就可以把它从区块链上删除。那怎么样删除呢?那是有一个特殊的操作,这是这也是合约代码从区块链上能够移除的唯一的一个方式,就是要调用,调用它的自毁操作叫self disru,呃,在之前比较早一些的版本里边,把这个操作叫做suicide,叫叫自杀,但是后来可能觉得这个词不太好啊,就是就是给人的感觉好像会比较负面一点,所以之后就就改了一个名字,就叫成了呃自毁啊,这个这个自毁这个翻译好像也不太好这个词儿,但是它本身你看它的这个英文,对本身是self destruct,就好像是自我解构,呃自自我这个就是对吧,是这样的一个意思,所以说呃,它其实就相当于是我们要把创建的合约从区块链上删掉。
09:40
那这个时候呢,合约账户上剩余的以太币就会发送给指定的目标,然后存储他的storage和他的代码,全部都会从状态当中会被移除掉。呃,这是合约的create和druct这两种比较特殊的操作,这都是EVM里边有对应比较特殊的指令来操处理他们的这些的。好,这一部分就讲完了。
我来说两句