Solidity
在 Solidity 中解碼原始數據
如果我只有合約呼叫的原始輸入數據,那麼在 Solidity 中將其解碼為可讀形式的最佳方法是什麼?
"[INPUT]":"0x70a08231000000000000000000000000278261c4545d65a81ec449945e83a236666b64f5" "[OUTPUT]":"0x0000000000000000000000000000000000000000000000000000000000000000" "gas":{ "gas_left":5052320 "gas_used":4814 "total_gas_used":4096237 }
我正在這樣做,但我得到一個奇怪的數字,我認為這不是正確的答案:
bytes memory data = '0x70a08231000000000000000000000000278261c4545d65a81ec449945e83a236666b64f5'; (uint num) = abi.decode(data, (uint256)); console.log(num); // 21923419280131834915887268958100430612526877572263439172946489084502927749168
如果我更改
data
為以下內容,我會得到:hex'70a08231000000000000000000000000278261c4545d65a81ec449945e83a236666b64f5' //50942633119752846454219349998365661925661254240480086959931673327308193899062
謝謝!
您必須先刪除前四個字節。合約呼叫的前四個字節是函式選擇器,它指定你要呼叫的函式,在這種情況下是
balanceOf(address)
. 我寫了關於交易數據的更詳細的解釋,你可以在這裡找到。假設您使用的是 Solidity 0.6.0 或更高版本,您可以使用
data[4:]
切掉輸入的前四個字節,或者如果您對數據進行硬編碼,也可以將它們從輸入中刪除。function getBalance(bytes calldata data) public pure returns (uint256 balance) { (balance) = abi.decode(data, (uint256)); } // or function getBalance() public pure returns (uint256 balance) { bytes memory data = hex'000000000000000000000000278261c4545d65a81ec449945e83a236666b64f5'; (balance) = abi.decode(data, (uint256)); }