Solidity

如何在我的 Solidity 合約中引用已部署的庫

  • August 29, 2021

假設我有一個使用庫的合約,該庫已經部署到區塊鏈的某個地址。有沒有辦法在契約中引用已部署的庫,類似於通過介面引用已部署的契約?

假設我有以下程式碼:

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,可讓您提供庫地址。請參閱庫連結

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