Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

<h2 id="目录">目录

  • 前序
  • 数据签名
    • 整体流程
    • 非对称加密
    • RLP 序列化
  • 数据验证
  • 数据篡改

方法sendrawtransaction">方法sendRawtransaction

sendRawtransaction 函数的各个入参:

  • from 发送者钱包地址
  • value 数值,为与 decimal 的乘积
  • gas 油费,非最终真实使用值,真实为 gasUsed
  • gasPrice 油费单价
  • data 附属的数据,可做智能合约函数入参
  • nonce 交易系列号,类似id

它们都将会被 from 所对应的密钥 进行签名而得出三个量:V,S。同时,各个入参依然以原来的可见的形式进入序列化步骤。

还有另外一个叫做 sendtransaction方法,通过分析源码,可以发现 sendtransaction 内部其实会帮助我们根据我们传参的 from 字段到节点的 accountManager 账号管理器中获取from 的密钥,来帮我们进行数据签名,所以,sendtransaction 一般不会用于远程调用,而用于本地调用,因为只有在本地启动节点的时候,才能配置我们解锁的钱包。

所用的签名加密方式是:非对称加密 中的 secp256k1 椭圆曲线算法

它是一类加密方式的统称。具体到某种能实现它的算法有下面几种:

  • RSA
  • secp256k1 (椭圆曲线)
  • ElGamal
  • ...

sendRawtransaction 用到的就是 secp256k1

RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式。RLP的唯一目标就是解决结构体的编码问题;对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数字必须是一个大端字节序的、没有零占位的存储的格式。

签名后,数据将会被发送到 ETH 节点。

对应到以太坊的 sendRawtransaction RPC 接口。

  1. 收到 RLP 序列化的数据后,先进行 RLP 的反序列化
func (s *PublictransactionPoolAPI) SendRawtransaction(...,encodedTx hexutil.bytes) (common.Hash,error) {
    tx := new(types.transaction)
    if err := rlp.DecodeBytes(encodedTx,tX); err != nil { // 反序列化
        return common.Hash{},err
    }
    return submittransaction(ctx,s.b,tX)
}
  1. 数据的基础校验,主要是一些范围限制以及格式限制校验
    • tx.Size() > 32*102
    • tx.Value().Sign() <>
    • pool.currentMaxGas <>
    • ...
  2. 检查签名,所使用的是 secp256k1.RecoverPubkey 方法,secp256k1 本身支持根据签名信息反推公钥

if C.secp256k1_ext_ecdsa_recover(
    context,(*C.uchar)(unsafe.Pointer(&pubkey[0])),sigdata,// 签名
    msgdata) == 0 { // msgdata tx 的 hash 内容
return nil,ErrRecover<a href="http://code.js-code.com/tag/Failed/" target="_blank" class="keywords">Failed</a>

}
<h4 id="数据篡改">3. 数据篡改

因为签名生成的 V R S 是由私钥进行签名的,如果@L_675_14@者只@L_675_14@了外部的值,例如 value本来是要转 10 个 ETH , 被改成转 100 个,等数据传到以太坊的时候,在检查签名的时候,@R_905_10585@不匹配,而抛出错误

大佬总结

以上是大佬教程为你收集整理的以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程全部内容,希望文章能够帮你解决以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: