Testing

測試 sha256(abi.encodePacked(_argument))

  • July 24, 2019

當嘗試測試使用的智能合約時

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)) ?

最好的祝福

首先你需要知道sha256keccak256功能是不一樣的。檢查文件以查看可用功能。

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(...)

abi.encodePacked(...) returns (bytes memory):對給定參數執行打包編碼。請注意,打包編碼可能不明確!

您可以對其進行測試,但使用一個參數,如果您不使用abi.encodePacked(...).

編輯

來自文件:

如果您同時使用keccak256(abi.encodePacked(a, b))andab 是動態類型,則很容易通過移動 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

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