美文网首页区块链大学程序员区块链研习社
以太坊技术黄皮书学习笔记14:预编译合约1

以太坊技术黄皮书学习笔记14:预编译合约1

作者: 西二旗李老师 | 来源:发表于2018-05-23 23:23 被阅读227次

    我们书接上回,上一节讲到了消息调用的过程中,代码会执行一个状态迁移函数,根据不同的接收地址,给出了不同的状态迁移函数,

    状态迁移函数分了不同的情况,所有的情况在执行前, 需要执行一个通用的状态检验函数,如公式1,如果当前的gas数量少于运行需要的gas数量是,该函数直接返回一个空的账号,否则系统会减去运行需要的gas如公式4所示,以及返回数据如公式5,另外定义输入数据为公式6。此函数执行检查完毕后,如果满足公式3的条件,那么接下来再根据各种情况,运用不同的计算公式,目的都是为了得到函数执行所需要的gas(公式4)和运行的处理结果字符串(公式5)。

    公式7是第一种情况,计算gas使用值很简单,公式8表明,此种情况gas值是固定的3000Wei,至于输出的数据,如果满足条件10,那么数据结果是个空,即结果长度为0,否则的话,数据的长度为32,并且该结果的前11个字节是0,剩下的内容是一个KEC计算结果的12位到31位字节。

    其中条件10里面的用到的各种变量如公式14到20所示,公式15在前面的章节中已经解释过,它是表示消息调用的输入数据,可以看到数据d在超过Id的长度后全部用0补齐。下图是我在以太坊区块链浏览器截取的输入数据示例:

    第二种情况,Gas消耗的数值是固定的60加一个公式23的计算结果,其中公式23表示12乘以一个数值,这个数值是输入数据的长度除以32,然后余数丢弃,只保留整数部分。也就是说这种情况下,Gas使用量与数据的长度是线性关系。

    输出的数据结果就是简单的输入数据的SHA256的计算结果,如公式24所示,这个运算的结果长度也正好是32个字节,如公式25所示。

    第三种情况,gas消耗的计算是固定的600加公式27的计算结果,公式27是120乘以一个数值,这个数值与公式23表示的一样,即输入数据的长度除以32的整数下届。因此gas的使用与输入数据的长度成正比,输入的结果前12个字节为0,剩下的20个字节是函数RIPEMD160的返回值,此函数将输入输入Id计算得到一个长度为20的字节序,如公式31所示。

    第四种情况,GAS的消耗为15加3乘以输入数据的长度除32的下届,与前2个类似,Gas消耗的多少与输入数据的长度成正比,只是情况二,三,四中,线性比例的系数不一样。对于公式32,其输出结果与输入结果相同,如公式35所示。

    相关文章

      网友评论

      • Pillar_Zhong:ECRECOVER的实现v的部分跟黄皮书不一致,应该是没有来得及更新
        r := new(big.Int).SetBytes(input[64:96])
        s := new(big.Int).SetBytes(input[96:128])
        v := input[63] - 27
        // v := new(big.Int).SetBytes(input[32:64]) 按黄皮书的说法
        西二旗李老师:@Pillar_Zhong 哦,我还没看代码
      • _南星_:分析的很到位,加个微信吧
        西二旗李老师:@纽扣man 15801361144 微信号
      • _南星_:大大的赞

      本文标题:以太坊技术黄皮书学习笔记14:预编译合约1

      本文链接:https://www.haomeiwen.com/subject/flzdjftx.html