我开始使用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;
Smartcontract是有效的,我用安全帽编译了它,没有问题。
我导入了openzeppelin版本-@openzeppellin/contracts@3.1.0-solc-0.7
这些文件应该在哪里才能生成.abi和.bin文件?谢谢你的帮助。
我也遇到了同样的错误,最终在其他地方找到了解决方案,只有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/
替换为此node-modules目录的路径即可。同样,将.
替换为包含正在编译的协定的目录的路径。
以这种方式编译合同的唯一问题是,它为所有合同生成ABI文件,包括已导入到主合同的合同(以及它们导入的合同,依此类推(。我不知道是否有任何命令行选项可以指定要生成哪些ABI文件(例如,只为MainContract.sol
生成ABI文件(。
PS:您还可以使用-o
选项为.abi和.bin输出文件指定输出目录。事实证明,这非常有用,特别是在生成大量输出文件时。
您需要直接在硬盘上下载openzeppelin合约,并将其与文件系统一起导入。您可以使用以下命令执行此操作:;npm i openzeppelin solidity;