Evm
無法在 EVM 中重現 Keccak256 “hello world”雜湊
我的玩具程序包含以下幾行:
(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)))