1. 区块结构
链式区块的基本数据结构都是一棵树(考虑有分叉的情况),石墨烯的区块链也不例外,一个区块中包含上一个区块的id,每个区块的id为区块内容的MAC。
block由block header和transaction list构成。 1.1 block header
- previous:前一个块的id
- block_num
- digest:块id
- witness:出块者
- transaction_merkle_root
1.2 transaction list 为本块打包的交易集合,transaction list的结构与其他区块链不一样。石墨烯的transaction list中的每个transaction并不只是一个交易的操作,而是支持多个operation的集合。 一个operation是一个基本操作的定义,如转账、投票等。 一个transaction里可以包含多个operation。但是这些在一个transaction里的operations依然保持事务的特性,也就是在同一个transaction里的operation要么都执行,要么都不执行。
石墨烯区块链没有独立的虚拟机,不支持智能合约。所有操作都由operation来定义,如gas计算、撮单等。如果需要扩展operation,只需要实现相应的接口即可。
2. 存储
石墨烯中的存储使用的是文件存储。
- 所有数据都以文件的形式进行组织和管理,并没有使用数据库。
- 存储框架需要实现数据的管理功能,石墨烯框架在启动和运行时,需要将大部分数据加载到内存,因此对内存的要求非常之高。
2.1 对象模型和索引模型
所有的对象实例都有一个全局唯一的id编号。
2.2 一个对象编号包括三部分内容
- space_id:标识是否协议对象,正常都为1
- type_id:表示对象类型
- id为此类型是第几个创建的实例。
space id 占最高 8 位, type id 占中间 8 位, 最低 48 位是 id。 eg. id为1.2.12376。
石墨烯的对象索引实现其实使用的是vector和map,由于所有的索引数据都会加载到内存,所以B+树无法发挥减少IO的优势。
3. 共识
石墨烯的共识算法使用的是Dpos,系统中最重要的角色是witness和committee。
- witness:通过投票产生的,系统有个witness维护时间周期,没到周期进行一次witness、committee等的更新。
- Committee由得票最多的11个人组成,Committee的职责是修改系统参数,无法左右出块。
- Witness负责出块。其中投票统计和洗牌过程决定了出块的witness。
在收到一个new block时,如果new block前一个block不是当前块,并且块高高于当前块高会进行分叉判断和处理: step1. 找到两个叉的LCA。 step2. 回滚到LCA。 step3. 沿最长链,依次push_block()。 石墨烯通过记录每一步的undo日志,实现了操作的回滚。每出现切换分支时,先找到最近公共祖先进行回滚操作,然后执行新的block的操作。
|