ethereum/EIPs-191 Signed Data Standard
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-191.md
eip | title | author | status | type | category | created |
---|---|---|---|---|---|---|
191
|
Signed Data Standard
|
Martin Holst Swende (@holiman), Nick Johnson <arachnid@notdot.net>
|
Draft
|
Standards Track
|
ERC
|
2016-01-20
|
摘要
这个ERC提议了一个关于如何在以太坊合约中处理签名数据的详细说明。
动机
一些接受presigned
交易的多签名钱包应用已经出现了。一笔presigned
交易就是一堆二进制的signed_data
,同时包含签名(r
, s
, v
)。因为对signed_data
的解释并不具体,导致了一些问题:
- 标准的以太坊交易可以作为
signed_data
提交。一笔以太坊交易可以拆解成这几个组件:RLP<nonce, gasPrice, startGas, to, value, data>
(这里被称为RLPdata
),r
,s
,v
。如果对signed_data
没有句法约束,这就意味着RLPdata
可以用作句法有效的presigned
交易。 - 多签名钱包同样也有问题:
presigned
交易并不和一个特定的validator
绑定在一起,举一个特定钱包的例子:i. 用户
A
,B
和C
有2/3
-钱包X
ii. 用户
A
,B
和D
有2/3
-钱包Y
iii. 用户
A
和B
提交了一个presigned
交易给X
iv. 攻击者可以复用他们的给X的
presigned
交易,然后提交给Y
。
说明
我们为signed_data
提议了以下格式:
0x19 <1 byte version> <version specific data> <data to sign>.
版本0
对于版本特定数据有<20字节地址>
,这个地址就是预期的验证者。在多签名钱包的例子中,就是钱包自己的地址。
最初的0x19
字节用来确保signed_data
不是有效的RLP
对于单个值为[0x00, 0x7f]的字节,字节的RLP编码就是它本身
这意味着任何signed_data
不能是一个RLP结构,而是1个字节的RLP
,后面再加上一些别的内容。
因此,任何ERC-191 signed_data
永远不会是一笔以太坊交易。
额外地,之所以用0x19
是因为自从ethereum/go-ethereum#2940,下面的一行文字会在personal_sign
方法中预添加在要签名的hash数据之前:
"\x19Ethereum Signed Message:\n" + len(message).
因此,使用0x19
是为了可以扩展这个模式,通过定义一个版本 0x45
(E
)来处理这种类型的签名。
版本字节登记
Version byte | EIP | Description |
---|---|---|
0x00 |
191 | Data with intended validator |
0x01 |
712 | Structured data |
0x45 |
191 | personal_sign messages |
就是如果版本为0x00,那么后面还会跟着intened validator(address),然后才是data
如果是0x01,那么后面后面跟着的就是结构化数据,什么是结构化数据,看EIP-721
如果是0x45,那么后面后面跟着的就是进行personal_sign
后的信息
ethereum/EIPs-191 Signed Data Standard的更多相关文章
- ethereum/EIPs-1077 Executable Signed Messages
https://github.com/alexvandesande/EIPs/blob/ee2347027e94b93708939f2e448447d030ca2d76/EIPS/eip-1077.m ...
- ethereum/EIPs-712 Ethereum typed structured data hashing and signing
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md eip title author discussions-to status ...
- ethereum/EIPs-1078 Universal login / signup using ENS subdomains
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1078.md eip title author discussions-to status ...
- ethereum/EIPs-1271 smart contract
https://github.com/PhABC/EIPs/blob/is-valid-signature/EIPS/eip-1271.md Standard Signature Validation ...
- ethereum/EIPs-725
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md eip title author discussions-to status ...
- Ethereum White Paper
https://github.com/ethereum/wiki/wiki/White-Paper White Paper EditNew Page James Ray edited this pag ...
- go ethereum源码分析 PartIV Transaction相关
核心数据结构: core.types.transaction.go type Transaction struct { data txdata // caches hash atomic.Value ...
- ethereum/EIPs-1
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md 介绍了什么是EIP等等的详细信息: eip title status type a ...
- solidity return data和revert/require的reason string的获得
前言: 在使用solidity写智能合约的时候,会使用到revert和require来进行断言,比如: require(tokenOwner[tokenId] == 0x0,'this is not ...
随机推荐
- SqlServer主键
*主键 作用:唯一标识表中的一条记录. *特点: 1不能重复的列. 2主键不能为null. *同名时如何处理:王洋(大) 王洋(小) *主键有两种选用策略: 业务主键和逻辑主键. 业务主键是使用有业务 ...
- [PHP] 算法-复制复杂链表的PHP实现
复杂链表的复制: 1.在旧链表中每个结点的后面复制出一个结点,隔代 2.把旧链表的随机指向部分,复制到新添加的结点上 3.把新结点从旧链表中拆分出来成新链表 1. linklist=head whil ...
- ios --键盘监听JYKeyBoardListener
没有前言,就是一个简单的键盘监听,自动调整输入框的位置不被键盘遮挡 .h // // JYKeyBoardListener.h // // Created by JianF.Sun on 17/9/2 ...
- 每个JavaScript工程师都应懂的33个概念
摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:s ...
- oracle数据库相关概念介绍
数据库相关概念介绍: 问题: 数据存储:变量(基本类型,引用类型) 基本类型:少量数据 引用类型:保证数据的完整性 数据源: 声明直接赋值 IO流从硬盘中读取 java在处理数据时,需要从硬盘中读取数 ...
- 使用fiddle处理跨域
认真的用fiddle处理跨域 相信很多前端的同学都或多或少被跨域这个问题烦恼过,网上很多处理的方式其实都是要后端处理, 用fiddle来处理 ,就不必看后端的脸色了,自己安安心心的倒腾接口,何乐而不为 ...
- 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程
前言 Dagger2是现在非常火的一个依赖注入框架,目前由Google维护,在Github上面已经有12K star了.Dagger2的入门门槛其实是比较高的,据了解,目前有很多Android工程师对 ...
- (后端)Java中关于金额大小写的工具类
/** * 金额小数转换成中文大写金额 * * @author Neil Han * */ private static final String UNIT[] = { "万", ...
- Python使用map,reduce高阶函数模拟实现Spark的reduceByKey算子功能
# 使用默认的高阶函数map和reduce import randomdef map_function(arg): # 生成测试数据 return (arg,1) list_map = list(m ...
- Linux主机定期打补丁修复漏洞
1.如图扫描出来的漏洞 不看不知道,一看吓一跳 2.Linux主机如何扫描漏洞 参照:Linux操作系统下查找漏洞的几种必备兵器 3.linux操作系统怎么样打补丁?linux系统升级软件 使用yu ...