EIP-191(關於如何在以太坊合約中處理簽名數據的詳細說明)

本文翻譯了官網EIP-191的相關內容。改標準試圖拓展以太坊的簽名規則,爲簽名內容的可讀化提供的重要的基礎。

摘要

這個ERC提議了一個關於如何在以太坊合約中處理簽名數據的詳細說明。git

動機

一些接受presigned交易的多簽名錢包應用已經出現了。一筆presigned交易就是一堆二進制的signed_data,同時包含簽名(r, s, v)。由於對signed_data的解釋並不具體,致使了一些問題:github

  1. 標準的以太坊交易能夠做爲signed_data提交。一筆以太坊交易能夠拆解成這幾個組件:RLP<nonce, gasPrice, startGas, to, value, data>(這裏被稱爲RLPdata),r,s,v。若是對signed_data沒有句法約束,這就意味着RLPdata能夠用做句法有效的presigned交易。
  2. 多簽名錢包一樣也有問題:presigned交易並不和一個特定的validator綁定在一塊兒,舉一個特定錢包的例子:

    i. 用戶A, BC2/3-錢包Xbash

    ii. 用戶A, BD2/3-錢包Yui

    iii. 用戶AB提交了一個presigned交易給Xthis

    iv. 攻擊者能夠複用他們的給X的presigned交易,而後提交給Y編碼

說明

咱們爲signed_data提議瞭如下格式:翻譯

0x19 <1 byte version> <version specific data> <data to sign>.

版本0對於版本特定數據有<20字節地址>,這個地址就是預期的驗證者。在多簽名錢包的例子中,就是錢包本身的地址。code

最初的0x19字節用來確保signed_data不是有效的RLPip

對於單個值爲[0x00, 0x7f]的字節,字節的RLP編碼就是它自己

這意味着任何signed_data不能是一個RLP結構,而是1個字節的RLP,後面再加上一些別的內容。ci

所以,任何ERC-191 signed_data永遠不會是一筆以太坊交易。

額外地,之因此用0x19是由於自從ethereum/go-ethereum#2940,下面的一行文字會在personal_sign方法中預添加在要簽名的hash數據以前:

"\x19Ethereum Signed Message:\n" + len(message).

所以,使用0x19是爲了能夠擴展這個模式,經過定義一個版本 0x45E)來處理這種類型的簽名。

版本字節登記

Version byte EIP Description
0x00 191 Data with intended validator
0x01 712 Structured data
0x45 191 personal_sign messages

舉例

function submitTransactionPreSigned(address destination, uint value, bytes data, uint nonce, uint8 v, bytes32 r, bytes32 s)
    public
    returns (bytes32 transactionHash)
{
    // Arguments when calculating hash to validate
    // 1: byte(0x19) - the initial 0x19 byte
    // 2: byte(0) - the version byte
    // 3: this - the validator address
    // 4-7 : Application specific data
    transactionHash = keccak256(byte(0x19),byte(0),this,destination, value, data, nonce);
    sender = ecrecover(transactionHash, v, r, s);
    // ...
}

}

相關文章
相關標籤/搜索