首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当智能合同包含Openzeppelin导入时,无法生成.abi和.bin文件

当智能合同包含Openzeppelin导入时,无法生成.abi和.bin文件
EN

Stack Overflow用户
提问于 2022-01-17 14:16:53
回答 2查看 1.2K关注 0票数 1

我开始使用web3j,并希望生成智能的契约包装器。根据文件,可以这样做:

代码语言:javascript
复制
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文件。使用以下命令也很容易生成:

代码语言:javascript
复制
solcjs <contract>.sol --abi --bin

在我不导入Openzeppelin的合同中,这非常有用。但是,在导入Openzeppelin的合同中,调用solcjs命令时会出现错误:

代码语言:javascript
复制
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";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

语法--如何在smart契约中导入此库:

代码语言:javascript
复制
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

我使用的是语用稳健性>=0.7.3;

Smartcontract是有效的,我用草帽编译它,没有问题。

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

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

EN

回答 2

Stack Overflow用户

发布于 2022-02-12 10:46:39

我也犯了同样的错误,最终在其他地方找到了解决方案,只有Solidity编译器本身的GitHub页面!见

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

假设您的所有包(包括OpenZeppelin)都很好地组织在单个node_modules目录中(可能是您为项目创建的本地目录),那么只需将node_modules/替换为指向此节点模块目录的路径。同样,用包含正在编译的契约的目录的路径替换.

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

PS:您还可以使用.abi选项为您的.bin和-o输出文件指定输出目录。这是非常有用的,特别是当大量的输出文件正在被产生。

票数 1
EN

Stack Overflow用户

发布于 2022-01-20 05:18:56

您需要直接在硬盘上下载openzeppelin合同,并将其导入文件系统。您可以使用以下命令进行此操作:"npm i openzeppelin-solidity“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70742806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档