概述

星火·链网-底层区块链平台(BIF-Core),简称星火链,是中国信息通信研究院基于区块链技术打造的一条许可公有链,是实现“星火·链网”这一国家级区块链与工业互联网协同创新新型基础设施的关键技术。

本开发手册针对星火链应用开发者, 系统介绍星火链应用开发基本概念和体系, 以及智能合约开发说明, 供开发者参考使用。

1. 星火链与其他链的区别

1.1 星火链与联盟链的区别

不同于一般联盟链,星火链采用了类似公链的油费机制, 链上所有的交易都需要耗费星火令XHT XHT作为星火链运行的基础组件, 每一个激活账户也必须保证至少持有一定量XHT才能正常使用星火链功能。

1.2 星火链与比特币、以太坊的区别

不同于现在的公链, 星火链节点和用户都要经过审核后才准入使用星火链功能, 星火链的运行受到相关方的严格监管。

2. 星火链应用开发入门

本节厘清几个星火链应用开发必须知道的入门概念和工具。

2.1 星火令XHT

星火令是星火链的基础单位, 在星火链上发起的交易需要耗费星火令, 星火链上账户必须持有一定的星火令才能使用星火链功能。 星火令单位转换关系:

1 星火令(XHT)=10^8 星火萤(glowstone)

2.2 星火链智能合约

智能合约指的是部署在区块链上通过交易触发, 自动执行的代码逻辑,开发者能够利用星火链支持的编程语言,开发一个商业级别的智能合约。

目前星火链支持javascript, solidity两种语言的智能合约,C++智能合约支持正在内测中。

2.3 星火链SDK

星火链提供了基于多种语言的SDK Github链接, 用来方便开发者程序与链上交互。

SDK提供功能包括:

  • 创建账户

  • 查询指定账户的信息

  • 查询交易信息

  • 部署合约

  • 调用合约

  • 查询合约

2.4 区块链浏览器

区块链浏览器提供了对账户, 交易, 合约的查询和跟踪等功能, 可以节省开发者的大量时间和精力。 目前星火链测试网的浏览器地址为:

2.5 星火链RPC地址

  • 主网: 尚未对外

  • 测试网: http://test.bifcore.bitfactory.cn

3.开发基础

做星火链应用开发前, 需要了解下星火链的帐号, 交易和费用等基础机制。

3.1 帐号

星火链帐号的实质为通过非对称加密技术保护的一对公私钥, 每个星火链帐号都会有以下几个属性

  • address

    账户地址, 实质为公钥的编码转化结果, 只有拥有私钥的用户才能使用对应地址发出交易。

  • nonce

    每个账户从0开始的计数, 代表该账户发起的交易数量, 同时用来防止签名重放攻击。 当账号执行一笔交易入链后,无论交易成功还是失败, 账号的nonce就会加1。

    当使用账号发起交易时,需要指定该交易nonce,其值必须比当前账号的nonce大1, 当一个账号被新建时,它的nonce为0,关于nonce使用可参照星火链进阶教程-nonce管理章节。

  • contract

    标明一个帐号是否是智能合约帐号。

  • balance

    账户余额, 注意:每个账户至少要保留0.1XHT余额。

3.2 交易

星火链上的交易包含的主要元素如下:

  • source

    交易发出地址, 由该地址来支付本次交易耗费的星火令。

  • nonce

    交易序号, 同一个source下的所有交易必须具有唯一的nonce序号, 并且交易只能按照nonce从小到大按序入链, 中间不能有空。

  • fee_limit

    该交易的费用上限, 防止因为不可预知原因或者bug,导致交易耗费过多超出预期。

  • gas_price

    交易的gas价格, 详细参见下节。

3.2 交易费用

用户发送交易请求必须支付相应的交易费用,以填补区块链网络内计算机节点设备的折旧、电力、运维等成本。在BIF-Core链中,区块链费用可以在交易前评估,且评估不收取任何费用,以方便用户根据自身情况合理提供交易费用。此外,费用的标准也可以在区块链运行过程中根据实际需要选举修改。

