如何在solidity中使用address.call{}()
我在這里和其他幾個地方看到,將乙太幣從合約發送到地址的正確方法是呼叫該
.call{}()
方法。然後在這裡我看到了與參數一起使用的方法。像這樣:
addr.call{value: msg.value, gas: 5000}( abi.encodeWithSignature("foo(string,uint256)", "call foo", 123) );
我了解花括號中的參數。
value:
是您要發送的 eth,gas:
是您願意為要開采的交易支付的 gas 量。(如果我錯了,請糾正我)。我不明白的是括號中的論點。
- 合約中的 abi 對像是什麼,它有什麼作用?和你編譯契約時得到的一樣嗎?
- abi.encodeWithSignature()` 方法有什麼作用?
- 括號可以接受多少個參數,它們是什麼意思?您是否必須為其提供論據,還是可以將其留空?
經過一番研究,我終於有了問題的答案。
1.合約裡面的abi對像是什麼,它有什麼作用?和你編譯契約時得到的一樣嗎?
合約應用二進制介面 (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()
方法,則應傳遞一個空字元串,否則編譯器將拋出錯誤。