Skip to content

Latest commit

 

History

History
234 lines (183 loc) · 10.6 KB

Solidity合约介绍.md

File metadata and controls

234 lines (183 loc) · 10.6 KB

3.Solidity合约介绍

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

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

3.1 星火链Solidity合约特性

3.1.1 星火链Solidity和以太坊solidity区别

  1. 星火链bid地址支持:

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

  2. 有效地址检查:

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

  3. 指令支持

    星火链上solidity不支持STATICCALLCALLCODESELFDESCTRUCT命令。

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

    星火链上solidity不支持EXTCODEHASHCOINBASEDIFFICULT指令。

  5. 函数递归深度限制

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

3.1.2 星火链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

3.2 星火链Solidity合约规范

3.2.1 数据类型

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

    基本类型:

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

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

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

    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;}

3.3 星火链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. 部署调用

    后续的合约部署调用流程参见快速入门-4.快速接入星火链章节。