Transactions

交易簽名和散列

  • November 23, 2018

我一直在瀏覽 EthereumJ,試圖了解交易散列和簽名是如何工作的。

從程式碼中我可以看出,簽名是通過對 RLP 編碼交易的雜湊進行簽名來創建的。然而,我感到困惑的原因是因為雜湊是從簽名的 r 和 s 值以及其他值生成的。考慮到那些 r 和 s 值還不存在,它們將如何被包括在內?

對程式碼進行更深入的研究看起來像是生成了兩個不同的雜湊值。一個“原始”雜湊,其中 r 和 s 值是簡單的空字節數組,這是經過簽名的雜湊,然後是一個實際雜湊,其中包括生成的 r 和 s 值。

這種理解正確嗎?為什麼要在簽名過程中包含簽名?例如,為什麼簽名不簡單地對交易的非簽名元素的雜湊進行簽名?為什麼“原始”雜湊包含 vr 和 s 值(即使 r 和 s 為空)?

r, s 具有空字節數組的 RLP 編碼交易是原始散列原像。通過 EIP155,在 v 欄位中添加了一個值,以保護簽名免受重放攻擊,這意味著乙太經典區塊鏈上的簽名對於乙太坊區塊鏈上的同一交易也無效。因此,v 欄位有雙重用途:防止重放攻擊並啟用從簽名中恢復公鑰,如此處所述

通過 EIP155,雜湊原像被更改為包含鏈 ID(防止對其他乙太坊分叉/測試網的重放攻擊)和零值(在 RLP 中編碼為 80),作為臨時 r、s 值。一旦計算出簽名,來自簽名的 r、s 值以及恢復位將被插入到最終交易十六進制中,從而創建簽名交易。

我很難回答為什麼EIP155 將雜湊原像從無 r,s 欄位更改為空 r,s 欄位。該規範沒有解釋為什麼要進行此更改。

在 EIP155 之前,簽名是:

ECDSA_secp256k1(private_key, Keccak256(RLP(nonce, gasPrice, gasLimit, To, Value, Data)))

使用 EIP155,簽名為:

ECDSA_secp256k1(private_key, Keccak256(RLP(nonce, gasPrice, gasLimit, To, Value, Data, v, r, s))),

其中 r, s 是列表的 RLP 編碼

$$ 0x00 $$. 這被編碼為 0x80。 網路接受這兩種簽名。

交易 ID (TXID) 是根據簽名的交易計算得出的。因此,如果您在程式碼中看到根據包含簽名的內容計算出的雜湊值,這就是 TXID。

引用自:https://ethereum.stackexchange.com/questions/50635