以太坊的ecrecover预编译合约

这篇具有很好参考价值的文章主要介绍了以太坊的ecrecover预编译合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 引言

前序博客:

  • ECDSA VS Schnorr signature VS BLS signature

ECDSA,全称为Elliptic curve Digital Signature Algorithm,采用Elliptic curve cryptography来实现的数字签名算法。

公私钥对 ( p k , P ) (pk,P) (pk,P),其中公钥 P = p k × G P=pk\times G P=pk×G G G G为所选椭圆曲线的base point。(elliptic curve base point: a point on the curve that generates a subgroup of large prime order n n n n × G = O n\times G=\mathcal{O} n×G=O, O \mathcal{O} O is the identity element。)

1.1 ECDSA签名

ECDSA对消息 m m m的签名流程为:

  • 1)计算消息 m m m的hash值: e = h a s h ( m ) e=hash(m) e=hash(m)。(hash函数可为SHA-2,输出转换为数值。)
  • 2)若group order n n n的bit length为 L n L_n Ln,则取 e e e值最左侧的 L n L_n Ln bits赋值给 z z z。(注意, z z z值可以比 n n n大,但bit length不能比 n n n的长。)
  • 3)选择随机数 k ∈ R [ 1 , n − 1 ] k\in_R [1,n-1] kR[1,n1]。(注意,不信任一般的随机数生成器,因为不好的RNG有太多的failures和vulnerabilities,可采用RFC6979 根据 p k pk pk m m m来计算deterministic k k k。)(如:2013年8月,安卓Bit0coin钱包因使用了错误的随机数生成器,引起私钥泄露,导致资金损失;2010年12月,索尼PS3游戏机因错误的使用了静态而不是随机的 k k k值,导致其ECDSA私钥泄露。)
  • 4)计算curve point ( x 1 , y 1 ) = k × G (x_1,y_1)=k\times G (x1,y1)=k×G
  • 5)计算 r = x 1 m o d    n r=x_1\mod n r=x1modn,若 r = 0 r=0 r=0,则跳转继续执行步骤3)。
  • 6)计算 s = ( z + r ⋅ p k ) / k m o d    n s=(z+r\cdot pk)/k \mod n s=(z+rpk)/kmodn,若 s = 0 s=0 s=0,则跳转继续执行步骤3)。
  • 7)最终的签名为 ( r , s ) (r,s) (r,s)。(注意, ( r , − s m o d    n ) (r,-s\mod n) (r,smodn)也为有效签名。)
    【根据 BIP-62 以及EIP-2可知,为了解决ECDSA签名的malleability问题,可对签名中的 s s s值进行约束,限定 s s s值不高于曲线order的一半。】

整个ECDSA签名流程中,要求:

  • k k k值应为secret。
  • 不同的签名应选择不同的 k k k值,否则会泄露私钥 p k pk pk
    以太坊的ecrecover预编译合约

1.2 ECDSA验签

对收到的签名 ( r , s ) (r,s) (r,s),采用公钥 P P P进行验签的流程为:

  • 1)验证公钥 P P P不等于identity element O \mathcal{O} O,且为其坐标为valid。
  • 2)验证公钥 P P P lies on the curve。
  • 3)验证公钥 P P P的order为 n n n,即 n × P = O n\times P=\mathcal{O} n×P=O
  • 4)验证签名 ( r , s ) (r,s) (r,s)有效,即满足 r ∈ [ 1 , n − 1 ] , s ∈ [ 1 , n − 1 ] r\in [1,n-1],s\in [1,n-1] r[1,n1],s[1,n1]
  • 5)计算消息 m m m的hash值,所采用的hash函数应与签名时一致。 e = h a s h ( m ) e=hash(m) e=hash(m)
  • 6)取 e e e的最左侧 L n L_n Ln bits赋值给 z z z
  • 7)计算 u 1 = z / s m o d    n , u 2 = r / s m o d    n u_1=z/s\mod n,u_2=r/s\mod n u1=z/smodn,u2=r/smodn
  • 8)计算curve point ( x 1 , y 1 ) = u 1 × G + u 2 × P (x_1,y_1)=u_1\times G+u_2\times P (x1,y1)=u1×G+u2×P。若 ( x 1 , y 1 ) = O (x_1,y_1)=\mathcal{O} (x1,y1)=O,则签名无效。
  • 9)若 r ≡ x 1 ( m o d    n ) r\equiv x_1(\mod n) rx1(modn)成立,则签名有效,否则签名无效。

注意,以上ECDSA验签算法可做如下改进:

  • 只计算一次 1 / s m o d    n 1/s\mod n 1/smodn
  • 使用Shamir’s trick,a sum of two scalar multiplication u 1 × G + u 2 × P u_1\times G+u_2\times P u1×G+u2×P can be calculated faster than two scalar multiplications done independently。(参考2014年论文《The Double-Base Number System in Elliptic Curve Cryptograhy》)

ECDSA总的签名和验签流程可以如下图示意:
以太坊的ecrecover预编译合约

1.3 ECDSA的public key recovery

ECDSA也支持public key recovery算法,前提是提前知道签名方的公钥或者公钥hash值,否则有可能恢复出错误的公钥信息。
以太坊的ecrecover预编译合约

