时间:2023-02-09 14:38 / 来源:未知
然后再使用私钥对哈希结果进行签名得到签名结果(签名结果包含R!开通FXCG原油期货的风险等级:正在利用私钥策动一笔营业的签字实质时,先要对营业构造的联系数据以及链id(chainId)举办哈希,然后再利用私钥对哈希结果举办签字获得签字结果(签字结果包罗R, S, V3个字段)。该哈希值不会被写入区块链里
b)营业哈希的策动:对所有营业构造的所少有据举办哈希。该哈希值(即营业id)会被写入区块链里。咱们平日正在区块链浏览器里通过营业哈希查问一笔营业时利用的即是这个哈希值。
营业建议者利用私钥对营业举办签字,并不是对所有营业直接签字。而是先对营业构造的数据以及链id(chainId)举办哈希策动,然后再利用私钥对哈希结果(也即是一串32字节的字符串,转化为16进制的字符串即是64位的16进制数字符串)举办签字获得签字结果(R, S, V)。
以太坊上界说了Signer这个签字接口,用于对营业举办签字。Signer这个签字接口的整体完毕是3种签字器:
3种签字器中,FrontierSigner是签字器最早完毕的版本,HomesteadSigner是其后完毕的版本,EIP155Signer则是最新的版本,并正在签字的哈希值策动中引入了chainId来防卫跨链践诺攻击。
正在EIP155Signer版本签字器中,节点需求对客户端发送过来的签字结果中的V值举办校验,校验V值中包罗的chainId是否和本节点的chainId比拟较,要是不相似,则以为该笔营业不是本条链上的营业,从而判定该营业犯警。整体可能参考core/types/transaction_signing.go里
需求注视的是,假使是看待统一个哈希值h,每次利用统一个私钥prv对哈希值h举办签字获得的R, S这2个字段不肯定会相通。
下面以利用EIP155Signer版本签字器为例,看看用于签字的哈希值的策动进程:
这里可能看到,用于签字的哈希值的策动,只是把营业的根底输入数据加上chainId举办RLP编码再获取哈希值。根底输入数据蕴涵:AccountNonce(建议者的Nonce),Price(gasPrice),GasLimit,Recipient(接管者),Amount(转账金额),Payload(智能合约联系的实质,要是是凡是转账营业,该字段为空)
该函数先对接口数据举办RLP编码,再利用Keccak256哈希算法得到营业哈希。
RLP编码的端正网上有不少的著作都有先容,这里就不具体先容了。RLP编码的重心是给原始数据前面增加若干字节的前缀,况且这个前缀是和数据的长度联系的。RLP编码后获得的是一个字节数组
可能看出,Hash()函数是对所有营业数据(蕴涵签字后的签字结果,但不蕴涵hash字段。由于hash字段利用了rlp:-,透露rlp编码解码时粗心该字段。hash ,size 和from这3个atomic.Value类型的字段也是不蕴涵的 )举办惩罚,惩罚进程是先对所有营业数据举办RLP编码,再利用Keccak256哈希算法得到营业哈希。看待每一笔营业,其营业哈希都是确定(不需求恭候营业打包进区块链,正在钱包端签字营业后营业哈希就仍旧是可能确定的)和独一的(差别的2笔营业策动出来的营业哈希相通的也许性根本为0)。
正在把持台中,咱们通过移用eth.signTransaction()这个接口就能获取一笔营业的营业哈希,下面输出结果中血色的一面即是营业哈希