Solidity
如何在同一個合約中同時導入 VRFConsumerBase 和 ChainlinkClient
我想使用 Chainlink 的兩個功能,一個是 VRF,另一個是發出 API 請求。
所以我將兩個庫一起導入。ChainlinkClient.sol和VRFConsumerBase.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!您需要將合約分成兩個與介面互動的合約。您收到此錯誤的原因是兩個導入也導入了
LinkTokenInterface
andSafeMath
,因此它會因為導入兩次而感到困惑。假設這是您的程式碼:
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.sol
的DomainOffering.sol
.如果你真的想將它們放在同一個合約中,你也可以複製開原始碼並自己修復它,但這可能是一個很好的解決方法,也是解耦你的合約的好方法。