Solidity合约说明

Solidity智能合约使用Spark-Evm引擎,脱胎于原生以太坊EVM架构实现。在星火链合约账户中,Solidity编译后生成的opCode指令码会存储到合约账户中,用于合约的执行。

本目录的文档主要介绍在星火链合约平台中支持的 Solidity 合约的特性、语法、功能等。星火链平台支持的solidity语法基本与官方solidity基本一致,目前支持0.4.26版本,可以参考官方文档:https://solidity.readthedocs.io/en/v0.4.26/

星火链Solidity合约特性

星火链Solidity和以太坊solidity区别

  1. 星火链bid地址支持:

    星火链solidity address表示的地址,长度为24字节, 以太坊solidity中address表示的地址是20字节。

  2. 有效地址检查:

    在星火链solidity合约内向一个未激活(没有转入转出交易)的地址转账,合约会异常终止;而以太坊对此没有限制。

  3. 指令支持

    星火链上solidity不支持STATICCALL, CALLCODE, SELFDESCTRUCT命令。

  4. 链机制不同导致的语言diff

    星火链上solidity不支持EXTCODEHASH,COINBASE,DIFFICULT指令。

  5. 函数递归深度限制

    星火链solidity函数调用递归深度最大为4层, 以太坊为1024

星火链op支持列表

指令表

星火链是否支持

以太坊是否支持

CREATE2

CREATE

DELEGATECALL

STATICCALL

CALL

CALLCODE

RETURN

REVERT

SELFDESTRUCT

STOP

MLOAD

MSTORE

MSTORE8

SHA3

LOG0

LOG1

LOG2

LOG3

LOG4

EXP

ADD

MUL

SUB

DIV

SDIV

MOD

SMOD

NOT

LT

GT

SLT

SGT

EQ

ISZERO

AND

OR

XOR

BYTE

SHL

SHR

SAR

ADDMOD

MULMOD

SIGNEXTEND

ADDRESS

ORIGIN

BALANCE

CALLER

CALLVALUE

CALLDATALOAD

CALLDATASIZE

RETURNDATASIZE

CODESIZE

EXTCODESIZE

CALLDATACOPY

RETURNDATACOPY

EXTCODEHASH

CODECOPY

EXTCODECOPY

GASPRICE

BLOCKHASH

COINBASE

TIMESTAMP

NUMBER

DIFFICULTY

GASLIMIT

CHAINID

SELFBALANCE

POP

PUSHC

PUSH1/32

JUMP

JUMPI

JUMPC

JUMPCI

DUP1/16

SWAP1/16

SLOAD

SSTORE

PC

MSIZE

GAS

JUMPDEST

INVALID

星火链Solidity合约规范

数据类型

  • 星火链交易支持的数据类型

    基本类型:

    uint\<M>:M 位的无符号整数,0 < M <= 256、M % 8 == 0。例如:uint32uint8uint256

    int\<M>:以 2 的补码作为符号的 M 位整数,0 < M <= 256、M % 8 == 0。

    uintint:uint256、int256 各自的同义词。在计算和 函数选择器 中,通常使用 uint256int256

    bool:等价于 uint8,取值限定为 0 或 1 。在计算和 函数选择器 中,通常使用 bool。

    bytes\<M>:M 字节的二进制类型,0 < M <= 32。

    byte:等价于bytes1。

    bytes:动态大小的字节序列。

    string:动态大小的 unicode 字符串,通常呈现为 UTF-8 编码。

    一维数组:

    type[M](type=uint/int/address) 有 M 个元素的定长数组,M >= 0,数组元素为给定类型。

    二维数组:

    type[][](type=uint/int)

  • 平台建议使用数据类型

    数据类型

    参考样例

    合约内部是否支持

    输入参数是否支持

    bool

    bool a = true

    uint

    uint a = 1

    uint8 ~ uint256

    uint8 a = 1

    int

    int a = 1

    int8 ~ int256

    int8 a = 1

    bytes

    bytes a = “test”

    bytes1 ~ bytes32

    bytes1 a = “a”

    string

    string a = “test”

    int[]

    int256[] a = [1,2,3,4,5]

    uint[]

    uint256[] a = [1,2,3,4,5]

    bytes1[] ~ bytes32[]

    bytes4[] asd = new bytes4;

    string[]

    string[] a = [“adbc”,”dg”]

    enum

    enum a {a,b,c}

    struct

    struct a { string name;}

星火链Solidity编译器

由于指令集支持和地址表示法的区别, 星火链提供了专门的编译器来编译星火链Solidity合约。 本章指导开发者使用官方编译器编译星火链智能合约。

  1. 镜像下载

    docker pull caictdevelop/bif-solidity:v0.4.26
    
  2. 选项说明

    镜像下载之后,需要启动镜像进入容器中,可以使用solc --help 来查看此工具支持的参数说明。

    常用选项说明:

    --opcodes            Opcodes of the contracts.
    --bin                Binary of the contracts in hex.
    --abi                ABI specification of the contracts.
    
  3. 编写测试合约

    用一个最简单的测试合约做例子。

    pragma solidity ^0.4.26;
    
    contract test{
        function testfun() public returns(string){
            return "hello world";
        }
    }
    
  4. 编译合约

    # 启动镜像
    docker run -it caictdevelop/bif-solidity:v0.4.26 /bin/bash
    cd /root/solidity/build/solc
    ./solc --bin test.sol
    
    ======= test.sol:test =======
    Binary: 
    608060405234801561001057600080fd5b5061013f8061002060003960
    00f300608060405260043610610041576000357c010000000000000000
    0000000000000000000000000000000000000000900463ffffffff1680
    63031153c214610046575b600080fd5b34801561005257600080fd5b50
    61005b6100d6565b604051808060200182810382528381815181526020
    0191508051906020019080838360005b8381101561009b578082015181
    840152602081019050610080565b50505050905090810190601f168015
    6100c85780820380516001836020036101000a03191681526020019150
    5b509250505060405180910390f35b6060604080519081016040528060
    0b81526020017f68656c6c6f20776f726c640000000000000000000000
    000000000000000000008152509050905600a165627a7a723058201a4c
    9bfcbee5d683f6e46525cf17db2dd46a6ecf5c3f45cbdd148229639263
    480029
    
  5. 部署调用

    后续的合约部署调用流程参见快速上手章节。