帶有 abi.encodePacked 的 keccak256 在內部如何工作?我得到兩個相互矛盾的結果
我有兩個 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.encodePacked
給keccak256
函式。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