solidity Dapp 从签名中提取消息签名地址

news2024/9/20 14:30:43

通常, ECDSA(椭圆曲线数字签名算法)包含两个参数, r 和 s. 在以太坊中签名包含第三个参数 v,它可以用于验证哪一个账号的私钥签署了这个消息。 Solidity 提供了一个内建函数 ecrecover 它接受 r, s and v 作为参数并且返回签名这的地址。

我们如何进行测试签名和验签呢;

  1. 签名,在线下使用web3库,对信息进行签名;获取到hash和signature;

  1. 解析signature,提取r,s,v;

  1. 调用,ecrecover 函数,返回签名的地址;

  1. 比较地址是否正确;

1、对消息签名

线下我们使用自己的私钥对消息进行签名,其实就是映射我们对交易进行签名;这里我是用的python的web3库做演示;签名地址为0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E;

从输出信息中我们可以找到信息hash,以及签名;

fromweb3.autoimportw3
frometh_account.messagesimportencode_defunct
#address = 0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E
msg="blockchain"
private_key=b"\xb2\\}\xb3\x1f\xee\xd9\x12''\xbf\t9\xdcv\x9a\x96VK-\xe4\xc4rm\x03[6\xec\xf1\xe5\xb3d"
message=encode_defunct(text=msg)
signed_message=w3.eth.account.sign_message(message,private_key=private_key)
print(signed_message)

输出信息:
SignedMessage(messageHash=HexBytes('0x9d193b650938d0c77baf2b825d0fea75d923a0aaa84221c5fd847a6659a10c9a'), r=11654359695283894998368058620483652058172288253605713014912952658261322451562, s=31697021223068352279943535821783285805623410722626389131972335850026147729781, v=27, signature=HexBytes('0x19c42242a4054fdcf157e3103454f0fd90de5a4a327a0748b19d4bc19c774a6a4613e0d4ca6e80cd54990f8f42310638d1376fb24e1b494beed4df53b2e751751b'))

2、提取签名参数

签名 是由r, s 和 v 是连接在一起组成的,各部分分离出来。实现就仅仅需要一个参数而不是三个参数,我们在 splitSignature 函数里使用 内联汇编 来完成这个工作。

assembly{}为solidity设置的内联汇编语言,用于以一种底层方式访问EVM虚拟机; := 是内联汇编语言语法,且solidity支持return多个返回值,用括号括起来即可;mload()是内联汇编语言中的操作码,类似于封装好的函数直接调用即可,mload(p)表示mem[p...(p+32)];mem[a...b)表示将位置a到位置b的memory字节内容分离出来,add(a,b)表示a+b

    function splitSignature(bytes memory sig) internal purereturns(uint8 v,bytes32 r,bytes32 s){
        require(sig.length== 65);
        assembly{
            r:=mload(add(sig,32))
            s:=mload(add(sig,64))
            v:=byte(0,mload(add(sig,96)))
        }
        return (v,r,s);
    }
 

3、提取签名地址

从椭圆曲线签名中恢复与公钥关联的地址,错误返回零,ecrecover(bytes32 hash,uint8 v,bytes32 r,bytes32 s)returns (address)

    function recoverSigner(bytes32 message,bytes memory sig)internal pure returns(address){
        (uint8v,bytes32 r,bytes32 s) = splitSignature(sig);
        return ecrecover(message,v,r,s);
    }

从recoverSigner的返回值中,我们可以看到返回的地址,就是我签名使用的地址;

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

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

相关文章

Windows使用WinSW实现开机自启动服务