以太坊在0x01地址实现了ecrecover预编译合约,其函数原型为:

function ecrecover(bytes32 hash, bytes8 v, bytes32 r, bytes32 s) returns (address);

ecrecover会返回 根据给定的签名计算ECDSA recovery函数获得的地址address。
solidity合约中的调用示例为:

function recoverSignerFromSignature(uint8 v, bytes32 r, bytes32 s, bytes32 hash) external {
    address signer = ecrecover(hash, v, r, s);
    require(signer != address(0), "ECDSA: invalid signature");
}

在以太坊交易中,最后的65字节为ecdsa签名,依次为:

  • 32字节的 r r r
  • 32字节的 s s s
  • 1字节的 v v v:其中 v v v为recovery identifier。根据以太坊黄皮书可知, v v v的取值范围为27~30(即0x1b~0x1e)。

参考资料

[1] What is ecrecover in Solidity?
[2] Ethereum Virtual Machine (EVM) ECRECOVER PRECOMPILED CONTRACT
[3] Ethereum Digital Signatures
[4] ECRecover and Signature Verification in Ethereum
[5] ECDSA Malleability
[6] Precompiled
[7] ECDSA: Elliptic Curve Signatures文章来源地址https://www.toymoban.com/news/detail-434754.html

到了这里,关于以太坊的ecrecover预编译合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊的账户

    以太坊的账户模式 BTC系统是基于交易的账本,这种模式下,系统中没有显式的记录某个人有多少BTC,只能通过UTXO进行推算。这种模式的好处是你有多少钱,你自己都不一定清楚,但实际中,使用起来较为别扭,跟日常体验不太一样呢:A转给B钱的时候,需要说明币的来源。实

    2024年02月06日
    浏览(31)
  • 以太坊--2.账户是什么---以太坊的指南针学习记录

    以太坊作为一个区块链项目,有区块链的三个基本要素,也有特殊的两个要素。 基本要素 : 一条区块链,完整记录着所有交易。 由数个节点组成的网络。 一个大家公认的共识算法。 特殊要素 : 每个节点都具备智能合约的环境 随每次交易不断变化的世界状态,世界状态指

    2024年01月18日
    浏览(42)
  • 分析:以太坊的合并后经济学

    简介 在9月15日网络升级之后,以太坊从工作量证明(PoW)转换为权益证明(PoS)共识机制,使网络减少了99.95%的碳足迹。 这也意味着,自合并以来,以太坊的日代币供应量已经减少。 本文将研究新的PoS以太坊网络的供需动态,以及其通缩的现实。 合并前 有很多关于以太坊在合并

    2024年02月02日
    浏览(31)
  • 什么是Ethereum以太坊(ETH)?以及以太坊的一些基础知识

    Ethereum以太坊(ETH)是由Vitalik Buterin所创建,一种允许智能合约和去中心化应用程序(dapps)在其网络上运行的加密货币。 以太坊是仅次于比特币的第二大加密货币,它是一个基于区块链的平台,用于创建去中心化应用程序(dapps)。 比特币被设计成一种货币和价值储存手段,而

    2024年02月03日
    浏览(30)
  • 以太坊的节点分类及Geth的几种同步模式

    以太坊数据同步是以节点(peer)作为数据载体存放和传输主要以Header,Body,Reciept组成的数据主体,通过以太坊p2p通信协议管理数据同步事务,最后交给执行器(主动同步会交给Downloader,被动同步会交给Fetcher)执行最后的数据下载任务。 以太坊节点主要有四种类型,分别是

    2023年04月20日
    浏览(65)
  • 《区块链原理与技术》学习笔记(五) ——以太坊的交易、共识机制和数据结构

    《区块链原理与技术》学习笔记 第五部分 5. 以太坊交易 5.1 交易内容 5.2 交易费用 5.3 交易的周期 5.4 交易的执行类型 6. 以太坊的共识机制 6.1 解决以太坊分叉:Ghost协议 6.2 新的共识机制:PoS 7. 以太坊挖矿难度调整 7.1 自适应难度调整 7.2 难度炸弹 8. 数据结构与存储 8.1 区块和

    2024年02月12日
    浏览(34)
  • 以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

    以太坊改进提案(EIP)代表了以太坊区块链内协作进步的顶峰。它们是技术文章或提案,描述对以太坊网络的建议更改或增强。 这些文档经过精心制作,呈现了新的功能、流程或环境,在任何形式的采用或实施之前都需要社区的审查。 至关重要的是要认识到改进提案的概念

    2024年04月11日
    浏览(33)
  • 【智能合约】以太坊合约执行分析

    目录 1. 基本概念 1.2 合约字节码 1.3 合约构造函数 1.4 与合约交互 1.5 Call Data 1.6 程序计数器(Program Counter) 1.7 执行环境(Context) 1.8 OpCode(操作码/EVM指令/助记符) 1.9 Gas消耗 1.10 合约执行过程 2. 过程详解 2.1 关于部署代码 2.2 runtime代码 2.3 最终字节码 2.4 为EVM设计的指令集

    2024年02月02日
    浏览(42)
  • 【ETH】以太坊合约智能合约逆向方案

    技术角度了解区块链 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例

    2024年02月09日
    浏览(28)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包