2.星火链开发入门

本章厘清几个星火链开发必须知道的基础概念、工具和设计。

2.1 基础术语

2.1.1 非对称加密

在区块链系统中,非对称加密技术是实现身份验证和数据完整性校验的关键机制。它利用一对数学上相关联但不相同的密钥:公钥和私钥。

  • 公钥是公开的,可以安全地与他人共享,用于验证数字签名。

  • 私钥是保密的,仅被密钥的拥有者知晓,用于创建数字签名。

2.1.2 数字签名

数字签名是一种用于验证数字信息完整性和认证发送者身份的技术。它基于非对称加密原理,通过对数字信息进行加密和生成签名,使得除了信息的发送者之外的任何人都无法伪造签名。星火链支持两种数字签名算法:SM2和ED25519

2.1.3 区块链

区块链是一种分布式数据库或账本技术,它以链式结构安全地存储数据记录。这些记录被称为“区块”,每个区块包含一系列交易数据,并通过哈希指针的方式与前一个区块链接起来,形成一个不可篡改和连续的数据链。区块链的核心特点包括去中心化、不可篡改性、透明性和安全性。

2.1.3.1 什么场景适合使用区块链

区块链集成了密码学、共识算法、智能合约等技术,具有分布式、不可篡改、公开透明等特点,适合存证、溯源、投票治理、数据共享、身份验证等场景。

2.1.3.2 什么数据适合上链

区块链作为复杂的分布式系统,处理性能上限较低,同时链上存储资源昂贵且数据公开透明,因此建议遵循以下原则:

  • 文件链下存储,哈希上链

  • 批量数据链下存储,处理结果上链

  • 复杂逻辑链下处理,计算结果上链

  • 隐私数据链下处理,公开数据上链

注意:
不要简单的把区块链当作数据库使用。

2.1.4 区块链节点

区块链节点是一种运行区块链软件协议副本的设备,区块链系统是由多个区块链节点组成。

2.1.5 智能合约

智能合约指的是部署在区块链上通过交易触发, 自动执行的代码逻辑,开发者能够利用星火链支持的智能合约编程语言,开发一个商业级别的智能合约。 星火链支持Solidity, Javascript两种语言的智能合约。Solidity合约的生态工具更加完善且性能更佳,官方推荐使用Solidity智能合约

2.1.6 共识算法

区块链中的共识算法是一种机制,用于确保网络中所有参与节点就数据的状态和交易的有效性达成一致意见。星火链中的共识算法使用的是创新的混合共识算法 DPOS + PBFT

2.1.7 账号

也称账户(account),星火链上的账户分为外部账户合约账户

  • 外部账户

    外部账户是星火链的主体,是对现实社会中法人或自然人一种的映射。外部帐号的实质为通过非对称加密技术保护的一对公私钥, 拥有外部账户的用户可以使用其私钥对交易进行签名,并通过发送签名的交易来管理账户。只有被激活的外部账户才能在相互链上发起交易。

  • 合约账户

    合约账户是由智能合约代码控制的账户,没有对应的公私钥,通过发送交易到合约账户,可以调用智能合约的函数或触发合约中的其他逻辑。

星火链的每一个账户下面都有一个小型的键值对数据库metadatas, 用户可以通过交易的形式在metadatas下存储数据。智能合约内的变量值也都存储在账户的metadatas下。

2.1.8 交易

  • 操作:

    操作(Opration)是星火链上记录和更新信息的基本单位,一次账号激活、一次合约调用都是一笔操作。

  • 交易:

    交易(Transaction)是指在区块链上发起的对账号进行的一系列操作。星火链上的一笔交易可以包含多笔操作,而且同一笔交易中的多个操作,要么同时成功,要么同时失败。

  • 交易序列化:

    序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。交易序列化是指为了用私钥对交易签名,将交易对象进行序列化为字节码。星火链交易需要先序列化成二进制字节码之后发送到链上,采用Protocol Buffer 3作为序列化协议

  • 交易费用:

    为防止链上出现大量无效的交易,提高交易的上链成本,星火链设计为用户发送交易请求必须支付相应的星火令作为交易费用。

  • 交易缓存:

    交易在提交到区块链节点后,先进去交易缓存池,待到系统完成共识打包出块后把交易从交易池删除。

    注意:
    星火链的交易池有超时时间,超时时间还没被处理的交易将会被丢弃,需要重新发起交易。超时时间目前为10分钟。处理一笔交易完整的流程有两种处理方式:
    1. 发送交易上链后通过订阅服务异步等待链上处理结果。

    2. 发送交易上链后用交易hash同步轮询链上处理结果,直到交易执行成功或超时被丢弃。

  • 交易哈希:

    交易被发送到交易缓存池后区块链节点会计算一个交易的哈希值作为交易的唯一索引返回,交易的最终处理结果需等交易打包区块后通过该交易哈希异步查询确认

  • 交易打包:

    交易打包是指区块链系统将交易从交易缓存池捞出来打包成区块的过程。星火链系统依靠定时器每1s发起一轮共识来打包用于生成新区块的交易。打包时,从交易缓存池的头部开始有序抓取交易池的交易进行打包,星火链单笔交易最大1M, 一个区块最大容量为16M

  • 交易出块时间:

    星火链的出块时间会动态调整,有交易的情况下1秒出一个块,空块时1分钟出一次块,遇到共识或者网络波动的情况下出块时间可能会稍微延长。

