Solidity

警告:應盡可能避免使用低級“呼叫”

  • July 20, 2021

我正在編寫自己的智能合約,我想從已經部署的合約中呼叫一個函式。我的程式碼片段:

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);
   }
}

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