Bytom设计结构解读
一、引文
设计Bytom 数据结构,组合了许多技术点,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等。本文会对一些技术点做以下两点分析。
- Bytom 为什么要采用该技术点?
- Bytom 如何应用该技术点?
最后介绍综合这些技术点如何实现Bytom。
[patricial tree](http://www.allisons.org/ll/AlgDS/Tree/PATRICIA/)
二、为什么要采用PAT树?
•PAT树具有[基数树](https://en.wikipedia.org/wiki/Radix_tree) 的特点,内容可快速追踪。

•PAT树具有[merkle树](https://en.wikipedia.org/wiki/Merkle_tree) 的特点,数据可快速证明。

在分布式系统中,一致性和有效性是十分关键的点。bytom采用PAT树,其中的数据可快速证明,可以快速证明每一份状态机是否一致。内容可快速追踪,可以使bytom在每一个快照状态下,快速查找其数据,并检验数据的有效性。
Bytom 如何用PAT树?
Ethereum的PAT树是16叉基数树,分两层,第一层管理的是所有的账户,第二层管理是各账户的存储内容。

Bytom 的PAT树与Ethereum 不同?
- Bytom 的PAT树是二叉基数树。
- Bytom的PAT树是用来管理未花费的outputs。

三、UTXO
为什么要使用UTXO?
UTXO诞生于比特币,和现实世界的RMB一样,从央行诞生的那一刻起,他流转无数人的账户,但他的价值面额始终和原来一样,这样以币为中心,而不是以人为中心,资产便于监管和统计。Bytom 就是用于资产的发布和管理的,所以,UTXO的这种以资产为中心的设计模式,是很适合Bytom上面的资产管理。

怎么使用UTXO?
相比比特币的UTXO, bytom的UTXO多了三个字段
- assertid, 因为bytom是一个多资产发布与管理的平台,所以使用该字段来唯一确定各种资产。
- accountid, 这是便于各账户对utxo的索引和管理,bytom 相比bitcoin,引入了账户模型,后面会介绍。
- program, 拥有该utxo的账户可以用Ivy语言编写自己想要的程序放在该字段,以便在交易时,图灵完备的BVM会执行该程序。
四、BVM

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中的个人帐户和合约账户, 它是指资产账户和个人账户。
资产账户:

- assetid 是全局唯一的资产识别id。
- alias 是资产的别名,可便于记忆,如(gold, silver) 。
- vmversion 是为了软分叉时,做到动态过度。
- program 是指发布该资产时需要执行的程序。
- initialblockhash 是指该资产是在哪个块高度被登记。
- signer 管理公私钥对,以便用该资产的私钥签名,只有拥有该资产私钥的人才能发布该资产。
- definition 对该资产的解释说明等。
个人账户:

- accountid 全局唯一可识别账户id。
- alais 帐户名。
- signer, 私钥对,用于发送交易。
- *utxos 该账户所有的未花费交易的索引,便于快速管理该账户下资产。
- program, 该账户发送交易时可插入需要的程序。
综述

UTXO的物理结构,用memcache 存着。UTXO的逻辑结构则是用二叉PAT树来管理。
个人账户 根据AccountId 能够快速的索引其相关的utxo。资产账户根据AssetId能够快速的管理相关的utxo。
上图是描述bytom主要数据结构的uml图。
Bytom用PAT树来组织utxo作为世界状态树。
账户模型分两种,资产账户和个人账户,账户可以索引管理其相关的utxo。
UTXO 池会采用如memcache的内存数据库,落盘数据库会选择关系型数据库,数据会选择protobuf来序列化。
在账户做交易时,每个账户都可以从世界状态树去查找选择自己的utxo,并编写自己所需的资产程序,将其做为TxInput。
在交易打包进块时,验证节点会去实例化BVM,并执行该交易中所有TxInput中的程序。
Bytom设计结构解读的更多相关文章
- IplImage 结构解读
IplImage 结构解读: typedef struct _IplImage { int nSize; /* IplImage大小,等于wi ...
- 浅谈PHP代码设计结构
浅谈PHP代码设计结构 您的评价: 还行 收藏该经验 coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露. 如何看 ...
- Dubbo的设计结构和工作原理
(1)设计结构 Provider:暴露服务方称之为“服务提供者”. Consumer:调用远程服务方称之为“服务消费者”. Registry:服务注册与发现中心的目录服务称之为“服务注册中心”. Mo ...
- 从产品展示页面谈谈Hybris的特有概念和设计结构
今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...
- 【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构
该片文章只是抽取drools中java代码实现的一些代码结构,帮助我们理解drools是如何实现rete算法的. 该部分只是抽取ReteooStatefulSession工作过程中的代码架构 利用了多 ...
- 单周期cpu设计代码解读
目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...
- IplImage 结构解读(转)
typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; ...
- Spark ML源码分析之一 设计框架解读
本博客为作者原创,如需转载请注明参考 在深入理解Spark ML中的各类算法之前,先理一下整个库的设计框架,是非常有必要的,优秀的框架是对复杂问题的抽象和解剖,对这种抽象的学习本身 ...
- PHPDragon设计结构
PHPDragon的设计思路来源至YII框架,可以吐槽作者本人完全copy,但希望在后面,会慢慢的走出一条不同的分支. 1.Dragon.php(DragonBase.php)入口文件,负责程序的自动 ...
随机推荐
- rest-framework 序列化格式Restful API设计规范
理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...
- win10 在任务栏添加 desktop 快捷图标
http://www.xitongcheng.com/jiaocheng/win10_article_11980.html [Shell] Command= IconFile=explorer.exe ...
- PIVOT(透视转换)和UNPIVOT(逆透视转换)
一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...
- 75.Java异常处理机制-手动抛出异常
package testDate; import java.io.File; import java.io.FileNotFoundException; public class TestReadFi ...
- window.open()居中显示
function openwindow(url,name,iWidth,iHeight){ // url 转向网页的地址 // name 网页名称,可为空 // iWidth 弹出窗口的宽度 // i ...
- java.lang.IllegalStateException: Failed to check the status of the service
java.lang.IllegalStateException: Failed to check the status of the service com.pinyougou.sellergoods ...
- ==和equals的区别。
1.java中equals和==的区别 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. 2.==操作比较的是两个变量的值是否相等,对于 ...
- git-tag 标签相关操作
标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签$ git tag -l ‘v0.1.*’ # 搜索符合模式的标签 打标签 gi ...
- 使用ccache大幅度加速gcc编译速度至少1倍以上(不需要修改任何编译选项)
因为我们整个项目都是使用c++开发的,生成的so足有50M,原来编译一遍要三五分钟,一个针对oracle,一个针对mysql,整个轮回下来这部分就要10来分钟,加上代码上传.翻译,一轮配管打包下来二三 ...
- 静态代码检查findbugs/阿里巴巴开发规范
findbugs,基本上三类严重的bug检测出来都是比较准确的,如下: 阿里巴巴开发规范 前面两类都是比较重要的: 参考: https://blog.csdn.net/qq_27093465/arti ...