设计Bytom 数据结构,组合了许多技术点,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等。本文会对一些技术点作如下两点分析。sql
最后介绍综合这些技术点如何实现Bytom。数据库
[patricial tree](http://www.allisons.org/ll/AlgDS/Tree/PATRICIA/)编程
•PAT树具备[基数树](https://en.wikipedia.org/wiki... 的特色,内容可快速追踪。设计模式
•PAT树具备[merkle树](https://en.wikipedia.org/wiki... 的特色,数据可快速证实。数据结构
在分布式系统中,一致性和有效性是十分关键的点。bytom采用PAT树,其中的数据可快速证实,能够快速证实每一份状态机是否一致。内容可快速追踪,可使bytom在每个快照状态下,快速查找其数据,并检验数据的有效性。分布式
Bytom 如何用PAT树?区块链
Ethereum的PAT树是16叉基数树,分两层,第一层管理的是全部的帐户,第二层管理是各帐户的存储内容。加密
Bytom 的PAT树与Ethereum 不一样?spa
为何要使用UTXO?设计
UTXO诞生于比特币,和现实世界的RMB同样,从央行诞生的那一刻起,他流转无数人的帐户,但他的价值面额始终和原来同样,这样以币为中心,而不是以人为中心,资产便于监管和统计。Bytom 就是用于资产的发布和管理的,因此,UTXO的这种以资产为中心的设计模式,是很适合Bytom上面的资产管理。
怎么使用UTXO?
相比比特币的UTXO, bytom的UTXO多了三个字段
BVM是在状态机的转化过程被启动运行,也就是excute(transaction)这一步骤。
为何须要使用BVM?
bitcoin 中的非图灵完备栈式脚本语言,所表达的功能极少,很难实现一些稍微复杂的功能,如verify_spv(跨链锚定验证的功能,如btc_relay),再如简单的去实现multi_lock(M人加密,只要收集N人私钥就能解密,0 < N < M)功能。
ethereum中的evm能简单的用solidity语言编写程序实现这些功能,但EVM过于复杂,它号称超级世界计算机,对于bytom这种只对资产有兴趣的区块链是不必的。所以bytom不如基于[Chain](https://chain.com/) 公司的能用[Ivy](https://chain.com/docs/1.2/ivy-playground/docs) 高级语言编程的CVM去作本身的扩展,灵活易用。
如何使用BVM?
用户在发送每一笔交易时,能够本身编写本身所须要的程序,等到交易打包进块时,BVM会去执行该代码,因为BVM是图灵完备的虚拟机,因此须要加入feed计价机制(feed 等同于ethereum的gas * gasprice)来解决停机问题。
为何要采用帐户模型?
帐户模型易于管理相关数据,是以人为中心,十分的直观。对于BVM来讲,基于帐户代码去执行也十分便捷。再者咱们引入了资产模型,相似于帐户模型,这样易于资产的监管和查询。
bytom怎么去实现帐户模型?
bytom 中的帐户模型也分两类,但不一样于ethereum中的我的账户和合约帐户, 它是指资产帐户和我的帐户。
资产帐户:
我的帐户:
UTXO的物理结构,用memcache 存着。UTXO的逻辑结构则是用二叉PAT树来管理。
我的帐户 根据AccountId 可以快速的索引其相关的utxo。资产帐户根据AssetId可以快速的管理相关的utxo。
上图是描述bytom主要数据结构的uml图。
Bytom用PAT树来组织utxo做为世界状态树。
帐户模型分两种,资产帐户和我的帐户,帐户能够索引管理其相关的utxo。
UTXO 池会采用如memcache的内存数据库,落盘数据库会选择关系型数据库,数据会选择protobuf来序列化。
在帐户作交易时,每一个帐户均可以从世界状态树去查找选择本身的utxo,并编写本身所需的资产程序,将其作为TxInput。
在交易打包进块时,验证节点会去实例化BVM,并执行该交易中全部TxInput中的程序。