以太坊的ecrecover预编译合约

news2025/1/21 15:46:43

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
    在这里插入图片描述

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总的签名和验签流程可以如下图示意:
在这里插入图片描述

1.3 ECDSA的public key recovery

ECDSA也支持public key recovery算法,前提是提前知道签名方的公钥或者公钥hash值,否则有可能恢复出错误的公钥信息。
在这里插入图片描述

以太坊在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界

一、前言 上文我讲到 阿里云-数据仓库-数据分析开发神器-ODPS ,今天我带领大家一起走进神器的成长环境及它的数据世界。 二、 DataWorks是什么 DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎,为数据仓库、数据湖、湖仓一体等…

大数据-压缩与打包

一、gzip命令 1、选项参数 参数作用-c(compress)将压缩的数据输出到标准输出(stdout)上-d(decompress)解压缩-t(test)可以用来检验一个压缩文件的一致性,看看文件有无错…

艾美捷甘油比色测定试剂盒-简单,敏感,高效

艾美捷甘油比色测定试剂盒,利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架,是参与氧化和合成过程的能量代谢的重要中间体。甘油和游离脂肪酸循环水平的测量被认为反映了脂肪分解&#xf…

快应用的优势与劣势对比

2018年,“快应用”标准正式推出。快应用是九大手机厂商基于硬件平台共同推出的新型应用生态。用户无需下载安装,即点即用,享受原生应用的性能体验。 快应用框架深度集成进各厂商手机系统中,可以在操作系统层面实现用户需求与应用…

艾美捷甘油比色测定试剂盒基本参数和相关文献说明

背景: 哺乳动物中,甘油三脂主要储存在脂肪组织中,作为主要的能量储存仓库.当禁食阶段,存储在肝脏和脂肪组织中的甘油三酯被脂肪酶分解形成脂肪酸和甘油. 艾美捷甘油比色测定试剂盒基本参数: 中文名称:甘油…

dpdk中的librte_malloc库

dpdk中的librte_malloc库提供了能够分配任意大小内存的API。 该库的目标是提供类似malloc的函数从hugepage中分配内存,以及帮助应用程序移植。 通常情况下,这种类型的分配不应该在数据平面处理,因为其比基于内存池的分配更慢, …

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了,测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了,或则被反诈中心拦截了,如果遇到该问题,需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…

H5 雪碧图 移动的机器猫

精灵图(英语:Sprite),又被称为雪碧图或拼合图。在计算机图形学中,当一张二维图像 集成进场景中,成为整个显示图像的一部分时,这张图就称为精灵图。 本文中用的就是这张,来自爱给网。…

Python:Flask简介与实践

文章目录简介一、简单使用二、调试模式三、路由四、路径变量五、构造URL六、HTTP方法七、静态文件八、模板生成九、日志输出十、处理请求1. Request 对象十一、文件上传十二、Cookies十三、重定向和错误十四、响应处理十五、Sessions十六、模板简介1. 模板标签2. 继承3. 控制流…

超高精度PID控制器的特殊功能(2)——远程操作软件及其安装使用

摘要:远程控制软件是高级PID调节器随机配备的一种计算机软件,可在计算机上远程进行调节器的所有操作,并还具有过程曲线显示和存储功能。本文主要针对VPC 2021系列超高精度PID控制器,介绍了随机配备的控制软件的安装和一些最基本的…

2022-12-21 Buildroot创建自己的软件包,把一个c应用编译到系统里面去运行

一、Buildroot 编译完成后&#xff0c;会在 /buildroot/output/xxxx/host/ 目录下&#xff0c;生成交叉编译工具&#xff0c;我们可以用来编译目标程序。 1、比如我现在要编译下面的c文件 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[…

分布式是大数据处理的万能药?

前言&#xff1a;分布式是大数据处理的万能药&#xff1f;今天叶秋学长跟大家一起探讨这个问题~ 使用分布式集群来处理大数据是当前的主流&#xff0c;将一个大任务拆分成多个子任务分布到多个节点进行处理通常能获得显著的性能提升。因此&#xff0c;只要发现处理能力不足就可…

人数超员识别系统 yolov5

人数超员识别系统基于计算机视觉分析技术yolov5网络架构对现场画面实时分析&#xff0c;如监测到区域超员时&#xff0c;立刻抓拍存档并告警提示。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0c;使其速度与精度都得到了…

Java日志技术是什么

文章目录日志技术日志技术介绍日志技术体系日志技术 日志技术介绍 想清楚的知道一个系统运行的过程和详情就需要日志记录 日志介绍: 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记…

04---springboot实现增删改查

1、配置文件 application.yml server:port: 8081 spring:mvc:path match:matching-strategy: ant_path_matcherdatasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/management?useUnicodetrue&use…

C++ STL 之关联容器 map 详解

文章目录Part.I AttentionChap.I 注意事项Chap.II 操作技巧Part.II FuncitonPart.III CodeChap.I mapChap.II unordered_mapChap.III multimapPart.I Attention C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的&#xff0c;每一对中的第一个值称之为关键…

博苑股份冲刺创业板上市:上半年净利润约1亿元,李成林为董事长

近日&#xff0c;山东博苑医药化学股份有限公司&#xff08;下称“博苑股份”或“博苑医药”&#xff09;在深圳证券交易所创业板更新招股书。据贝多财经了解&#xff0c;博苑股份于2022年6月17日递交招股书&#xff0c;准备在创业板上市。 本次冲刺创业板上市&#xff0c;博苑…

服务的消费方式和服务熔断

目录 1. 服务消费方式 1.1 RestTemplate 1.2 feign 2. 服务熔断&#xff08;降级&#xff09; 2.1 在微服务架构中服务熔断的必要性 健康的微服务集群&#xff1a; ​编辑 出现故障&#xff1a; ​编辑 系统雪崩&#xff1a; ​编辑 2.2 hystrix 2.3 hystrix的使用…

[Linux]多线程的同步和互斥(线程安全 | 互斥锁 | 死锁 | 条件变量)

文章目录Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口初始化互斥量销毁互斥量互斥量的加锁和解锁互斥量实现原理可重入vs线程安全常见线程不安全情况常见线程安全的情况常见不可重入的情况常见可重入的情况可重入与线程安全的联系可重入与线程安全的区别…

你易忽略的三极管电路问题1:下拉电阻

如下这个三极管共射极驱动电路中&#xff0c;B、E极之间的下拉电阻的作用&#xff1f;是否可以将其去除&#xff1f;该电阻有两个重要的作用&#xff1a;在驱动信号关闭时给三极管基极一个固定的电平。当驱动信号&#xff08;SIGNAL&#xff09;关闭时&#xff0c;若没有下拉电…