当前位置: 首页 > news >正文

codewars网站2023年8月份新冠症状

codewars网站,2023年8月份新冠症状,无锡网站制作网站建设,中山专业网站制作上篇文章《以太坊交易签名过程源码解析[1]》从源码角度分析了一个合约调用的的签名过程#xff0c;签名后的交易发送到以太坊节点后#xff0c;节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址)#xff0c;进而将交易放入交易池中。本文从go-ethereum源码的出发… 上篇文章《以太坊交易签名过程源码解析[1]》从源码角度分析了一个合约调用的的签名过程签名后的交易发送到以太坊节点后节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址)进而将交易放入交易池中。本文从go-ethereum源码的出发看看如何从签名交易中还原出公钥。一、准备工作我们使用上文中最后得到的签名交易串来进行解析这里我写的解析代码如下所示。package mainimport ( fmt github.com/ethereum/go-ethereum/common/hexutil github.com/ethereum/go-ethereum/core/types github.com/ethereum/go-ethereum/rlp math/big)func main() { // 还原交易对象 encodedTxStr : 0xf889188504a817c800832dc6c09405e56888360ae54acf2a389bab39bd41e3934d2b80a4ee919d50000000000000000000000000000000000000000000000000000000000000007b25a041c4a2eb073e6df89c3f467b3516e9c313590d8d57f7c217fe7e72a7b4a6b8eda05f20a758396a5e681ce1ab4cec749f8560e28c9eb91072ec7a8acc002a11bb1d encodedTx, err : hexutil.Decode(encodedTxStr) if err ! nil { fmt.Println(hexutil.Decode failed: , err.Error()) return } // rlp解码 tx : new(types.Transaction) if err : rlp.DecodeBytes(encodedTx, tx); err ! nil { fmt.Println(rlp.DecodeBytes failed: , err.Error()) return } // chainId为1的EIP155签名器 signer : types.NewEIP155Signer(big.NewInt(1)) // 使用签名器从已签名的交易中还原账户公钥 from, err : types.Sender(signer, tx) if err ! nil { fmt.Println(types.Sender: , err.Error()) return } fmt.Println(from: , from.Hex()) jsonTx, _ : tx.MarshalJSON() fmt.Println(tx: , string(jsonTx))}其中•encodedTxStr是上篇文章得到的具有签名的交易对象的rlp编码•最终还原得到的from值为0xA2088F51Ea1f9BA308F5014150961e5a6E0A4E13正是签名私钥对应的账号地址(私钥单向生成公钥公钥单向生成地址)•签名解析核心使用的是Sender方法二、签名解析types.Sender方法中核心调用了EIP155签名器的Sender方法其源码如下。// go-ethereum/core/types/transaction_signing.gofunc (s EIP155Signer) Sender(tx *Transaction) (common.Address, error) { if !tx.Protected() {//① return HomesteadSigner{}.Sender(tx) } if tx.ChainId().Cmp(s.chainId) ! 0 {//② return common.Address{}, ErrInvalidChainId } //③ V : new(big.Int).Sub(tx.data.V, s.chainIdMul) V.Sub(V, big8) return recoverPlain(s.Hash(tx), tx.data.R, tx.data.S, V, true)}Sender方法中•①首先判断了交易是否是受保护的(是否是EIP155签名器进行的签名)如果不是则使用HomesteadSigner签名器校验•②接着判断了交易中的链ID与签名器的链ID是否一致如果不一致则返回空地址•③根据V的计算方法还原recid为27(37-1*2-8)在recoverPlain方法会按照homestead签名方式继续解析签名。recoverPlain源码如下所示。// go-ethereum/core/types/transaction_signing.gofunc recoverPlain(sighash common.Hash, R, S, Vb *big.Int, homestead bool) (common.Address, error) { if Vb.BitLen() 8 { return common.Address{}, ErrInvalidSig } V : byte(Vb.Uint64() - 27) if !crypto.ValidateSignatureValues(V, R, S, homestead) { return common.Address{}, ErrInvalidSig } // encode the signature in uncompressed format r, s : R.Bytes(), S.Bytes() sig : make([]byte, crypto.SignatureLength) copy(sig[32-len(r):32], r) copy(sig[64-len(s):64], s) sig[64] V //① fmt.Println(sig: , common.Bytes2Hex(sig)) // recover the public key from the signature pub, err : crypto.Ecrecover(sighash[:], sig) //② if err ! nil { return common.Address{}, err } if len(pub) 0 || pub[0] ! 4 { return common.Address{}, errors.New(invalid public key) } fmt.Println(pub: , common.Bytes2Hex(pub)) var addr common.Address copy(addr[:], crypto.Keccak256(pub[1:])[12:])//③ return addr, nil}其中recoverPlain方法的参数分别为•sighash是交易对象tx的rlp编码hex值为0x9ef7f101dae55081553998d52d0ce57c4cf37271f800b70c0863c4a749977ef1与我们上文中需要签名的交易hash是一致的。•Rhex值为41c4a2eb073e6df89c3f467b3516e9c313590d8d57f7c217fe7e72a7b4a6b8ed•S hex值为5f20a758396a5e681ce1ab4cec749f8560e28c9eb91072ec7a8acc002a11bb1d•Vb十进制值为27•bool类型的homestead值为true在recoverPlain方法中•①根据R、S、V拼接得到的signhex值为41c4a2eb073e6df89c3f467b3516e9c313590d8d57f7c217fe7e72a7b4a6b8ed5f20a758396a5e681ce1ab4cec749f8560e28c9eb91072ec7a8acc002a11bb1d00•②调用加密包中的Ecrecover方法根据签名还原公钥该方法会调用secp256k1包中的RecoverPubkey方法。还原得到的公钥hex值为045762d11bad6617b5eef31fefd6aff1391dab0a2380817eaf882874b1d50823b13e4934f923f4b7e6a3d19219e92a04678a8fb7029c2ecf7256672b57a6cb77b0 。•③根据公钥计算账号地址取公钥pub第一位之后的值计算Keccak256然后在取后12位以后得到的账号地址为0xA2088F51Ea1f9BA308F5014150961e5a6E0A4E13至此我们已经从签名中还原出了账号地址(公钥)。如果需要校验签名是否正确可以通过调用secp256k1包中的VerifySignature方法传入公钥、交易hash和签名通过比对R值是否一致进行验证。References[1] 以太坊交易签名过程源码解析: https://learnblockchain.cn/article/1225本文作者六天作者主页https://learnblockchain.cn/people/436
http://www.sadfv.cn/news/287550/

