Solidity

為什麼我可以在 Remix IDE 上使用連結庫而不先部署它們?

  • April 15, 2022

我試圖理解 和 之間的Linked Libraries區別Embedded Libraries

我已經閱讀了一些文章並觀看了這些教程:

據我所知,區別在於:

  • Embedded Library: 被添加到您正在部署的智能合約的字節碼中。
  • Linked Library: 需要先部署。然後,可以將幾個智能合約連結到它。

此外,是什麼決定了庫是否LinkedEmbedded其功能的可見性:

  • Embedded Libraries:所有庫函式都是內部的
  • Linked Libraries:圖書館至少包含一個公共或外部功能

所以我在 Remix 中測試了這段程式碼:

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.6;

library reverseMath {
   
   function add(uint256 _a, uint256 _b) public pure returns(uint256 fakeSum) {
       return _a - _b;
   }
   
   function sub(uint256 _a, uint256 _b) external pure returns(uint256 fakeDifference) {
       return _a + _b;
   }
   
   function mul(uint256 _a, uint256 _b) internal pure returns(uint256 fakeProduct) {
       return _a / _b;
   }
   
   function _div(uint256 _a, uint256 _b) private pure returns(uint256 _fakeQuotient) {
       return _a * _b;
   }
   
   function div(uint256 _a, uint256 _b) internal pure returns(uint256 fakeQuotient) {
       return _div(_a, _b);
   }
}

contract X {
   using reverseMath for uint256;
   
   function foo1(uint256 _x, uint256 _y) external pure returns (uint256) {
       return _x.add(_y);
   }
   
   function foo2(uint256 _x, uint256 _y) external pure returns (uint256) {
       return _x.sub(_y);
   }
   
   function foo3(uint256 _x, uint256 _y) external pure returns (uint256) {
       return _x.mul(_y);
   }
   
   function foo4(uint256 _x, uint256 _y) external pure returns (uint256) {
       return _x.div(_y);
   }
}

它有效。

但是,由於reverseMath具有非內部功能,它是 a Linked Library,對嗎?

並且Linked Libraries需要事先部署,對嗎?

contract X1. 那麼,當我沒有reverseMath事先部署庫時,它是如何工作的?

2. 另外,如何將智能合約連結到已部署的庫?

我試過這個,但它不工作:

pragma solidity 0.8.6;

library Library1 {
   
}

contract Library1User {
   
   Library1 l1 = Library1(0x59c8965945B08a7D3EbC7ed7de7FDe528c1D6cB9);
}

**作為對2.**的回答,本文解釋瞭如何連結到 Remix IDE 中的庫(已部署)。

總之,您不會在合約程式碼中添加部署的庫地址。相反,您編輯 json 文件(在編譯合約時生成)以指向已部署的庫地址。

  1. 那麼,當我沒有事先部署 reverseMath 庫時,合約 X 是如何工作的呢?

不可能,而且您不會手動部署該庫,但 Remix 會自動為您部署

2.如何將智能合約連結到已部署的庫?

這不是在solidity程式碼本身中完成的,而是必須在您的javascript文件中連結到外部,例如:

const contractFactory = await this.env.ethers.getContractFactory("Example", {
 libraries: {
   ExampleLib: "0x...",
 },
});

有關更多詳細資訊,請參見https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html

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