Solidity
使用它的雜湊從另一個合約執行合約函式
我在玩智能合約。我有 2 份契約:
target
並且executer
(不要介意名稱,它只是測試的東西)。
target
只有一個簡單的函式來改變一個字元串:contract target { string public value = "lol"; event SetValue(string); function setValue(string v) public { value = v; emit SetValue(v); } }
從 開始
executer
,我有一個setValue
使用抽象執行目標的函式和另一個setValue
使用函式雜湊執行的函式。contract target { function setValue(string v) public; } contract executer { target public tc; address public ta; function exeWithAbi(string value) public { tc.setValue(value); } function setAddress(address a) public { tc = target(a); ta = a; } function exeWithoutAbi(string v) public { require(ta.call(bytes4(keccak256("setValue(string)")),v)); }
該功能
exeWithAbi
工作正常,但該功能exeWithoutAbi
無法正常工作。它更改了字元串的值,但將其設置為空(我認為是空字元串)。根據 Remix 提供的資訊(詳細資訊選項卡),我傳遞的字元串 (setValue(string)
) 是正確的(它是正確的函式雜湊)為什麼我的字元串的值沒有正確設置?
使用
abi.encode
應該可以工作,儘管我不是 100% 確定為什麼。(我不明白為什麼這不是ta.call
已經在做的事情。)function exeWithoutAbi(string v) public { require(ta.call(bytes4(keccak256("setValue(string)")), abi.encode(v))); }
它不起作用,因為字元串的編碼方式與 bytes32 不同,因此無法使用該
call
方法,因為您必須自己進行 ABI 編碼。它適用於其他類型,例如uint
orbool
。