Solidity

在 Solidity 中解碼原始數據

  • August 13, 2021

如果我只有合約呼叫的原始輸入數據,那麼在 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));
}

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