Solidity

帶有 abi.encodePacked 的 keccak256 在內部如何工作?我得到兩個相互矛盾的結果

  • August 2, 2021

我有兩個 uint256 值 -> 2 和 0

表演時: keccak256(abi.encodePacked(uint(2), uint(0)))

我得到了正確的結果:

0xabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a569

我感到困惑的是,當我嘗試僅在值上使用 keccak256 時: 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000 這是abi.encodePacked(uint(2), uint(0))

在這種情況下,使用 keccak256 我得到:0x608133906c7feb1802e3582d4a7765ca241f9618f3eabaa89a6a14fdea761d9d

我在這裡想念什麼?我希望我會得到相同的結果。

把它們加起來。為什麼我使用函式 A 和 B 得到不同的結果?我需要向 testB 的 keccak256 提供什麼原始值才能獲得與 testA 相同的結果?

function testEncode() public pure returns(bytes memory) {
 return abi.encodePacked(uint(2), uint(0)); 
 // returns 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000
}

function testA() public pure returns(bytes32) {
 return keccak256(abi.encodePacked(uint(2), uint(0)));
 // returns 0xabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a569
}

function testB() public pure returns(bytes32) {
 // abi.encodePacked(uint(2), uint(0)) // 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000
 return keccak256("0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000"); 
 // returns 0x608133906c7feb1802e3582d4a7765ca241f9618f3eabaa89a6a14fdea761d9d
}

我將非常感謝您的幫助。我正在研究這個幾個小時。我只是想了解它在內部是如何工作的。

乾杯,

問題是如何將結果傳遞abi.encodePackedkeccak256函式。keccak256 採用十六進制參數,而不是您在testB().

使用線上工具,我能夠通過在輸入開始時傳遞沒有 0x 的十六進制輸入類型來獲得正確的結果。對於您的情況,這裡只傳遞十六進製而不使用字元串引號(“”)將完成這項工作。

在 testB 中,字元串是 keccak256 的參數,而在 testA 中,十六進製文字是參數。有兩種解決方案:

1-正如@Kaki Master Of Time 提到的,您可以刪除引號(“”)

2-替換為十六進制“0000….0002000….0000”

也許下面的程式碼使這個概念更清楚:

bytes2 a1 = "12"; // fine
bytes2 a2 = "0x1234"; // compile error
bytes2 a3 = "0x"; // fine
bytes2 a4 = hex"1234"; // fine
bytes2 a5 = 0x1234; // fine

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