相关文章:

  • 密云区社区建设网站上弘科技网站建设
  • 企业网站建设方案书 备案中国建设协会官网
  • 吉林省 网站建设wordpress 特别慢
  • 查公司信息的网站是哪个网站wordpress 搬家 问题
  • 做网站收费多少济宁融合百度推广公司
  • jsp做网站案例帝国cms个人网站模板
  • 旅店网站建设规划书网站404页面作用
  • 外国的贸易网站saascrm国内免费pdf
  • 网站建设需要注册什么类型的公司广州骏域网站建设专家
  • jquery网站开发南宁网站建设方案报价
  • 宁德城乡建设部网站自己做网站不如帮别人做运营
  • 网站开发方法是什么中国城乡建设厅网站
  • 什么网站能找到做展览的工人做婚庆网站
  • 阿里云网站服务器51网站一起做网店
  • 网站站内交换链接怎么做室内设计公司取名字
  • 上海建企业网站广西远伟网络科技有限公司
  • 樊城网站建设做网站公违法嘛
  • 包头网站建设包头株洲公司网站建设
  • 固镇网站建设哪家好个人网站推广手段有哪些
  • 做网站用什么软件新媒体网络营销的概念
  • 青岛市专业做网站的吗c语言网站
  • 申请个网站网站的建设方案怎么写
  • 邯郸做网站推广找谁包年seo和整站优化
  • 企业网站源码网上海人才网招聘网最新招聘
  • 网站建设基础教学设计电子商务平台管理
  • 网站开发毕设答辩网站源代码怎么上传
  • 晋城做网站的怎样用虚拟空间做网站
  • 网站专业优化公司网站建设的内容有哪些
  • 郑州高新区网站建设安康网站建设
  • 多站点网站群的建设与管理系统营销网站策划方案