3.4 交易耗费计算和检查

星火链上的所有交易都需要耗费星火令, 耗费的计算公式为gas * gas_price,单位为星火萤(glowstone)。

名词解释:

  • gas

    gas用来表示单个交易的计算成本, 对于javascript合约, 每种交易类型的gas耗费固定, 对于solidity合约, 交易gas耗费是实际执行的各个op(操作码)的gas耗费之和。

  • gas_price

    gas_price指用户愿意为每单位gas支付的XHT数量, 由用户自己在发出交易时指定。

星火链上每个区块的交易打包时, 会根据gas_price排序, gas_price越高的交易会排在前面优先执行。 同时每笔交易在打包前, 会检查下账户费用是否满足以下条件:

  • 账户balance - 账户最低reserve_balance > fee_limit

  • 账户balance - 账户最低reserve_balance > gas * gas_price

星火链上一笔交易星火令的扣除分为如下几个部分:

(操作的固定gas + 交易的字节花费的gas + 合约指令花费的gas) * gasprice

  • 其中创建合约和升级合约的固定gas = 1000000, 其他操作的固定gas = 0

  • 交易字节花费的gas = 交易字节数 * 1 星火萤(glowstone)

  • Js合约指令花费的gas 为0,solidity 指令花费的gas 和以太坊一致

注意:

对于javascript合约, 系统会提前根据交易类型计算需要gas, 如果账户余额不足, 交易提交失败不予入链。

3.5 调用合约

链上转账时触发智能合约里的函数。

3.6 交易哈希

交易是指在区块链中进行交换资产,在BIF-Core中所有修改区块链数据的操作都称为交易,比如发送gas、创建账号、设置metadata、设置权限等都是交易,交易上链结果需等交易打包区块后通过该交易hash调用SDK交易查询接口确认。

3.7 签名信息

签名是指通过算法和私钥对交易数据进行加密确认并得到签名数据的过程。用户可以通过签名数据判断交易数据的完整性和正确性。

3.8 出块时间

有交易时3秒内,空块时1分钟。

3.9 交易缓存池

  • 交易池中存在一笔完全相同的交易(交易hash)一致,则直接插入失败。

  • 某个源账户发的交易,nonce相同,其它参数存在差异(计算出的tx hash不同),则会比较两笔交易的gasprice,如果B>=1.1A ,则用B交易替换A交易;如果B < 1.1A,则提示Drop the transaction to…

  • 目前星火链默认交易池处理超时时间为10分钟,超时则丢弃所有超时交易,需重新发起交易。

3.10 Tlog

tlog是星火链JS虚拟机(JSVM)日志基础设施提供的一个便利接口,提供的一种链内链外沟通的机制。类似于以太坊EVM虚拟机中的Event。

当合约调用tlog时,会触发参数存储到交易的日志中,通过触发事件智能合约可以通知链外组件某个交易动作是否触发完成。

4.交易流程

4.1 组装交易对象

根据意愿组装交易对象Transaction, 不同的交易有不同的数据结构。

4.2 序列化交易

将交易对象序列化为字节流 transaction_blob,通过 Protobuf 对象Transaction的序列化方法得到。可参见BIF-Core-SDK章节。

4.3 签名交易

用私钥PrivateKeytransaction_blob签名得到sign_data

4.4 提交交易

向BIF-Core区块链发送交易请求,触发交易的执行。

4.5 查询交易是否执行成功

通过BIF-Core-SDK 查询交易状态以及交易内容。

5.Quicknode节点

Quicknode节点是星火链网测试网上的快速部署节点,通过启动Quicknode docker服务与测试网节点建立连接,是接入星火开发生态的便捷途径。

Quicknode节点是星火链网测试网上的快速部署节点,通过启动Quicknode docker服务与测试网节点建立连接,是接入星火开发生态的便捷途径。

Quicknode节点功能:开发者用户可以与“星火·链网”的测试网进行交互,实现新建账户、查询交易、部署合约和开发应用等功能。