Solidity合约编译工具

蚂蚁区块链合约平台支持 Solidity 智能合约,针对合约源代码的编译,可以直接通过蚂蚁区块链 Cloud IDE 合约开发环境进行合约编译、部署、测试和调试。

本文除介绍由蚂蚁区块链平台提供的 Solidity 编译工具 solc-js 的 下载安装使用方式 外,还对二进制 solc 编译工具进行简要说明。

下载 solc-js

点击此处,获取合约编译工具 solc-js 安装包:alipay-solc-0.1.12.tgz(约 1.76M)。

说明:

  • 蚂蚁区块链对 Solidity 语言的支持与原生的 Solidity 语言不同,因此不能使用外部社区的 solc-js 编译工具。
  • BaaS 平台提供的 solc-js:alipay-solc-0.1.12.tgz 可兼容 Solidity 语言 0.4.24 版本之前的语法(不包含 0.4.24)。

安装 solc-js

solc-js 工具依赖 Node.js 环境,因此需要先安装 Node.js,然后安装 solc-js。具体步骤如下:

  1. 下载 并安装 Node.js(推荐版本:v10.11.0)。

  2. 全局安装 solc-js。在下载的 alipay-solc-0.1.12.tgz 所在目录执行以下命令:

  1. npm i -g alipay-solc-0.1.12.tgz

使用 solc-js

全局安装 solc-js 工具后,即可在命令行中直接使用此工具,可以通过 solcjs --help 来查看此工具支持的参数说明。

命令行语法:

  1. Usage: /usr/local/bin/solcjs [options] <FILE_NAME>

选项:

  • --version
    说明:显示版本号
    类型:布尔
  • --optimize
    说明:启用字节码优化器
    类型:布尔
  • --bin
    说明:十六进制合约的二进制
    类型:布尔
  • --abi
    说明:合约接口说明
    类型:布尔
  • --standard-json
    说明:打开标准 JSON 输入或输出模式
    类型:布尔
  • --output-dir-o
    说明:合约输出的目录
    类型:字符串
  • --help
    说明:显示帮助信息
    类型:布尔

编译示例

如下所示,创建名为 hello.sol 的 Solidity 合约示例:

  1. pragma solidity ^0.4.20;
  2. contract Hello {
  3. string name;
  4. identity id; //identity 类似于原生 Solidity 语言的 address
  5. constructor() public {
  6. name = 'Hello world!';
  7. }
  8. function hello() view public returns (identity, string) {
  9. return (msg.sender, name);
  10. }
  11. }

命令行编译合约

  • 运行以下命令行,编译 hello.sol 合约并得到编译字节码结果:
  1. solcjs --bin hello.sol

如果编译通过,此目录会得到包含字节码的结果文件 hello_sol_Hello.bin,如果编译失败则提示错误信息。

  • 运行以下命令行,编译 hello.sol 合约并得得到合约接口说明(ABI):
  1. solcjs --abi hello.sol

如果编译通过,此目录会得到包含合约接口说明(ABI)的结果文件 hello_sol_Hello.abi

JS 代码中编译合约

  1. 创建目录 solcjs-test,执行 npm init,将 alipay-solc-0.1.12.tgz 文件放到 solcjs-test 目录。

  2. 运行以下命令行,在 solcjs-test 目录中安装 solc-js:

    1. npm i alipay-solc-0.1.12.tgz --save
  3. 代码中编译合约,创建 index.js 文件内容如下:
    1. var solc = require('@alipay/solc')
    2. var input = 'contract test { function g(identity a) {} }'
    3. // Setting 1 as second paramateractivates the optimiser
    4. var output = solc.compile(input, 1)
    5. for (var contractName in output.contracts) {
    6. // code and ABI
    7. console.log(contractName + ': ' + output.contracts[contractName].bytecode)
    8. console.log(contractName + ': ' + output.contracts[contractName].interface)
    9. }
  4. 运行 index.js:
    1. node index.js
  5. 运行的输出供参考,已包含编译字节码和合约接口说明(ABI):

    1. :test: 6080604052348015600f57600080fd5b5060898061001e6000396000f300608060405260043610603e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166338a1231d81146043575b600080fd5b348015604e57600080fd5b506058600435605a565b005b505600a165627a7a7230582008d3450904d4f09535ba76326aae5ecd2f61113b791d633dbb3c0799ff75b3ad0029
    2. :test: [{"constant":false,"inputs":[{"name":"a","type":"identity"}],"name":"g","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

solc-js 与 JS SDK 结合使用

在 JS 代码中编译 Solidity 合约后,得到编译字节码和合约接口说明(ABI),进而可直接使用 JS SDK 来部署、调用合约。详情可参考 JS SDK 使用说明

二进制 solc 编译工具

solc-js 编译工具能支持多系统平台运行,并且可以结合 JS SDK 自动化部署、调用合约,使用方便。solc-js 在命令行支持 --bin参数,但是不支持通过 --bin-runtime 参数来编译升级合约接口所需要的字节码。

solc-js 工具在 JS 代码中默认也使用 --bin 参数编译合约得到字节码,此字节码不能直接用于合约升级,但是通过一次“本地合约部署”之后即可得到 runtime 字节码,用于合约升级使用。详情可参考 JS SDK 使用说明

二进制 solc 编译工具同时支持 --bin-runtime--bin 参数,这两个参数在编译结果上的主要差异在于,针对相同的目标Solidity 合约,使用 --bin-runtime 参数的编译字节码是 --bin 参数编译字节码的一部分。--bin 参数编译字节码除了包含--bin-runtime 参数的编译字节码结果之外,还包含合约初始化方法 constructor 的相关字节码等内容。

因此,如果需要使用 SDK 的升级合约接口,建议使用二进制 solc 编译工具,通过 --bin-runtime 参数来直接编译得到升级合约的字节码:

版本 说明 下载链接
0.1.12 MacOS 版本
- 兼容 Solidity 语言 0.4.24 版本之前的语法。
- 支持 --bin-runtime 参数。
solc-mac-0.1.12.zip
0.1.10 CentOS 7.2 版本
- 兼容 Solidity 语言 0.4.24 版本之前的语法。
- 支持 --bin-runtime 参数。
solc-centos7.2-0.1.12.zip

相关阅读