Solidity
為什麼我可以在 Remix IDE 上使用連結庫而不先部署它們?
我試圖理解 和 之間的
Linked Libraries
區別Embedded Libraries
。我已經閱讀了一些文章並觀看了這些教程:
據我所知,區別在於:
Embedded Library
: 被添加到您正在部署的智能合約的字節碼中。Linked Library
: 需要先部署。然後,可以將幾個智能合約連結到它。此外,是什麼決定了庫是否
Linked
是Embedded
其功能的可見性:
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
具有非內部功能,它是 aLinked Library
,對嗎?並且
Linked Libraries
需要事先部署,對嗎?
contract X
1. 那麼,當我沒有reverseMath
事先部署庫時,它是如何工作的?2. 另外,如何將智能合約連結到已部署的庫?
我試過這個,但它不工作:
pragma solidity 0.8.6; library Library1 { } contract Library1User { Library1 l1 = Library1(0x59c8965945B08a7D3EbC7ed7de7FDe528c1D6cB9); }
**作為對2.**的回答,本文解釋瞭如何連結到 Remix IDE 中的庫(已部署)。
總之,您不會在合約程式碼中添加部署的庫地址。相反,您編輯 json 文件(在編譯合約時生成)以指向已部署的庫地址。
- 那麼,當我沒有事先部署 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