2.1.9 星火令

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

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

想要获取星火令后在体验网试用,参考如何获取星火令

2.1.10 主网和体验网

星火链作为许可公有链,是节点部署在全国各大城市,实际线上7*24小时运行着的区块链网络系统。其中主网是正式对外提供服务的生产环境,体验网供开发者体验对接。

2.2 基础工具

2.2.1 星火链RPC接口

星火链通过rpc的方式对提供区块查询、合约调用等服务,服务地址:

2.2.2 星火链消息订阅服务

除用户主动调用星火链的接口之外,星火链还提供了消息订阅服务。用户订阅了某个账户或者区块的消息之后,星火链就会实时的将对应账户或者区块的消息通过Websocket接口发送给订阅者。订阅服务地址:

2.2.3 星火链SDK

星火链提供了基于多种语言的SDK, 用来方便开发者程序调用星火链RPC接口。

2.2.4 星火链离线API

离线API主要是提供密码学和交易序列化等相关的本地API。主要功能包括本地密钥对和账户的生成、本地签名验签、本地交易序列化和反序列化等功能。如果用户由于SDK语言的限制或者不希望代码中集成SDK,可以在本地部署星火链离线API完成这些功能的开发。

2.2.5 星火链订阅工具

订阅工具提供了对星火链区块、交易、事件的订阅功能,详细设计见订阅服务设计,同时还提供了使用示例说明

2.2.6 区块链浏览器

区块链浏览器提供了对账户, 交易, 合约的查询和跟踪等功能, 可以节省开发者的大量时间和精力。

目前星火链体验网的浏览器地址为:

2.2.7 Remix合约IDE星火插件

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

2.2.8 星火链插件钱包

浏览器插件钱包是星火链提供的浏览器插件版本的钱包,用户可以使用浏览器插件钱包本地管理自己的私钥,和控制私钥对交易进行签名。

2.2.9 星火链开放平台

星火链开放平台是“星火链的入口”,是基于“星火·链网”的Web创新应用服务平台,提供链上节点服务RPC、底层链API、安全审计、数据分析等全生命周期服务,同时将区块链底层交互逻辑封装为增强型API、进一步提升开发效率,助力开发者及企业用户打造开放、多元的分布式商业形态。

2.2.30 Hardhat 星火插件

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

2.3 基础设计

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

2.3.1 账户

每个星火链帐号都会有以下几个属性:

  • address

    账户地址, 外部账户实质为公钥的编码转化的字符串,合约账户为按照一定规则生成的字符串。

  • nonce

    用来防止签名重放攻击,新创建的账户nonce默认为0, 查询账户信息时不显示该字段

  • contract

    合约账户特有,存放智能合约代码,外部账户没有该字段,可以表明一个帐户是否是合约帐户。

  • balance

    账户余额, 用来发交易时支付”交易费”, 单位是星火莹。

2.3.2 交易

2.3.2.1 交易结构

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

  • sourceAddress

    交易发起地址, 由该地址来支付本次交易消耗的”交易费”。

  • nonce

    交易序号, 同一个sourceAddress下的所有交易必须具有唯一的nonce序号, 星火链支持递增随机两种nonce的交易,详见章节nonce设计

  • fee_limit

    该交易的消耗”交易费”的上限, 防止因为合约实现不合理或不可预知原因导致交易消耗的”燃料费”过多超出预期。关于fee_limit的使用见交易费用设置建议

  • gas_price 指用户愿意为每单位gas支付的星火令数量, 默认填1即可,具体的规则见交易费扣除规则

  • operation

    操作是交易中附带的具体动作,改变账号的原子单位。星火链支持多种不同类型的操作,一个交易,必定是包含了1个或多个操作。

  • 交易的基本结构

