Solidity

在 Solidity 合約中儲存硬編碼的呼叫數據

  • November 22, 2021

我一直在嘗試將硬編碼的呼叫儲存在契約中,但我對編碼感到困惑。

假設我有以下字節:

0x9461d6f7000000000000000000000000000000000000000000000000000a796f000000000000000000000000000000000000000000000000000000

這轉化為function testData(uint256 testVar, bytes32 otherVar)使用 10 和“yo”進行呼叫。

如果我將其儲存為這樣的字節:

bytes public hardcodedCallData = "0x9461d6f7000000000000000000000000000000000000000000000000000000000000000a796f000000000000000000000000000000000000000000000000000000000000";

然後做一個address.call(hardcodedCallData),它不起作用。假設它格式錯誤,則會觸發回退功能。當這樣儲存它時,它似乎解碼為看起來不同的字節。

在此處輸入圖像描述

我似乎對這裡的編碼有誤解。給定呼叫數據,我如何將其儲存為硬編碼的字節,這樣我就可以執行上述操作?

我嘗試了變化(例如玩弦樂),但無法弄清楚。

問題是當您使用字元串文字時

bytes public hardcodedCallData = "0x9461d6f7000000000000000000000000000000000000000000000000000000000000000a796f000000000000000000000000000000000000000000000000000000000000";

Solidity 將字元串解釋為 ASCII。事實上,如果你這樣做

"307839343631643666373030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030306137393666303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030"
.decode('hex').encode("ascii")

在 Python 中,您會看到這是您想要的十六進制值的 ASCII 編碼。

你應該使用的是

bytes public hardcodedCallData = hex"9461d6f7000000000000000000000000000000000000000000000000000000000000000a796f000000000000000000000000000000000000000000000000000000000000";

請參閱http://solidity.readthedocs.io/en/develop/types.html?highlight=hex#hexadecimal-literals

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