2.Solidity合约介绍

2.1 星火链Solidity合约语言

在星火链合约账户中,Solidity编译后生成的opCode指令码会存储到合约账户中,用于合约的执行。

本节主要介绍在星火链中支持的 Solidity 合约的特性、语法、功能等。星火链平台支持的Solidity语法基本与官方Solidity基本一致,目前支持0.4.260.8.21两个版本,官方建议使用高版本编译器

solidity官方文档:

https://docs.soliditylang.org/en/v0.8.21/

2.1.1 与标准Solidity合约的区别

  1. 星火链bid地址支持

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

  2. 指令支持

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

  3. 链机制不同导致的语言差异

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

2.1.2 合约事件

在Solidity智能合约开发中,事件(Event)是一个重要的概念,它允许合约在特定情况下通知外部实体,如前端应用或其他合约。事件机制为合约与外部世界提供了一种通信方式,使得外部实体能够实时获取合约内部状态的变化信息。

星火链的Solidity智能合约同样支持合约事件,详细介绍见Solidity合约事件

2.2 星火链Solidity合约开发工具

2.1.1 Solidity编译器

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

npm包地址:https://www.npmjs.com/package/@bifproject/solc-bif

  1. 下载

    需要电脑上安装nodejs 且版本号>=10.0.0

    npm i -g @bifproject/solc-bif
    npm i -g bs58
    

    验证是否安装成功,执行下面的命令不报错

    solcjs --help
    
  2. 编写测试合约

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

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

    ​ 执行编译命令:

    solcjs --bin --abi test.sol
    

    执行成功后结果如下,没有Error信息,警告可以忽略。

执行完后会生成两个文件:

test_sol_test.abi
test_sol_test.bin

接下来就可以使用SDK在星火链上部署调用合约了,详细步骤见使用SDK快速体验星火链

2.1.2 ABI编解码工具

由于指令集支持和地址表示法的区别, 星火链提供了专门的ABI编解码工具对合约的参数进行编解码。

  1. ethereumjs-abi

    星火链提供了专用的abi编解码工具ethereumjs-abi

  2. 离线API

    星火链的离线API服务支持调用本地API接口实现abi编解码功能,见离线API abi编解码接口

2.1.3 Openzeppelin 合约模板

OpenZeppelin是一套用Solidity语言编写, 基于EVM架构的智能合约模板库。星火链根据许可有的特性,提供了自己的Opnezeppelin合约模板。开发者可以基于星火链的Openzeppelin合约模板开发DAPP, 详见OpenZeppelin合约模板

2.1.4 Remix 合约IDE

Remix 是用于智能合约开发的Web端集成开发环境 (IDE)。由于其操作简单、功能强大,成为智能合约开发者的首选开发工具,在区块链,特别是以太坊生态中有举足轻重的地位。Remix合约IDE星火插件是基于Remix IDE的星火链插件,基于此插件,开发者可以更加直观、便捷地在星火链上开发、测试和部署智能合约。详见Remix IDE 介绍

2.1.5 Hardhat

Hardhat作为以太坊开发者生态中的明星工具,是构建智能合约和去中心化应用(DApps)的重要基石,我们结合 Hardhat 的插件式架构,为开发者提供了Hardhat 星火插件,覆盖从合约开发到部署的全流程,从而缩短合约开发周期,提高合约开发体验,提升合约开发效率。