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

书接上回,第五种情况,稍微有点复杂,我们说过每一种情况的计算公式都是为了计算迁移状态的Gas使用和运算返回结果。下面这一些列复杂的计算,都是为了计算Gas值和输出结果。

首先看公式50,这个表示对于输入数据Id,其第一个32字序列表示是非负整数B的长度,公式51表示非负整数E的长度,公式53表示非负整数M的长度。而公式53,公式54,公式55表示紧随长度字段的具体,B,E,M值。我们一案例来说明:

在此示例中,公式50的值=1,公式51=0x20 =32(10进制),公式52=32

B=3, E=ff…c2e,M=ff2f 。这是都是16进制的表示方式,在已知这些数据的情况下,我们就可以计算输出结果了,公式49就是计算输出结果的方式,即幂运算之后求模运算,其结果域为P8Lm,已知Lm的长度是32,因此结果域为P256.即长度为256比特位的大整数。其中公式61和62是对特殊情况的幂运算和模运算的定义。其运行结果如上图所示为1。需要注意的是,上图表示的示例中,一个字的大小是8个字节,即大整数类型的数据是按照64位系统来表示的,这就是为什么上图中长度M的长度Lm是32,单字符串却有64个字(一个字8比特位)。

已知B,E,M的相关信息之后,我们再来计算本执行函数需要消耗的gas数据。

首先公式37中Max(Le,Lm)的结果很显然是32。根据公式39,符合条件的是公式41,那么f(x)的值是32*32=1024,我们再看公式44,根据E的值来计算一个长度,因为E很大但是Le的值为32, 满足公式46,计算结果是255,即将取2的对数然后再取整数部分。得到这些值之后就可以带入公式37进行运算了

提示:黄皮书的错,文档和代码是不一致的,有兴趣的朋友可以看一下,我认为是黄皮书没有及时更新导致的。

运算结果如下:需要消耗的gas数量为13056Wei

其代码位置如下图所示,有兴趣的同学可以自行学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容