Solidity

使用它的雜湊從另一個合約執行合約函式

  • April 30, 2018

我在玩智能合約。我有 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 編碼。它適用於其他類型,例如uintor bool

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