联盟链Fabric和公有链比特币的区别
最近研究了一下联盟链的代表超级账本这个开源项目,准备再做一个Fabric的源码分析系列,本文先总结一下Fabric和比特币的一些关键性的区别或者也可以称为改进和创新,阅读本文前建议读者先了解下比特币源码或者对比特币原理有初步认识,可以阅读笔者的比特币源码分析系列(还没有完成)。
区别一:引入了msp管理机制
比特币中的交易是发送方通过私钥签名交易,把交易内容和公钥一起广播出去,接收方收到交易后通过公钥对交易做签名验证来完成交易的认证。具体过程如下图:
其中每一个参与个体都会生成一个公私密钥对,这个是谁都可以生成的,每一个公私密钥对都是被整个比特币网络所接受的,所以是一个开放的体系。而联盟链对此做了限制也就是msp(Membership Service Providers)其实简单来理解就是有一个公钥池,所有联盟链的网络中出现的公钥必须在公钥池里,来保证参与网络的成员的是可信的。
区别二:图灵完备的程序语言支持
比特币体系下支持了一套比较简单的指令集合,这个指令集仅仅提供了一些最基本的验证等指令,非图灵完备。但是以太坊发明后,区块链就进入了2.0时代,其中最标志的的改进就是引入了图灵完备的编程语言。而联盟链沿用了这个改进的技术方案。其中Fabric支持比较好的是go语言的脚本支持(Fabric本身就是go语言开发的),具体的实现本文简单的给出一个架构图,后续文章会详细介绍,其中图中的链码就是go语言开发的在区块链体系下的协议脚本,也称为智能合约。
如上图,用户开发的链码(智能合约)会被放在一个docker虚拟机中执行,链码的api调用会通过调用api代理客户端进而通过网络通讯,调用到系统链码,最后作用到数据库中。
区别三:引入了状态数据库
在比特币体系中,只有区块一个数据库,数据库中存放的是区块,其实是一个区块链的结构,而账户的资金状态信息是通过utxo这个机制来保证的,其实类似于复式记账法的一种机制,数据库中并不记录你当前账户的余额,只是记录每一笔交易,从哪儿来到哪儿去,一个账户想花钱,只能先找到一笔输出到这个账户的交易,然后生成一笔输出到别人的交易。说的有点绕,具体可以参考笔者比特币源码系列中关于交易的讲解。
而Fabric中维持了一个状态数据库,记录了每一个账户的余额(或者叫key-value状态更确切),虽然在utxo体系中通过一笔一笔的交易也可以构造出一个这样的数据库(其实比特币也是这么做的,只不过这个数据库只在内存中),但是Fabric把这个数据库专门隔离了出来,这样最起码对链码的编写十分有利方便。
区别四:引入了通道的概念
在比特币中只有一个大家共有的区块链,而Fabric引入了一个叫做通道的概念,每一个通道都有自己独有的区块链,各个通道之间互不干涉,相当于比特币是一个支持单进程的系统,而Fabric支持了多进程。
区别五:去除了pow的共识,改用了order模式
比特币一直被某些人诟病的是它的算力浪费,比特币体系的维持是通过挖矿来实现的,而挖矿其实就是不停的改变一个字段的值,让整个区块的hash值前n位为0,这样做的目的其实是让区块生成是需要工作量的,保证了它的串改难度高。比如一个黑客想串改10个区块的内容,他就要先于网络中其他的节点先构造出来10个hash前n位是0的区块,这个工作量是巨大的,在特定的时间内很难实现。
Fabric将挖矿的方式变了,用order方式,简单来讲就是把挖矿构造一个hash前n位为0的区块,变成了构造一个有order节点签名的区块。谁先得到了order的签名谁就挖到了矿。(不过这里其实挖矿集成到了order服务器上,只有order有权限挖矿,它把交易收集起来,排序,组成区块,签名,然后广播出去)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。