Solidity合约编译工具

蚂蚁区块链合约平台支持 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。具体步骤如下:

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

  2. 全局安装 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 代码中编译合约

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

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

     npm i alipay-solc-0.4.24.tgz --save
  3. 代码中编译合约,创建 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
        );
    }
    
  4. 运行 index.js

     node index.js
  5. 运行的输出供参考(使用上面三个不同的编译器会得到不同的字节码,但是其功能是一样的),已包含编译字节码和合约接口说明(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 版本 

  • 兼容 Solidity 语言 0.4.24 版本之前的语法。 

  • 支持 --bin-runtime参数。

solc-mac-0.4.24.zip

0.4.24 linux

CentOS 7.2 版本 

  • 兼容 Solidity 语言 0.4.24 版本之前的语法。 

  • 支持 --bin-runtime参数。

solc-centos7.2-0.4.24.zip

0.6.4 mac

macOS 版本

  • 兼容 Solidity 语言 0.6.4 版本之前的语法。

  • 支持 --bin-runtime参数。

solc-mac-0.6.4.zip

0.6.4 linux

CentOS 7.2 版本

  • 兼容 Solidity 语言 0.6.4 版本之前的语法。

  • 支持 --bin-runtime参数。

solc-centos7.2-0.6.4.zip

0.8.14 mac

macOS 版本

  • 兼容 Solidity 语言 0.8.14 版本之前的语法。

  • 支持 --bin-runtime参数。

solc-mac-0.8.14.zip

0.8.14 linux

CentOS 7.2 版本

  • 兼容 Solidity 语言 0.8.14 版本之前的语法。

  • 支持 --bin-runtime参数。

solc-centos7.2-0.8.14.zip

0.8.14 arm64

arm64 版本

  • 兼容 Solidity 语言 0.8.14 版本之前的语法。

  • 支持 --bin-runtime参数。

solc-arm64-0.8.14.zip

安装和使用 solc

下载指定版本solc编译工具后,解压得到mychain_solc,按照以下步骤安装:

chmod +x mychain_solc
# 可以进行重命名,使编译命令更简单
mv mychain_solc solc
cp solc /usr/local/bin/

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

相关阅读