蚂蚁区块链合约平台支持 Solidity 智能合约,针对合约源代码的编译,可以直接通过蚂蚁区块链 Cloud IDE 合约开发环境进行合约编译、部署、测试和调试。
本文除介绍由蚂蚁区块链平台提供的 Solidity 编译工具 solc-js 的 下载、安装和 使用方式外,还对二进制 solc 编译工具进行简要说明。
下载 solc-js
单击此处下载0.4.24版本获取合约编译工具 solc-js 安装包:alipay-solc-0.4.24.tgz(约 1.9M)。
单击此处下载0.6.4版本获取合约编译工具 solc-js 安装包:alipay-solc-0.6.4.tgz(约 2.3M)。
单击此处下载0.8.14版本获取合约编译工具 solc-js 安装包:alipay-solc-0.8.14.tgz(约 5.77M)。
蚂蚁链对 Solidity 语言的支持与原生的 Solidity 语言不同,因此不能使用外部社区的 solc-js 编译工具。
BaaS 平台提供的 solc-js:alipay-solc-0.2.24.tgz 可兼容 Solidity 语言 0.4.24 版本之前的语法(不包含 0.4.24)。
0.8.14版本默认使用ABIEncoderV2编码器,新增了对结构体、嵌套和动态类型变量的支持,gas成本有较大提高,建议在无需使用v2相关特性时,使用
pragma abicoder v1;
手动指定abi coder v1编码。
安装 solc-js
solc-js 工具依赖 Node.js 环境,因此需要先安装 Node.js,然后安装 solc-js。具体步骤如下:
下载并安装 Node.js(推荐版本:v10.11.0)。
全局安装 solc-js。在下载的
alipay-solc-0.4.24.tgz
所在目录执行以下命令:npm i alipay-solc-0.4.24.tgz -g
或
npm i alipay-solc-0.6.4.tgz -g
或
npm i alipay-solc-0.8.14.tgz -g
使用 solc-js
全局安装 solc-js 工具后,即可在命令行中直接使用此工具,可以通过 solcjs --help
来查看此工具支持的参数说明。
命令行语法
Usage: /usr/local/bin/solcjs [options] <FILE_NAME>
选项说明
--version
说明:显示版本号
类型:布尔
--optimize
说明:启用字节码优化器
类型:布尔
--bin
说明:十六进制合约的二进制
类型:布尔
--abi
说明:合约接口说明
类型:布尔
--standard-json
说明:打开标准 JSON 输入或输出模式
类型:布尔
--output-dir
,-o
说明:合约输出的目录
类型:字符串
--help
说明:显示帮助信息
类型:布尔
编译示例
如下所示,创建名为 hello.sol
的 Solidity 合约示例:
pragma solidity ^0.4.20;
contract Hello {
string name;
identity id; //identity 类似于原生 Solidity 语言的 address
constructor() public {
name = 'Hello world!';
}
function hello() view public returns (identity, string) {
return (msg.sender, name);
}
}
命令行编译合约
运行以下命令行,编译
hello.sol
合约并得到编译字节码结果:solcjs --bin hello.sol
如果编译通过,此目录会得到包含字节码的结果文件
hello_sol_Hello.bin
,如果编译失败则提示错误信息。运行以下命令行,编译
hello.sol
合约并得得到合约接口说明(ABI):solcjs --abi hello.sol
如果编译通过,此目录会得到包含合约接口说明(ABI)的结果文件 hello_sol_Hello.abi
。
JS 代码中编译合约
创建目录 solcjs-test,执行
npm init
,将alipay-solc-0.4.24.tgz
文件放到 solcjs-test 目录。运行以下命令行,在 solcjs-test 目录中安装 solc-js:
npm i alipay-solc-0.4.24.tgz --save
代码中编译合约,创建
index.js
文件内容如下:编译工具为0.4.24版本时,执行代码如下:
var solc = require('@alipay/solc') var input = 'contract test { function g(identity a) {} }' // Setting 1 as second paramateractivates the optimiser var output = solc.compile(input, 1) for (var contractName in output.contracts) { // code and ABI console.log(contractName + ': ' + output.contracts[contractName].bytecode) console.log(contractName + ': ' + output.contracts[contractName].interface) }
编译工具为0.6.4版本及以上时,执行代码如下:
const solc = require('solc'); const fs = require("fs"); const contract = fs.readFileSync('./demo.sol', {encoding: 'utf-8'}) const input = { language: 'Solidity', sources: { 'demo.sol': { content: 'contract test { function g(identity a) {} }' } }, settings: { outputSelection: { '*': { '*': ['*'] } } } }; const output = JSON.parse(solc.compile(JSON.stringify(input))); console.log(output) // `output` here contains the JSON output as specified in the documentation for (var contractName in output.contracts['demo.sol']) { console.log( contractName + ': ' + output.contracts['demo.sol'][contractName].evm.bytecode.object ); }
运行
index.js
:node index.js
运行的输出供参考(使用上面三个不同的编译器会得到不同的字节码,但是其功能是一样的),已包含编译字节码和合约接口说明(ABI):
:test: 6080604052348015600f57600080fd5b5060898061001e6000396000f300608060405260043610603e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166338a1231d81146043575b600080fd5b348015604e57600080fd5b506058600435605a565b005b505600a165627a7a7230582008d3450904d4f09535ba76326aae5ecd2f61113b791d633dbb3c0799ff75b3ad0029 :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.4.24 mac | macOS 版本
| |
0.4.24 linux | CentOS 7.2 版本
| |
0.6.4 mac | macOS 版本
| |
0.6.4 linux | CentOS 7.2 版本
| |
0.8.14 mac | macOS 版本
| |
0.8.14 linux | CentOS 7.2 版本
| |
0.8.14 arm64 | arm64 版本
|
安装和使用 solc
下载指定版本solc编译工具后,解压得到mychain_solc,按照以下步骤安装:
chmod +x mychain_solc
# 可以进行重命名,使编译命令更简单
mv mychain_solc solc
cp solc /usr/local/bin/
安装完成后,即可在命令行中直接使用此工具,可以通过 solc --help
来查看此工具支持的参数说明。