神刀安全网

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

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

有了上一节的群知识,我们开始定义状态迁移函数的具体操作,首先是定义群G1的点元素获取的方式,公式1到5都是为了说明如果前32字节和后32字节不为0,则他们是G1群的点的坐标值。

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

公式6到11同样的道理,只是这个将128个字节分成四段,分别表示G2群内复数形式的点的坐标。

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

公式12定义了零知识验证版本的消息调用的状态迁移函数,在这个函数中如果公式14成立,则结果是一个空的账号,公式14的意思是,输入数据的长度不是192的整数倍,或者在公式15的情况下,属于G1的子集a中存在一个空的数据aj或者属于G2的子集b中存在一个空的数据bj。公式15表示输入数据Id对于192整数倍数,公式16直接给出了本次运行需要消耗的gas的数量。公式17是输出结果的定义,如果公式20成立,并且公式14不成立,公式21表示的是公式14的反结果,即不成立,那么输出结果就是一个32字节长的字节序,最后一位是1,否则就是0,也就是说公式17表示的是公式14在不成立的情况下的处理逻辑和输出结果。但是不管是否有输出数据成功返回,gas的消耗是没有变化的,也就是说这个是固定的。公式24表示对一种在Gt域内满足的某一条件的判断,如果满足则验证通过,这一验证在以太坊的操作中的含义完全依赖于公式24到28表示的子集a,b数据的意义,也就是说如果a,b子集表示的是一种转账的收款方和付款方的转账额度,那么公式24表示在无需知道收款方和付款方的具体额度的情况下,验证转账的有效性,注意我说的是如果。在此白皮书中,并没有对G1的子集a和G2的子集b做深入的定义,这个作为一个遗留问题,在从头开始学习椭圆曲线和双线性映射之后,再回过头来做一次解释。看来需要学习的东西还很多。公式24到28指的是将输入数,每32字节分赋值给a,b两个子集的元素。

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

公式29定义了第七种函数,这个函数也是在群定义的基础上。公式30表示如果x,y均为空值,那么这个操作的结果就是一个空的账号。公式34,35,36定义了如何得到输入数据,即将128个字节平分,每一部分代表了椭圆曲线上的一个点,一个点有2个32字节序数据组成。公式31直接定义了次运行需要消耗的gas值,公式32是将 椭圆曲线上的两个点进行加运算之后再进行公式33运算,这个运算符号在整个黄皮书都没有定义,我已经发邮件给以太坊创始人,但是我估计他不会回复我:

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

我简单的理解,应该是在椭圆曲线的另一个值,即x不变,y取负值。如下图。

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

但是我并没通过代码来证明这个公式33的真正含义,在源码中表示仍然是普通的群的加法运算:

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

下图讲解的是最后一个函数运算,是在群G1下的乘法运算:

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

其中公式39直接给出了需要消耗的gas数量,公式40给出了输出结果的定义,同样的问题,这个函数符号在白皮书和代码中并没有并且的提现,公式41和42表示了如何通过输入数据获取参与运算的参数。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 以太坊技术黄皮书学习笔记17:预编译合约4

分享到:更多 ()