測試 sha256(abi.encodePacked(_argument))
當嘗試測試使用的智能合約時
sha256(abi.encodePacked(_myargument))
我在松露上沒有得到相同的雜湊值!我都試過了
web3.utils.keccak256('_myargument') web3.utils.sha3('_myargument')
但兩者都給出了與我在智能合約函式中得到的不同的雜湊值。
所以我認為是因為abi.encodePacked,所以我嘗試了
web3.utils.sha3(web3.eth.abi.encodeParameter('string', _myargument))
但雜湊仍然不是預期的。
您知道為什麼以及如何獲得相同的雜湊嗎?我不明白為什麼通常人們在使用 sha256() 散列參數之前使用 abi.encodePacked。如果涉及 abi.encodePacked,是否真的有必要保留它,或者我可以安全地刪除它以僅在智能合約中使用 sha256(_myargument) 而不是 sha256(abi.encodePacked(_myargument)) ?
最好的祝福
首先你需要知道
sha256
和keccak256
功能是不一樣的。檢查文件以查看可用功能。
sha256
(使用 pyhton):>>> sha256("Hello World!").hexdigest() '7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069'
keccak256
(使用 web3):web3.utils.keccak256("Hello World!") '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0'
要獲得相同的雜湊:
contract Hash { function func() external pure returns (bytes32) { return keccak256(abi.encodePacked("Hello World!")) ; } }
輸出:
decoded output { "0": "bytes32: 0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0" }
選擇:
truffle(development)> web3.utils.soliditySha3("Hello World!") '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0' truffle(development)> web3.utils.keccak256("Hello World!") '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0' truffle(development)> web3.utils.sha3("Hello World!") '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0'
abi.encodePacked(...) returns (bytes memory)
:對給定參數執行打包編碼。請注意,打包編碼可能不明確!您可以對其進行測試,但使用一個參數,如果您不使用
abi.encodePacked(...)
.編輯:
來自文件:
如果您同時使用
keccak256(abi.encodePacked(a, b))
anda
和b
是動態類型,則很容易通過移動 in 的部分來在雜湊值中製造衝突,a
反之亦然b
。更具體地說,abi.encodePacked("a", "bc") == abi.encodePacked("ab", "c")
.
abi.encodePacked(...)
對沒有長度的動態類型進行編碼,如果靜態類型短於 32 字節,則不會填充它們。abi.encode(...)
ABI 編碼給定的參數
abi.encode("a", "bc")
結果:0x0000000000000000000000000000000000000000000000000000000000000040 // Start offset for the first parameter ("a") 0x0000000000000000000000000000000000000000000000000000000000000080 // Start offset for the second parameter ("bc") 0x0000000000000000000000000000000000000000000000000000000000000001 // Length of the first parameter ("a") 0x6100000000000000000000000000000000000000000000000000000000000000 // Padded to 32 bytes ("a") UTF-8 encoded 0x0000000000000000000000000000000000000000000000000000000000000002 // Length of the second parameter ("bc") 0x6263000000000000000000000000000000000000000000000000000000000000 // Padded to 32 bytes ("bc") UTF-8 encoded keccak256: 0x68cd083d4c97fcbd081751d5390da5b37f5c485fd0879180d4816c456e8e532c
abi.encode("ab", "c")
結果:0x0000000000000000000000000000000000000000000000000000000000000040 // Start offset for the first parameter ("ab") 0x0000000000000000000000000000000000000000000000000000000000000080 // Start offset for the second parameter ("c") 0x0000000000000000000000000000000000000000000000000000000000000002 // Length of the first parameter ("ab") 0x6162000000000000000000000000000000000000000000000000000000000000 // Padded to 32 bytes ("ab") UTF-8 encoded 0x0000000000000000000000000000000000000000000000000000000000000001 // Length of the second parameter ("c") 0x6300000000000000000000000000000000000000000000000000000000000000 // Padded to 32 bytes ("c") UTF-8 encoded keccak256: 0x8c98d57214b9f76c3240d1fc677eb9fc1529ec2a4f56949bb6abe31d50b4b7c6
abi.encodePacked("a", "bc")
結果:0x61 // ("a") UTF-8 encoded without padding 0x6263 // ("bc") UTF-8 encoded without padding keccak256: 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45
abi.encodePacked("ab", "c")
結果:0x6162 // ("ab") UTF-8 encoded without padding 0x63 // ("c") UTF-8 encoded without padding keccak256: 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45