Solidity
如何在我的 Solidity 合約中引用已部署的庫
假設我有一個使用庫的合約,該庫已經部署到區塊鏈的某個地址。有沒有辦法在契約中引用已部署的庫,類似於通過介面引用已部署的契約?
假設我有以下程式碼:
pragma solidity ^0.7.6; import "./Library.sol"; contract A { using Library for uint256; constructor (){ uint256 a = 1; uint256 b = a.increment(); } }
以及位於同一目錄中的文件名為“Library.sol”的庫,其中包含以下程式碼行:
pragma solidity ^0.7.6; library Library { function increment(uint256 x) { return x + 1; } }
有沒有辦法引用部署在特定地址的庫類型庫?
我認為您可以使用 web3 將要部署的契約連結到已部署的庫,如以下 StackExchange 答案所示。
程式碼:
const ConvertLib = artifacts.require("ConvertLib"); const MetaCoin = artifacts.require("MetaCoin"); module.exports = function(deployer) { ConvertLib.address = "0xabce987676..."; deployer.link(ConvertLib, MetaCoin); deployer.deploy(MetaCoin); };
當您編譯呼叫外部庫函式的合約時,編譯器會在其字節碼中嵌入庫的地址(或此類地址的佔位符)。無論您是否將契約和庫一起編譯,它都以這種方式工作。連結到已經部署的庫實際上是任何工具都必須處理的常見情況。
如果你一起編譯它們,你使用的工具可能會隱藏它,並通過自動部署庫然後重新編譯(或至少重新連結)合約來簡化流程。該工具可能會提供一個選項來提供您自己的已部署庫的地址。我不知道您使用的是哪個工具,但編譯器有一個名為的命令行選項
--libraries
,可讓您提供庫地址。請參閱庫連結。