【问题标题】:Cannot generate .abi and .bin files when Smartcontract contains the Openzeppelin import智能合约包含 Openzeppelin 导入时无法生成 .abi 和 .bin 文件
【发布时间】:2022-02-12 18:46:39
【问题描述】:

我开始使用 web3j,我想生成智能合约包装器。根据文档,可以这样做:

web3j generate solidity -b /path/to/<smart-contract>.bin -a /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name

这很好用。您需要 .bin 和 .abi 文件。 使用这个命令也很容易生成:

solcjs <contract>.sol --abi --bin

在我不导入 Openzeppelin 的合同上,这很有效。但是在我确实导入 Openzeppelin 的合同上,调用 solcjs 命令时出现错误:

ParserError: Source "@openzeppelin/contracts/token/ERC721/ERC721.sol" not found: File not found inside the base path or any of the include paths.
 --> MyNFT.sol:5:1:
  |
5 | import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "@openzeppelin/contracts/utils/Counters.sol" not found: File not found inside the base path or any of the include paths.
 --> MyNFT.sol:6:1:
  |
6 | import "@openzeppelin/contracts/utils/Counters.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "@openzeppelin/contracts/access/Ownable.sol" not found: File not found inside the base path or any of the include paths.
 --> MyNFT.sol:7:1:
  |
7 | import "@openzeppelin/contracts/access/Ownable.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我如何在 Solidity 的智能合约中导入这个库的语法:

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

我使用 pragma solidity >=0.7.3;

智能合约有效,我用安全帽编译没有问题。

我导入了 openzeppelin 版本 - @openzeppelin/contracts@3.1.0-solc-0.7

这些文件应该放在哪里才能生成 .abi 和 .bin 文件?谢谢你的帮助。

【问题讨论】:

    标签: solidity smartcontracts web3-java


    【解决方案1】:

    您需要将 openzeppelin 合约直接下载到您的硬盘上,并将其与文件系统一起导入。您可以使用以下命令执行此操作:“npm i openzeppelin-solidity”

    【讨论】:

    • 谢谢,我试试。上次我用 npx hardhat compile 解决了它,然后在 artifacts/.json 你有 abi 和字节码,所以我从那里手动复制它并手动创建新文件 .abi 和 .bin :D 它可以工作:)但我会尝试你的想法,如果它有帮助,请告诉你。我不想一直手动操作。
    • 它没有帮助。还是一样的错误。
    【解决方案2】:

    我遇到了同样的错误,最后在其他地方找不到解决方案,而是在 Solidity 编译器本身的 GitHub 页面上找到了!见this

    编译通过相对路径导入其他合约的合约:
    solcjs --bin --include-path node_modules/ --base-path . MainContract.sol
    使用--base-path--include-path 选项来描述项目的布局。 --base-path 代表您自己的源代码树的根,而 --include-path 允许您指定包含外部代码的额外位置(例如,使用包管理器安装的库)。
    注意:确保您指定的所有文件命令行位于基本路径或包含路径之一内。编译器使用绝对路径引用这些目录之外的文件。在合约元数据中包含绝对路径将导致您的字节码只有在被放置在这些确切的绝对位置时才能重现。

    假设您的所有包(包括 OpenZeppelin)都很好地组织在单个 node_modules 目录中(可能是您为项目创建的本地目录),只需将 node_modules/ 替换为此 node-modules 目录的路径即可。同样,将. 替换为包含您正在编译的合约的目录的路径。

    以这种方式编译合约的唯一问题是它会为所有合约生成 ABI 文件,包括您已导入主合约的那些(以及它们导入的那些,等等)。我不知道是否有任何命令行选项指定要生成哪些 ABI 文件(例如,仅生成 MainContract.sol 的 ABI 文件)。

    PS:您还可以使用-o 选项为您的.abi 和.bin 输出文件指定输出目录。这在生成大量输出文件时特别有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2022-06-17
      • 2019-01-19
      • 2021-08-14
      • 2019-11-02
      • 2022-10-01
      • 2022-07-07
      相关资源
      最近更新 更多