Solidity
警告:應盡可能避免使用低級“呼叫”
我正在編寫自己的智能合約,我想從已經部署的合約中呼叫一個函式。我的程式碼片段:
function myFunc(address _contractAddress, address _user, uint _price) onlyOwner { //... some code ... require(_contractAddress.call(bytes4(sha3("func(address, uint256)")), _user, _price)); //... some code ... }
我正在使用混音 IDE。它向我顯示了這個警告:
使用“呼叫”:應盡可能避免使用低級別的“呼叫”。如果返回值處理不當,可能會導致意外行為。請通過指定被呼叫合約的介面來使用直接呼叫。
我應該如何解決這個問題?Delegatecall會產生類似的警告。也許還有其他方法可以呼叫其他合約的功能?
如果您知道呼叫方法,則可以使用抽象合約
contract OtherContract { function otherMethod(address _to, uint _price); } contract MyContract { uint public unitPrice = 100; function myMethod(address _destination, uint _count) { // _destination is a contract that implements OtherContract OtherContract oc = OtherContract(_destination); // call method from other contract oc.otherMethod(address(this), _count * unitPrice); } }
在較新版本的solidity 中,您可以使用抽象合約或介面。
- 抽象合約現在需要
abstract
關鍵字才能正確編譯,以及virtual
函式上的修飾符。- 介面在這裡更適合您的目的,事實上,這就是它們的設計目的。
我很確定介面在低級別上由具有所有外部虛擬功能且沒有內部數據欄位的抽象合約表示。
我的契約.sol:
// SPDX-License-Identifier: Unlicense pragma solidity >0.8.5; abstract contract OtherContract { function otherMethod(address _to, uint _price) external virtual; } interface OtherContractInterface { function otherMethod(address _to, uint _price) external; } contract MyContract { uint public unitPrice = 100; function myMethod(address _destination, uint _count) external { // _destination is a contract that implements OtherContract // this uses the interface. OtherContractInterface oci = OtherContractInterface(_destination); oci.otherMethod(address(this), _count * unitPrice); // this code uses the abstract contract OtherContract oc = OtherContract(_destination); oc.otherMethod(address(this), _count * unitPrice); } }