书接上回,第五种情况,稍微有点复杂,我们说过每一种情况的计算公式都是为了计算迁移状态的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
其代码位置如下图所示,有兴趣的同学可以自行学习。
网友评论