Evm

無法在 EVM 中重現 Keccak256 “hello world”雜湊

  • December 14, 2017

我的玩具程序包含以下幾行:

(seq
 (def 'hash 0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad)
 (def 'result 0x0aef6cc8d178ff0f7950a7d02a6f9061ede19bc359fb1f777e7f20a5c729bf77)
 (lit 0 "\x19Ethereum Signed Message:\n32")
 (mstore 28 hash)
 (if (eq (sha3 0 60) result) (stop) (invalid)))

hash是從輸出web3.sha3("hello world")

result是從輸出web3.sha3(web3.toHex("\x19Ethereum Signed Message:\n32")+"47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad")

為什麼這個程序評估為無效?如果我刪除簽名的消息前綴並只比較它的雜湊值,hello world那麼它就可以工作。

這裡有幾個問題。

(1) LLL 不理解字元串語法。它將“\x19”解釋為文字 4 字節而不是單字節 0x19。與“\n”相同,它的目的是 0x0a。除了直接使用mstore8.

(2)計算時需要{encoding: 'hex'}選擇。web3.sha3``result

> web3.sha3(web3.toHex("\x19Ethereum Signed Message:\n32")+"47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad", {encoding: 'hex'})
"0x93100cc9477ba6522a2d7d5e83d0e075b167224ed8aa0c5860cfd47fa9f22797"    

以下是笨重的,但它似乎工作。

(seq
 (def 'hash 0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad)
 (def 'result 0x93100cc9477ba6522a2d7d5e83d0e075b167224ed8aa0c5860cfd47fa9f22797)
 (mstore8 0 0x19)  ; the "\0x19"
 (lit 1 "Ethereum Signed Message:")
 (mstore8 25 0x0a) ; the "\n"
 (lit 26 "32")
 (mstore 28 hash)
 (if (eq (sha3 0 60) result) (stop) (invalid)))

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