在windwos系统中,有时候需要java的jar开机自启动,或者nginx的开机自启动,或者内网穿透工具(frp)的开机自启动,使用WinSW是一种很好的选择,记录一下使用WinSW实现的方式WinSW开源和下载地址(最新版WinSW v2.…

从0开始学python -14

Python3 字符串 -1 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 Hello World! var2 "Runoob"Python 访问字符串中的值 Python 不支持…

Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户

文章目录诉求相关技术思路展开相关步骤pom配置服务端相关配置文本信息、用户广播处理逻辑前端功能代码功能测试小结诉求 实现页面实时在线文本协同编辑,且显示当前同时编辑文本的用户。 相关技术 Springboot(2.7.0)Websocketjavascript 思路展开 页面展示当前登陆用户页面有…

NANK南卡护眼台灯Pro新品测评:旗舰级护眼,降低80%近视风险!

对于重度熬夜患者来说,对于家居用品是非常偏爱的,而最主要的就是光源问题,护眼台灯的发展迅速,不再局限于简单照明,在写作和办公、绘画的场景都适用,经常在电脑桌上的我,就看到了这款旗舰级专业…

9个 Intellij IDEA中使用Debug调试详解

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 Debug用来追踪代码的运行流…

java数据输入

数据输入1.1数据输入概述1.2 Scanner使用的基本步骤导包创建对象接收数据

Windows内核--任务、进程和线程(2.4)

图片来自: Windows内核原理与实现 Windows内核有"任务"概念吗? 从技术术语来说,Windows内核并没有"任务"。"任务"一般被认为是抽象的需要执行的事情。在不同操作系统上,"任务"所代表的官方名称有所差异。 Linu…

树形表查询

树形表: 情况一:固定层级的树形表: 可以使用表的自连接查询,比如查询两级分类课程 selectone.id one_id,one.name one_name,one.parentid one_parentid,one.orderby one_orderby,one.label one_label,two.id two_id,two.name two_name,two.parentid two_parentid,two.orderby …

系统公告 | MemFire Cloud应用管理全新升级,实时数据库等你来体验~

“超能力”数据库~拿来即用,应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库(表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维),很大地降低开发者的使用门槛。 MemFire …

计算机视觉OpenCv学习系列:第九部分、视频读写

第九部分、视频读写第一节、视频读写处理1.视频标准与格式2.视频读写与函数3.代码练习与测试学习参考第一节、视频读写处理 1.视频标准与格式 视频标准与格式: SD(Standard Definition)标清480PHD(High Definition)高清720P/1080PUHD(Ultra High Definition)超高清…

100 个手把手、掏心窝子IDEA快捷键从入门到精通教程

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 一、构建/编译 Ctrl F9&…

c++函数返回数组类型

c函数返回数组类型 首先,C 不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 方法一:将返回值定义…

完整的Apache+PHP8+MYSQL的配置

1.下载Apache和PHP下载Apache,地址:http://www.apachelounge.com/download/,如下图:将下载的压缩包解压到某个文件夹(比如:D:\software), 将解压后的文件夹重命名为Apache24下载PHP压缩包,地址:…

天云数据入选中国信通院《全球数据库产业图谱(2022)》

6月28日,由中国信息通信研究院(以下简称“中国信通院”)、中国通信标准化协会指导,中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)主办的2022大数据产业峰会在京召开。 大会现场,魏凯…

黑马Pink老师JavaScript新教程上线啦~

今天是你开工的第几天? 是谁在回味假期的美好 是谁一上班就困困困 是谁身在上班心还在春节假 友情提示 再坚持4天,就到周末了 世间长假难有 但周末常在 无论是对于学习人还是打工人来说 周末都太美好了 和周末一样美好的 还有黑马的免费教程 …

11-Alibaba微服务流控组件Sentinel实战上

分布式系统遇到的问题 在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如:商品详情展示服务会依赖商品服务, 价格服务, 商品评论服务. 如图所示: 调用三个依赖服务会共享商品详情服务的线程池. 如果其中的商品评论服务不可用, 就会出现线程池里所有线程…

快来看啊,2023成都Java培训机构排行榜出来啦!

来啦,来啦!我带着2023成都最新Java培训机构排行榜来啦。不知道怎么选择一个好的Java培训机构?停止寻觅,别再犹豫,看我这一篇就够啦!一、成都动力节点动力节点,09年成立,14年来只专注…

C++语法复习笔记-3. C语言陷阱与C++改进

文章目录1.C语言常见语法问题1. 字符问题2.c语言的考虑3.C的思考2.C语言指针和数组问题1.问题表现传入参数会退化为指针2.问题原因3.C解决方案处理二维数组3. c语言移位问题1.问题表现逻辑右移还是算术右移移位操作位数的限制2.问题原因3.C中的解决方案4. C语言强制类型转换问题…

idea如何设置通过鼠标去改变字体的大小,idea如何进行作者署名以及时间显示

目录 一、idea如何设置通过鼠标去改变字体的大小 步骤: 1、缩小字体 2、放大字体 二、idea如何进行作者署名以及时间显示 步骤: 一、idea如何设置通过鼠标去改变字体的大小 步骤: 1、缩小字体 设置settings——>键盘设置keymap——>缩小字…

使用 cat 查看创建的软链接文件,出现 cat: 文件: 符号连接的层数过多

今天在使用 cat 查看创建的软链接文件时,出现了这样一个问题: 出现过程: 1、首先,在当前 home 目录下我有一个 2.txt 文件和 test 文件夹 ; [wqlocalhost ~]$ ls 1.txt 2.txt Desktop Documents Downloads Musi…