EIP-191:签名数据标准
ERC提出了一个如何处理以太坊合约中签名数据的规范
原因:
当前市场上的若干多签钱包允许接受“预签名(presigned)”的交易。预签名数据是一个二进制的数据块(signed_data),同时还有签名信息(r,s,v)。而signed_data的解释没有被明确的定义,因此导致了如下问题:
① 标准以太坊交易可以以signed_data的形式提交。
一个以太坊交易可以被解压成RLPdata(RLP<nonce, gasPrice, startGas, to, value, data>),r,s,v。如果对于signed_data没有语法约束,这意味着RLPdata可以被当作一个有语法效力的“预签名”交易。
(RLP:一种序列化的方式,其与网络传输中json的序列化/反序列化有一些不同,RLP不仅兼顾网络传输,其编码特性更确保了编码后的一致性,因为每笔交易过程中要进行Keccak256,如果不能保证编码后的一致性,会导致其Hash值不同,那么验证者就无法验证交易是否由同一个人发出。)
②多重签名钱包还存在一个问题,即预签名交易没有绑定到特定的验证器(或验证者),即特定的钱包。例子:
1)用户A、B和C拥有2/3钱包X
2)用户A、B和D拥有2/3钱包Y
3)用户A和用户B向X提交指定的事务。
4)攻击者现在可以重用他们设计的事务到X,并提交到Y。
规范:
提出了以下的signed_data格式:
0x19 <1 byte version> <version specific data*> <data to sign*>.
前面的0x19是为了使该signed_data不是有效的RLP。
这意味着任何signed_data都不能是一个RLP结构,而是一个1字节的RLP有效负载,后面跟着其他内容。因此,任何EIP-191的signed_data都不可能是以太坊交易。
此外,之所以选择0x19,是因为从ethereum/go-ethereum#2940开始,在personal_sign中哈希之前会添加以下内容: “\x19Ethereum Signed Message:\n” + len(message)。因此,使用0x19可以通过更改版本0x45 (E)来扩展该方案,以处理这类签名。
版本字节注册表
Version 0x00
0x19 <0x00>
版本0x00对于特定版本的数据具有 。在多签钱包根据传递的签名执行的情况下,validator地址是多签钱包本身的地址。要签名的数据可以是任意数据。
Version 0x01
The version 0x01 is for structured data as defined in EIP-712
Version 0x45(E)
0x19 <0x45 (E)> <thereum Signed Message:\n" + len(message)>
版本0x45 (E)有<thereum Signed Message:\n" + len(Message)>作为特定版本的数据。要签名的数据可以是任意数据。
Example:
Version 0x00
function signatureBasedExecution(address target, uint256 nonce, bytes memory payload, uint8 v, bytes32 r, bytes32 s) public payable {
// Arguments when calculating hash to validate
// 1: byte(0x19) - the initial 0x19 byte 定义
// 2: byte(0) - the version byte 版本号
// 3: address(this) - the validator address 验证者地址
// 4-6 : Application specific data 特定数据
bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), address(this), msg.value, nonce, payload));
// recovering the signer from the hash and the signature
addressRecovered = ecrecover(hash, v, r, s);
// logic of the wallet
// if (addressRecovered == owner) executeOnTarget(target, payload);}
资料来源:https://eips.ethereum.org/EIPS/eip-191
EIP-191:签名数据标准相关推荐
- 以太坊签名验签原理全面解析
目录 签名三大作用 签名基础 不可逆计算 陷门函数 ECDSA 签名过程 ECDSA 验签过程 恢复标识符("v") 签署交易 关键词解读 EIP 191 EIP 712 ERC ...
- PHP如何验证以太坊签名
以太坊有一个非常强大的JavaScript生态系统.有一些很棒的开源项目,比如ethereumjs-util,它提供了一个用以太坊帐户签名的即插即用功能. JavaScript的一个缺点是,在许多领域 ...
- 以太坊钱包开发系列3 - 展示钱包信息及发起签名交易
最新内容会更新在主站深入浅出区块链社区 原文链接:使用 ethers.js 开发以太坊 Web 钱包 3 - 展示钱包信息及发起签名交易) 以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际 ...
- secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性. ## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain. ...
- PHP与Unicode签名(BOM)
在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题: 1. 页面显示一个"锘"字,其他一片空白: 2. 不能登入或者不能登出: 3. 页顶出现一条空白: ...
- RFC7515- JSON Web Signature (JWS)(JSON Web签名)
RFC7515- JSON Web Signature (JWS) 目录 摘要(Abstract) 1. 简介(Introduction) 1.1 符号约定(Notational Convention ...
- Delphi 编写数字签名验证并获取签名信息
[摘要]本文介绍Delphi 编写数字签名验证并获取签名信息,并提供详细的示例代码供参考. 一个客户想通过编程实现验证程序自身的数字签名来确保程序的完整性,防范病毒感染以及防止一些无聊人士的修改(通过 ...
- Debug签名时候数据正常正式签名的时候数据不正常,不显示,或者数据错乱问题
转载至:https://blog.csdn.net/wzy901213/article/details/82877858 最近,给自己的项目加上了代码混淆,在构建打包安装阶段没有任何问题,但是运行在手 ...
- php 签名 bom,PHP与Unicode签名(BOM,Byte Order Mark)
在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题: 1. 页面显示一个"锘"字,其他一片空白: 2. 不能登入或者不能登出: 3. 页顶出现一条空白: ...
最新文章
- 移动端实现文字轮播_使用原生JS实现移动端图片轮播效果(一)
- COM线程模型的行为
- 《漫画算法2》源码整理-2 图算法
- websecurity连接mysql_将MySQL连接器JAR放在我的WAR的WEB-INF / lib而不是tomcat lib中,使j_security_check失败...
- kubernetes 客户端KubeClient使用及常用api
- unix入门经典_程序员大神们的经典编程语录
- flask.Config(root_path, defaults=None)
- [BZOJ4300]绝世好题
- 山东大学项目实训开发日志一——基于vue+springboot的医院耗材管理系统
- RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
- 两条平滑曲线相乘_圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用...
- CAD转换PDF格式,文字模糊不显示
- 怎样看开源代码版权_版权声明在开源代码中泛滥成灾
- 左手招新,右手裁员,2019开年就业形势扑朔迷离
- 安卓开发——Intent跳转地图应用(百度地图、高德地图)
- 七绝高手都有哪些?中国历史上10大七言绝句诗人排行榜
- 启动虚拟机sd 0:0:0:0: [sda] Assuming drive cache: write through错误解决 本人实测!
- MIUI13来了,米粉们还期待吗?
- 非编码区单核苷酸变异
- 计算机网络(五)——网络互联