Solidity

如何在solidity中使用address.call{}()

  • April 11, 2021

我在這里和其他幾個地方看到,將乙太幣從合約發送到地址的正確方法是呼叫該.call{}()方法。

然後在這裡我看到了與參數一起使用的方法。像這樣:

addr.call{value: msg.value, gas: 5000}(
   abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)
);

我了解花括號中的參數。value:是您要發送的 eth,gas:是您願意為要開采的交易支付的 gas 量。(如果我錯了,請糾正我)。

我不明白的是括號中的論點。

  1. 合約中的 abi 對像是什麼,它有什麼作用?和你編譯契約時得到的一樣嗎?
  2. abi.encodeWithSignature()` 方法有什麼作用?
  3. 括號可以接受多少個參數,它們是什麼意思?您是否必須為其提供論據,還是可以將其留空?

經過一番研究,我終於有了問題的答案。

1.合約裡面的abi對像是什麼,它有什麼作用?和你編譯契約時得到的一樣嗎?

根據solidity docs

合約應用二進制介面 (ABI) 是在乙太坊生態系統中與合約互動的標準方式,既可以從區塊鏈外部進行,也可以用於合約間互動。數據根據其類型進行編碼,如本規範中所述。編碼不是自我描述的,因此需要一個模式才能解碼。

所以abi包含encodeWithSignature()方法的對像是乙太坊生態系統中與合約互動的標準方式。

2.abi.encodeWithSignature()方法是做什麼的?

此方法將空字元串或函式簽名作為第一個參數。函式簽名通常是被呼叫合約中的一個函式。雖然當它不是時,solidity 有辦法處理它。當它是被呼叫合約中的一個函式時,該函式在該abi.encodeWithSignature()方法被呼叫時被呼叫。所以在問題的程式碼範例中,被呼叫的合約有一個函式:function foo(string var1, uint256 var2){}每次abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)呼叫呼叫者合約中的方法時都會呼叫它。中的其他兩個參數是在呼叫函式時abi.encodeWithSignature()傳遞給函式的參數。foo()

3. 括號可以接受多少個參數,它們是什麼意思?您是否必須為其提供論據,還是可以將其留空?

呼叫方法中的括號,即:

addr.call{value: msg.value, gas: 5000}(/** I am talking about this bracket*/);

需要一個字節的爭論。因此,如果您不想傳遞該abi.encodeWithSignature()方法,則應傳遞一個空字元串,否則編譯器將拋出錯誤。

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