Solidity

如何在同一個合約中同時導入 VRFConsumerBase 和 ChainlinkClient

  • October 11, 2020

我想使用 Chainlink 的兩個功能,一個是 VRF,另一個是發出 API 請求。

所以我將兩個庫一起導入。ChainlinkClient.solVRFConsumerBase.sol

其中有一個介面和一個庫相同,所以我得到這些錯誤……

browser/do-escrow.sol:4:1: DeclarationError: Identifier already declared. import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol"; ^-----------------------------------------------------------------------------------------------------------------------^ browser/LinkTokenInterface.sol:3:1: The previous declaration is here: interface LinkTokenInterface { ^ (Relevant source part starts here and spans across multiple lines).

而另一個……

browser/do-escrow.sol:4:1: DeclarationError: Identifier already declared. import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol"; ^-----------------------------------------------------------------------------------------------------------------------^ browser/SafeMath.sol:16:1: The previous declaration is here: library SafeMath { ^ (Relevant source part starts here and spans across multiple lines).

我嘗試過更改庫的名稱(例如 SafeMath),但它似乎不起作用。

請幫助我正確處理這個問題。謝謝你。

歡迎來到 Stack Exchange Jeevanjot!您需要將合約分成兩個與介面互動的合約。您收到此錯誤的原因是兩個導入也導入了LinkTokenInterfaceand SafeMath,因此它會因為導入兩次而感到困惑。

假設這是您的程式碼:

pragma solidity ^0.6.0;
import "./VRFConsumerBase.sol";
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";

contract DomainOffering is VRFConsumerBase, ChainlinkClient {

你會遇到問題,因為這些導入中的每一個也導入了那些出錯的包,所以你基本上讓它們被雙重導入。一個簡單的解決方案是將其拆分為兩個合約,並讓您的主合約通過介面與隨機性進行互動。

pragma solidity ^0.6.6;
import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";
import {randomness_interface} from "./interfaces/randomness_interface.sol";

然後像這樣呼叫你的randomness函式:

randomness_interface(governance.randomness()).getRandom(lotteryId, lotteryId);

隨機介面可能只是合約的截斷版本:

pragma solidity 0.6.6;

interface randomness_interface {
   function randomNumber(uint) external view returns (uint);
   function getRandom(uint, uint) external;
}

通過governance契約跟踪地址。您的目錄結構將如下所示在此處輸入圖像描述

Lottery.solDomainOffering.sol.

如果你真的想將它們放在同一個合約中,你也可以複製開原始碼並自己修復它,但這可能是一個很好的解決方法,也是解耦你的合約的好方法。

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