Solidity
在 Solidity 合約中儲存硬編碼的呼叫數據
我一直在嘗試將硬編碼的呼叫儲存在契約中,但我對編碼感到困惑。
假設我有以下字節:
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