区块链三大主流技术:以太坊(Ethereum),超级账本(Hyperledger Fabric),科尔达(R3-Corda)简单分析
区块链三大主流技术简单分析
2014年是由俄罗斯人Vitalik Buterin发起的区块链项目,是区块链2.0的代表,是现在最流行的公链,它是一个区块链的平台,可以在上面开发各种智能合约,部署后合约就永远生效,需要支付一些代币(ETH)。以太坊的愿景是创建一个无法停止,抗屏蔽(审查)和自我维持的去中心化世界计算机,目前为共识机制为:工作量证明(POW)+权益证明(POS)混合模式。
Hyperledger 是一个旨在推动区块链跨行业应用的开源项目,是首个面向企业应用场景的开源分布式账本平台,由 Linux基金会在2015年12月主导发起该项目,成员包括金融,银行,物联网,供应链,制造和科技行业的领头羊。Hyperledger Fabric是目前超级账本项目中发展最好的子项目,作为最早加入超级账本项目的顶级项目,Fabric 由IBM 、DAH 等企业于2015年底提交到社区。该项目的定位是面向企业的分布式账本平台,创新地引入了权限管理机制,设计上支持可插拔、可扩展,是首个面向联盟链场景的开源项目。作为联盟链最重要的代表,Hyperledger Fabric具有良好的设计架构、完善的文档、清晰的代码,是企业研发和实施区块链的首选。
R3公司创始于2014年,正式成立于2015年9月,是一家区块链创业公司,主要致力于为银行提供探索区块链技术以及建立区块链概念性产品。迄今R3联盟已拥有70多家金融机构,100多会员,成员几乎遍布全球,通过这个联盟一起研究区块链在金融业的应用,运用它的分布式账本技术帮助金融机构变革基础设施,节约成本,提高效率。Corda 是由 R3 推出的一款分布式账本平台,其借鉴了区块链的部分特性,例如 UTXO 模型以及智能合约,但它在本质上又不同于区块链,并非所有人都可以使用这种平台,其面向的是银行间或银行与其商业用户之间的互操作场景。Corda是由网络参与者运营的可公开提供的Corda节点互联网。每个节点由网络身份服务颁发的证书标识,并且还可以在网络图上标识。
以太坊每个节点都是去中心化的,每个节点都运行一个以太坊客户端就是“节点软件栈”,智能合约先是部署在BlockChain然后在EVM(以太坊虚拟机)里面运行,然后在P2P网络里面同步。账号,密码等都在节点软件栈里面。
流程:
在传统区块链结构中,网络上的每个节点是由匿名的公钥来辨认,然而它们并不能够确认身份,另外这些节点的消息是没有加密的,并采用广播的方式将消息发布给每个节点,这样不符合实际的业务需求。因为在真正的企业达成法律协议的时候,需要的是在法律上可以识别的身份来达成协议,而不仅仅是一些匿名的公钥。在corda的网络中每个节点加入的时候需要经过一个身份认证,加入网络之后,它们会像一个Network Map Service(网络地图服务):发布身份和IP地址,通过该地址可以访问所有节点以及节点提供的证书和服务。
3.1.1.以太坊工作量证明(POW) Ethereum与bitcoin一样,采用的都是基于工作量证明(POW)共识产生新的区块,与Bitcoin不同的是eth采用的是可以抵御ASIC对记账(挖矿)工作垄断的etHash算法:ehHash算法增加了对内存访问的需求,因为Asic芯片矿机只是算力非常强,但对内存的访问功能不足。
etHash的主要思想是设计一大一小的2个数据集,初始大小是: 小:16M的cache 大:1G的dataset(DAG) 设计一大一小的目的是:大的数据集是小的cahce通过计算生成的,矿工为了能更快的挖矿只能保存大的dataset,以免重复计算耽误时间,而轻节点只需保存保存小的cache即可验证。流程图:
3.1.2以太坊权益证明(POS) POW对能源的消耗巨大,2013年点点币(Peercoin)系统中提出并实现了另一种共识机制——权益证明,权益证明将让整个记账(挖矿)过程虚拟化,并以验证者取代矿工。 Csaper是以太坊选择实行的POS协议,它能避免“无成本利益关系(恶意使区块链分叉)”的问题,运行过程为: i. 验证者必须锁定一些他们拥有的币作为保证金。 ii. 在此之后,他们将开始验证区块。同时,当他们发现一个他们认为可以被加到链上的区块时,他们会通过下赌注来验证它。o:p iii. 如果该区块成功上链,验证者就将得到一个与他们的赌注成比例的奖励。 iV.但是,如果一个验证者采用一种恶意的方式行动、试图做“无利害关系”的事,他们将立即遭到惩罚,他们所有的权益都会被砍掉。
由于fabric是分布式的系统,因此需要共识机制来保障各个节点以相同的顺序状态保存账本,达成一致性。fabric 广义的共识机制为三个阶段:交易背书,交易排序,交易验证。而有些认为“交易排序”是属于共识,在当前fabric1.4版本中,存在三种共识机制,分别是solo,kafka,etcdraft。交易排序图:
排序节点收到该交易以后会按照通道进行拆分,拆分以后再进行排序,也就是说排序并不是全局排序,而是按照每一个通道单独排序,最后分别组装成区块发往主节点,通道之间是相互隔离的,它们并不会知道彼此的存在,但是每一个组织的节点都可以订阅多个通道。 Solo共识模式:指网络环境中只有一个排序节点,从Peer节点发送来的消息由一个排序节点进行排序和产生区块,由于排序服务只有一个排序节点为所有Peer节点服务,没有高可用性和可扩展性,不适合用于生产环境,通常用于开发和测试环境。 Kafka 共识模式:对所有交易信息进行排序(如果系统存在多个channel,则对每个channel分别排序)。Kafka是一个分布式的流式信息处理平台,目标是为实时数据提供统一的、高吞吐、低延迟的性能。 Etcdraft 共识模式:它是一种基于 etcd 的崩溃容错(CFT)排序服务。遵循 “领导者和追随者” 模型,其中领导者在通道中的orderer节点之间动态选出,该领导者将消息复制到跟随者节点。由于系统可以承受节点(包括领导节点)的丢失,只要剩下大多数排序节点(即所谓的“仲裁”),Raft就被称为“崩溃容错”(CFT)。换句话说,如果一个通道中有三个节点,它可以承受一个节点的丢失(剩下两个节点)。
系统中有多个公证人(notary),当一个公证人(notary)变更的时候,该对象的当前公证人把这件事广播通知系统中的所有其他公证人,其他公证人按照交易规则,查询自己的STXO库,看看这个对象是不是在自己这里以前发生过交易。如果共识的结论是这个对象目前不是STXO,因此可以交易,则系统中的各个notary就可以接受这个交易,并且将该对象记录到自己的STXO数据库中,使其成为已经交易的状态,从而杜绝这个对象未来可能的双花。而后,发布这个变更消息的notary,也应当根据这个共识的结果,最终确认这个变更交易,产生新的UTXO。这样一来,notary变更交易就正式完成了。反过来,如果共识的结论是“这个对象以前就是STXO”,那么各个节点就通过这个共识拒绝了这个交易,他们自身不需要做额外的动作,而发布变更消息的节点,也不应该为这个交易提供确认。
Solidity:是一种智能合约高级语言,运行在以太坊虚拟机(EVM)之上。它的语法接近于JavaScript,是一种面向对象的语言。是基于账户,而非UTXO(未花费的交易输出),所以有一个Address(地址)的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个账户)。由于语言内嵌框架是支持支付的,所以提供了一些关键字,如Payable(付款),可以在语言层面直接支付,而且超级简单。存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行,分布式的感觉。它的异常机制,一旦出现异常,所有的执行都将会被撤回,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
RemixIDE: 是一个Solidity网页版的开发环境,是一个轻量的依赖网络的开发工具,编写简单的Solidity通常使用RemixIDE。
Truffle:是针对基于以太坊的Solidity语言的一套开发框架。本身基于JavaScript,提供了一套类似maven或者gradle这样的项目构建机制,能自动生成相关目录对客户端做了深度集成。开发,测试,部署一行命令都可以搞定。Truffle编译Solidiy后会生成一个ABI(二进制交互接口)文件和BIN(纯二进制文件)文件,通过这两个文件就可以把我们合约部署到我们链上。目前主流使用Atom和Visual Studio Code作为开发工具。
Web3.js 是一个通过RPC(远程过程调用)调用和本地以太坊节点进行通信的JS库,你可以使用HTTP或IPC连接本地或远程以太节点进行交互。Web3.js可以与任何暴露了RPC接口的以太坊节点链接。Web3的JavaScript库能够与以太坊区块链交互,它可以检索用户账户,发送交易,与智能合约交互等。Web3中提供了ETH对象 -web3.eth来与以太坊区块链进行交互。 结构流程:以太坊GETH主要提供一个JSON-RPC的服务器就是一个远程调用,它允许别人去调用它,接口类型是JSON-RPC。JSON-RPC直接调用不太方便,所以以太坊就提供了一个WEB3.js的这么一个javaScript库,它封装了JSON-RPC的一些接口。可以让我们非常方便的去调用JSON-RPC的API,然后我们的GETH再和我们的以太坊网络进行相连,WEB3.js不能直接访问我们的以太坊网络。然后我们智能合约用编辑器编写部署到我们以太坊GETH网络中去。将ABI文件传给WEB3.JS,WEB3.JS传合约对象。
在Fabric中智能合约也叫链码:是应用程序与底层区块链交互的媒介。做Fabric项目,我们需要写链码然后部署在Fabric上,最后基于Fabric提供的SDK写一个应用程序与部署上区块链上的链码进行交互。链码支持编程语言有go,java,node.js链码有一整套独立的生命周期管理:
应用程序发起一个交互请求到背书节点,背书节点收到这个消息之后会去调用容器管理模块看看链码容器是否在运行,如果没有启动就会去编译并且启动容器,启动后的容器会跟背书节点建立一个GRPC连接,连接建立好以后背书节点会从应用程序发送过来的请求转给链码进行执行,链码执行完成以后会返回一个执行后的结果,背书节点收到这个结果以后调用ESCC对这个结果进行签名背书,最后将背书结果返回给应用程序,这就是整个链码的交互流程。签名ESCC这是一种系统链码,虽然是链码但是它们运行在节点进程中的而不是链码容器的形式存在。 Fabric的SDK支持:go,java,node.js
Corda 使用 Kotlin 作为开发语言,合约可以使用Java、Kotlin或者其他基于JVM的语言来编写。选择Kotlin的原因是:相比其他目前区块链流行的语言,比如C++或Golang,Java系有最强大的生态支持,和成熟的基础设施积累。因为是面向金融行业,应用技术栈也以Java为主(因为主导企业IBM、Oracle等为主),进而使得更换系统尽可能小,开发更容易。对于金融行业这样有着厚重历史积累(技术包袱),以及各种异构系统,Java(JVM)平台有更成熟和强大的集成能力(比如数据仓库、离线计算等)。除此之外,相比Java以及JVM平台的其他语言(Clojure、Scala、Ceylon等),Kotlin又平衡了语言灵活性和健壮性(相比Java提供了更多语言层面的改进,比Clojure、Scala又具备更平滑的学习曲线,同时IntelliJ官方对Kotlin的支持更强大)。 Corda 智能合约主要用Gradle作为项目工具,代码主要分文三个主要部分: State(状态):主要是对账本的操作,对数据的操作。主要API为Party(用来编辑数据属性状态)和ContractState(用来操作传递数据) Contract(合同):用Verify组件验证交易的有效性,智能合约的相关条件写在这个组件中。在Contract中账本的更新通过Transcantion来实现,主要是由Input和OutPut来操作。 Flow(流程):开发者可以任意改变具体执行的顺序和节点的互动。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!