基于区块链的五种开源技术平台
区块链的本质是DLT,即分布式账本技术(Distributed Ledger Technologies),目前比较活跃的有5个开源软件,分别是Hyperledger Fabric、R3 Corda、Ethereum、Facebook Libra、FISCO BCOS(分别简称为 Fabric、Corda、以太坊、Libra、BCOS)。
三种不同的框架在可能的应用领域上分别具有完全不同的想法,其中:
- Corda的起源来自于金融服务行业,其业务模型与标准的区块链存在较大差异,可以称之为一个受区块链启发的开源的分布式账本平台。
- Fabric设计提供一种模块化、可扩展的架构,可用于从银行、医疗保健到供应链等各个行业。
- 以太坊表现出完全独立于任何特定的应用领域。然而以太坊并未突出模块化,而重在为各种交易和应用提供一个通用平台。
运行模式(节点之间的地位)
在传统的集中式数据存储中,只有一个实体(即Owner,所有者)可以保留账本这一底层数据库的副本,这个Owner控制了全部的数据存储,并决定对其它实体提供什么数据。
DLT的出现,从根本上改变了集中的数据存储方式,实现了多个实体都拥有底层数据库副本,形成一种由所谓“节点”或“对等端”构成的网络。
根据网络架构中各个节点的地位是否相同或对等,存在两种不同的运行模式:
- 无授权模式(permissionless):交易的参与者无需授权,网络中的任何实体都可以参与交易,并获得全量账本。
作为公共区块链的以太坊采用无授权模式。 - 有授权模式(permissioned):交易的参与者是网络中少数预先选择(授权)的节点,并且仅限于这些参与者维护全量账本,而绝大多数最终用户只能作为Client,以代理或网关方式通过某些特定的授权节点参与交易。
Fabric和 Corda都属于有授权模式。
分布式账本和分布式数据库是两个完全不同的概念,虽然两者在技术上有很多相似之处。
从数据所有者的角度来看,TiDB、OceanBase等分布式数据库系统只有一个Owner主体,负责管理多个站点的数据副本;而分布式账本是多个互不信任的主体Owner来共同维护多个数据副本。
Corda
在Corda的网络结构中,包含多个不同类型的功能节点:
- 身份服务节点(绿色节点):负责全网身份服务的系统节点,实现类似于传统网络架构中的CA(Certificate Authority)功能。该节点负责颁发证书,设置权限,任何想要加入Corda网络的节点都需要从身份服务节点处获得相应身份。
- 网络映射服务节点(深蓝色节点):提供类似于传统网络架构的DNS服务,负责将节点的证书及所提供的服务与其IP地址相关联,便于其它节点进行查询。
- 普通用户节点(淡蓝色节点):普通用户可以自由发起交易。交易产生后,被发送给指定的公证服务节点来验证其唯一性和有效性。如果交易合法,该公证服务节点便对这笔交易签名,并发回交易关联方。交易关联方及公证服务节点各自将该笔交易链接到之前的交易,形成“交易链”,达到交易关联方之间数据的局部统一。
- 公证服务节点(黄色节点):公证服务节点之间通过共识算法来保证全网数据的准确唯一性。Corda计划兼容多种共识算法,由不同的应用场景决定使用何种共识算法,目前提供了基于PBFT/RAFT共识算法的公证服务的实现。由于Corda平台的共识是在公证服务节点之间互相达成的,为了减少交易延迟,提升交易吞吐量,开发团队建议将同一个网络的公证服务节点物理上放在一个区域。
- 价值中介服务节点(黑色节点):价值中介服务节点是一种负责和区块链网络外部取得可靠数据的节点。Corda网络可以通过价值中介服务节点获取现实世界的实时数据,从而提供多样化的交易场景。
Fabric
与Fabric v0.6相比,v1.0的运行模式有了巨大变化,可以称之为”伪去中心化”,最新的v1.4的节点定义为:
- 客户节点(Client):客户节点代表最终用户,创建并调用交易。他们与对等节点和订购节点沟通。
- 对等节点(Peer):对等节点维护账本,并接收订购节点订购的更新消息,以向账本提交新的交易。其中,背书节点(Endorser)是一类特殊的对等节点,任务是通过检查自身是否满足一些必要的和充分的条件(例如提供所需的签名),对交易提供背书。
- 排序节点(Orderer):订购节点在Client和Peer间提供了通信通道,用于广播包含交易的消息。特别是对于共识,这些通道确保了所有已连接的对等节点按照完全相同的逻辑顺序传递完全相同的消息。
Libra
Libra也采用有授权模式,协议中有两种类型的节点:
- 客户端(client):client负责发起提交交易,查询信息等,比如钱包就是一个典型的 client。
- 验证器(validator):validators就像是元老会,会轮流着产生提议者(leader),用来将当前的交易定序、打包形成区块,并且共同维护着数据库的一致性。
共识算法(多个节点的工作协同)
选择无授权或有授权的参与模式,将对达成共识具有深远的影响。
由于数据是分布式存储(或者,更准确的描述是分布式管理)的,因此难以确保所有节点对一些“共同事实”(例如,账本的正确性)达成一致。因为一个节点所做的更改,必须传播到网络中的所有其它的对等节点上。达成共同事实的结果,称之为节点间的共识(consensus)。
在区块链中,无论参与者是否参与了某个特定的交易(Transaction),所有参与者必须就全部已发生交易的顺序达成共识。交易的顺序对账本的一致状态至关重要。如果无法建立明确的交易顺序,那么可能会出现双重支付(double-spends,也叫双花交易)问题,即两笔并行交易将同一枚货币转账给了不同的收款人,使其凭空受益。
以太坊
由于网络所涉及的各方可能是互不信任的,并且是匿名的,因此必须采用共识机制来保护账本免受双重支付欺诈,或者心怀鬼胎参与者的影响。在目前的以太坊实现中,这种共识机制的建立是使用挖矿方案,也叫基于工作量的证明(PoW,Proof of Work)。
所有参与者必须认同一个共同账本,并且可以访问账本中所有的记录条目。其结果是PoW会对交易的处理性能产生不利的影响。尽管记录是匿名的,但是存储在账本中的数据仍然可供所有参与者访问。因此对于有更高隐私度需求的应用而言,这种机制存在问题。
Fabric
Fabric的节点在达成共识的过程中承担了不同的角色和任务,其交易流的的基本步骤为:
- Client向已连接的Endorser(Peer)发送交易,启动对账本的更新。
- 所有Endorser都必须就提出的交易达成一致,因此需要根据更新所建议的账本达成某种共识。
- Client依次收集所有Endorser的批准,然后将经批准的交易发送给已连接的Orderer。
- 所有Orderer就本批次被批准的交易再次达成共识。
- 本批次交易将被转发给持有分类账的Peer,并最终提交交易。
但由于涉及多个互不信任的订购节点,在传递消息时也可能会出现错误,因此仍然必须引入一致性算法,使得在出现故障(例如,消息顺序不一致)时可以达成一致,从而使分布式账本的复制过程支持容错。
Fabric所采用的算法是“可插入的”,即可以根据特定应用的需求而使用各种算法,不再仅仅局限于基于PoW或其它衍生物的挖矿。例如,为了处理如上所述的随机或恶意复制错误,我们可以使用拜占庭式容错(BFT)的一种变体算法。
不同于以太坊,Fabric运行在授权模式下,只有参与交易的节点(Peer & Orderer)才必须要达成共识,因此性能上有了明显提高。此外,由于通道划分了消息流,这意味着Client只能看到它们连接通道中的消息及相关联的交易,而不知道其它通道的情况,因此可为记录提供更细粒度的访问控制,从而增强了隐私。
目前Orderer是用一个中心化的Kafka cluster来做的,所以这里也没有拜占庭容错共识了!但是IBM说,这个地方是留给你自己开发BFT接口的,或者,你付钱给我来开发???
Corda
类似于 Fabric,Corda 的共识也是在交易层面达成的,仅涉及交易的各方。交易取决于共识是满足交易合法性(validity),还是交易唯一性(uniqueness)。
交易合法性通过运行与交易相关联的智能合约代码(智能合约将在下文给出详细介绍),检查需要的所有签名,并确保所引用的任何交易也是有效的。
交易唯一性涉及交易的输入状态。具体而言,必须确保有疑问的交易是所有输入状态的唯一消费者。换句话说,不存在任何消耗同一状态的其它交易。这是为了避免产生双重支付。
实现交易唯一性的共识,是在称为“公证人”(Notary)的参与节点中达成的。其中使用的算法和Fabric一样,是“可插拔的”。因此,我们同样可以使用 BFT 算法。
内建代币
在区块链技术的应用上,有“币圈”和“链圈”的说法,当然从技术层面,我们并不关心数字货币的炒作,但其中也可能涉及内建代币。
以太坊提供一种称为“以太(Ether)”的内置加密货币。以太用于向帮助通过挖矿达成共识的节点支付奖励,并支付交易费用。因此,去中心化应用(DApps)可以基于支持货币交易的以太坊构建。此外,通过部署符合预定义标准的智能合约,可以创建为用例定制的数字代币。使用这种方式,人们可以定义自己的货币或资产。
Fabric 和 Corda 不支持通过挖矿达成共识,因此不需要内建的加密货币。但是使用Fabric,也可以开发本地货币,或是带有区块链代码的数字代币,例如Libra。使用 Corda,不建议创建数字货币或代币。
智能合约
在第一次接触“智能合约”(smart contract)一词时,人们难免会产生相当大的误解,将其理解为某种智能地表达了某人利益的合约。尽管合约的本质仍然存在含糊不清之处,但是在直观上它似乎应与法律有关。也就是说,我们所关注的合约在本意上并非智能的,至少目前仍尚未由人工智能驱动,也尚未在其中编入具有法律约束力的义务和权利。
Clark 及其同事在给出“智能合约”这一有用术语时,强调指出了该术语的两种不同的常用方式。第一种方式是智能合约代码(smart contract code),另一种方式是智能法律合约(smart legal contracts)。
以太坊
智能合约代码就是用某种编程语言编写的软件。它作为一个软件代理,或是代表其中某一方,目的是履行某些义务、行使某些权利,并以自动的方式控制分布式账本中的资产。因此,智能合约通过代码执行模拟,或模拟现实世界中合约逻辑,承担了分布式账本的任务和责任,尽管其合法性可能尚未明确。
所有的DLT都支持以智能合约代码的形式履行智能合约。代码可以使用Go、Java for Fabric、Solidity for Ethereum,以及Java/Kotlin for Corda 编写。
Fabric
在Fabirc中使用了术语“链码”(chaincode),以此作为智能合约的同义词。
Corda
Corda为确保交易的有效性,会提醒读者在共识机制中使用智能合同代码。同时,Corda的智能合约不仅可以包含代码,还允许包含法律行文(Legal Prose)。因此,上述智能法律合约是法律行文,其制定方式可以通过智能合同代码来表达和实施。
其背后的基本原理,是赋予植根于相关法律行为的代码以合法性。这种结构称为“Ricardian 合约”。这清晰地表明,Corda 是设计用于金融服务行业这一受严格监管的环境。而 Fabric 和 Ethereum 都不具备此功能。
总结:定制平台 Vs 通用平台
1.以太坊
以太坊是一种强大的智能合约引擎,基本上可作为任何类型应用的通用平台。
但是,以太坊的无授权操作模式及全面透明度,是以牺牲性能可扩展性和隐私性为代价的。
2.Fabric
Fabric采用有授权的操作模式,即使用 BFT 算法和细粒度访问控制解决了性能可扩展性和隐私问题。
此外,Fabric的模块化体系结构使其可以针对众多应用进行定制。我们可将 Fabric 比做一个多功能的工具箱。
3.Corda
Corda被设计为一种专门用于金融服务行业的DLT,专注于金融服务交易使Corda得以简化其架构设计,因此Corda可以提供更多的开箱即可用体验。
值得注意的是,Corda通过增加法律行文的智能合同,考虑了受高度管制的环境。
不过,Fabric的模块化支持定制类似于Corda的功能集,一些工作力图将Corda纳入Hyperledger项目。因此,不能将Corda视为Fabric的竞争对手,而更多的是一种补充。