{
    "source_address":"xxxxxxxxxxx",//交易源账号,即交易的发起方
    "nonce_type":1,//0 递增nonce, 1随机nonce
    "nonce":2, //nonce值
    "max_ledger_seq":58540,//最晚处理的区块链高度,随机nonce使用
    "fee_limit" : 1000000, //愿为交易花费的交易费
    "gas_price": 1,//gas价格,填默认的1即可
    "metadata":"0123456789abcdef", //可选,用户自定义给交易的备注,16进制格式
    "operations":[
    {
       
    //根据不同的操作填写
    },
    {
    //根据不同的操作填写
    }
    ......
    ]
}

2.3.2.2 操作说明

星火链支持多种类的操作类型:

  • 创建账号操作 在执行其他操作之前必须首先创建账号。创建账号操作由其他已存在的账号申请执行。第一个账号是在星火链启动时内置生成的,也被成为创世账号。

  • 设置metadatas操作 metadatas每个账户都有一个matadatas字段,是一个键值对数据库,可以存储额外的账户信息。

  • 部署合约操作 在链上部署智能合约。

  • 调用合约操作 调用智能合约的某个方法。

2.3.2.3 nonce设计

基于账户体系的区块链中账户的nonce属性是为了防止重放攻击而设计的,每个账户下的不同交易的nonce都不可以重复。星火链中交易的nonce分为递增和随机nonce两种。用户在发起交易时自己决定使用递增或是随机nonce

  • 递增nonce

    递增nonce要求发起交易的账户的nonce值连续递增。

    每个账户都有一个从0开始递增的nonce属性。提交一笔交易上链后,无论交易成功还是失败(失败不包括入交易池失败和超时丢弃两种情况,入交易池失败不会返回交易哈希),账户的nonce都会增加1。发起新交易时,必须指定的nonce值要恰好是当前账户nonce加1。
    - 低于当前账户nonce加1的nonce会被视作重放攻击而丢弃。
    - 高于当前账户nonce加1的nonce则在交易池等待,直至缺失的交易提交或交易超时。
    
  • 随机nonce

    随机nonce是为了提高交易执行的并发度,提升链的性能而设计,只需要在一定区块高度范围内实现nonce不重复即可。

注意:
递增nonce适合对某个账户下的多笔交易有顺序执行要求的场景,其他场景均建议使用随机nonce。星火链SDK默认使用递增nonce, 使用时需要通过setNoncetype(1)切换到随机nonce.

2.3.2.4 合约事件

星火链支持合约事件,一个合约事件在区块链浏览器上体现为一笔单独的交易。对于Solidity智能合约, 合约事件即为event, 使用方式和基本以太坊的event一致,详见Solidity合约介绍;对于JS合约,合约事件为tlog, 是星火链单独设计的合约事件,使用方式见Js合约介绍

2.3.2.5 交易费扣除规则

  1. 账户balance 需要大于 fee_limit

  2. fee_limit需要大于发送交易消耗的星火令。

  3. 星火链上消耗的星火令分为以下三部分:(固定费用 + 存储费用 + 指令费用)* gasprice

    其中固定费用部分根据不同的操作类型有不同的扣费规则:

    操作类型

    固定消耗费用(单位:星火荧)

    创建外部账户

    0

    创建合约账户

    1000000

    调用合约

    0

    其他

    0

    存储费用部分按照交易中操作序列化后的字节大小消耗,消耗的费用为operation.size() 。

    指令费用部分,solidity合约的指令消耗与以太坊一致,js合约的指令消耗为0。

2.3.2.6 交易费用设置建议

  • balance是账户拥有的余额。

  • gasprice是愿意为每一个消耗单位花费的费用,建议填1即可。

  • feelimit是愿意为一笔交易花费的最大费用,不能大于balance , 相同的交易feelimit固定,可以在测试阶段确定下来:

    1. 将交易的``feelimit设置为balance`后发送交易。

    2. 根据交易哈希获取交易结果,交易成功后,交易结果中的actul_fee即为该交易花费的费用。

    3. 后续该交易的feelimit即可设置为上一步查询的出的actul_fee

    4. 通过当前的balance/gas即可估算到当前账户可以调用多少次该交易,如果交易次数不够可以联系技术人员多充一些星火令。

2.3.3 订阅

星火链对外提供websocket协议的订阅服务,序列化采用protobuf协议提供以下信息的订阅:

  • 订阅最新的区块,包括区块头和区块内交易两种子类型的订阅。

  • 订阅指定地址的最新交易列表,包括源或目的账户地址在指定地址列表中的交易上链事件。

  • 订阅交易状态变化,包括交易被丢弃和交易成功两个事件。

  • 订阅合约事件,可以根据合约地址和主题(可选)进行相应的交易订阅。

具体使用方式见订阅服务使用示例说明