商用区块链技术与实践
作者简介
本书由布比区块链团队核心开发者共同编著。该团队由大学教授、中国 科学院博士、资深区块链专家等组成。他们对区块链技术的本质和理论知识有深入的研究与独到见解,在区块链共识机制、智能合约、跨链技术、多链分片、隐私保护技术等方面具有深厚积累,并拥有数十项区块链核心专利技术;他们拥有区块链业务开发经验,透彻地理解区块链的技术内涵与应用外延,准确地理解客户需求与区块链技术间的契合价值,在过去的三年多时间里与上千家机构有过区块链技术科普和应用落地的交流,拥有丰富的区块链商业落地经验;过去四年,他们荣获过国内外多家专业机构(如福布斯、毕马威、中国计算机学会、中关村区块链产业联盟等)的奖项100余次。
内容简介
\"7.2 双层多态的主-子链体系Orbits 7.2.1 架构设计 Orbits扩容方案的设计兼顾区块链处理性能和数据安全两大指标,提出了双层多态的主-子链体系。该体系可以使区块链性能在随着子链及用户规模同步线性增长的同时,不牺牲区块链整体安全性。下面进行详细阐述。 如图72所示,Orbits扩容方案采用主-子链体系,让区块链更容易扩展。Orbits扩容方案将不同业务的交易处理、状态存储、交易下载和广播进行拆分,让不同子链的节点处理各自的业务。Orbits扩容方案包括两种类型的链:一种是主链(Main Chain),负责子链验证节点选取、子链区块提案人选取、子链状态存储、恶意行为惩罚等;另一种是子链(Child Chain)。在Orbits扩容方案中,可以存在多条子链,用户可以根据不同的业务特点搭建不同的子链。不同类型、不同业务的主链与子链体现出多态的特点。 Orbits扩容方案设计了高可扩展性的账本结构,主链和子链可以共用相同的区块链结构、账户树结构、共识算法体系,以便子链横向扩展。主链和子链是同构链,子链可以不生成原生资产,其链上交易可以进行统一化结算,比如基于主链原生资产进行结算。 图72 Orbits扩容方案还设计了多层体系化安全保证机制:在子链验证节点选举过程中采用混洗等机制,使得验证节点在子链上的分布均匀化、随机化;设计了可靠的主-子链的关键数据的关联机制,保证子链数据的安全性与合法性;设计了挑战者机制和子链区块确认机制,有效地抵御了贿赂攻击、恶意提交等攻击行为。 7.2.2 主-子链介绍 Orbits扩容方案设计了可校验的主-子链关联机制,在无须主链节点存储全部子链数据的情况下仍能正确校验子链数据。 如图73所示,主链记录子链的区块头关键信息,包括子链的验证节点列表、区块头信息、SPV、跨链收据等。比如,子链区块头信息由角色为提案者(Proposer)的节点提交到主链,主链校验其是否由当前子链验证节点签名,验证合法后将记录在主链,主链保存了从第1个区块到第N个区块的列表,其中K表示待确认区块的个数。 图73 在主链中,子链区块需要被延迟确认。主链在接受子链提案区块后,需要在指定周期内接受挑战者(Challenger)挑战。如果主链没有接受挑战或者挑战失败,那么认为该子链区块合法,并最终完成区块确认;如果主链挑战成功,那么回退至最后一个正确的区块位置。 在双层多态的主-子链体系中,基于统一账本、Firework共识算法、挑战者等机制,并使用可校验的主-子链关联方式,保证了Orbits扩容方案在不降低子链安全性的前提下,提升了区块链整体的性能。 子链在主链上被创建,共有3种状态:初始化(Initialized)、运行(Running)、挂起(Pending),如图7-4所示。 图74 这3种状态对应子链的3个动作,即子链创建、子链激活、子链挂起。 1. 子链创建 在主链上,用户通过触发交易创建子链,并传递相关的创建参数,如质押金(用于质押)、备付金(用于支付费用)、出块周期等。若创建成功,则被创建的子链进入初始化状态。 2. 子链激活 当主链上的每个Rotation周期(子链验证节点变更周期)开始时,如果子链处于初始化或挂起状态并满足激活条件,则被激活,并随机分配验证节点进行子链共识。 3. 子链挂起 当子链在主链上的备付金不足时,子链将会被挂起,其数据将会被存储节点(Archiver)归档。若在下一个Rotation周期里激活条件成立,则将重新进入子链激活状态。 7.3 高可扩展性的多链账本 账本是区块链数据存储的关键,随着区块链应用场景的复杂度越来越高,用户对账本结构设计的要求越来越多样化。多链账本结构设计的核心和难点在于,不仅要考虑区块链本身的复杂性,还要考虑多链体系下数据隔离和链间安全等各种因素。在Orbits扩容方案中,设计了高可扩展性的多链账本,可以满足复杂的业务场景需求。 7.3.1 多链账本设计 在Orbits扩容方案中,多链账本设计融入了以下要素:链间账本隔离、有效防重放攻击的统一账户、链间数据的可审计性。这些要素是适应复杂的业务场景的重要条件。 1. 链间账本隔离 在Orbits扩容方案中,主-子链、不同子链间的数据是相互隔离的,从而保证了资源和业务在不同链间相互隔离,避免了单链结构中资源被不同业务抢占的问题。 链与链的交易是相互独立的。参与一笔交易的双方必须属于同一条链,意味着交易记录仅属于一条链,不必在其他链中重复存储。这样独立的存储方式的优点是整个多链体系的存储容量呈线性增长态势。 2. 有效防重放攻击的统一账户 在多链场景下,理论上攻击者可以将同一笔交易分别发送给不同的链以获取不当利益,从而形成多链之间的重放攻击。为了防止重放攻击,Orbits扩容方案使用统一账户,只需要一个账户就能在多链之间发送交易以及转移资产。用户在查询账户信息时,仅需一个账户地址就能看到所有链的资产信息,使得重放攻击无法开展。 图75展示了防重放攻击的过程:普通用户Alice发送交易,比如交易为Tx1,内容为Alice转移数量为10的资产给Bob。Alice对交易Tx1进行签名,随后将交易发送给主链。主链通过统一标识(Unified Identity)0x1000识别出这是发给自己的交易(因为只有主链的ID为0x1000),然后打包交易Tx1。 图75 黑客截取该交易并尝试重放攻击,复制Tx1并发送到子链N,子链N的节点通过校验该交易中标识0x1000与自身标识不一致,所以判定该交易是无效交易。 3. 链间数据的可审计性 在多链体系下,不同链之间数据的可审计性非常重要。链间数据的可审计性是指审计人员能够在合理的时间和人力范围内,检验交易或收据的有效性。由于不同链之间的数据是相互隔离的,而在一般情况下有效性验证需要依赖全状态数据,这就给数据审计带来了巨大挑战。Orbits扩容方案的设计理念是增加可扩展性,但不需要每条链都存储全网数据,因此设计了存储节点。任何区块链节点均可以向存储节点请求审计证明,以校验某条记录是否存在。 7.3.2 多链账本的数据结构 Orbits账本通过数据结构的优化实现高可扩展性,具体包括全局统一账户结构、区块结构、交易树、收据树等。Orbits是一个同构链体系,采用全局统一账户结构,目的是让用户在只生成一对公钥和私钥的情况下,即可在所有链上发起交易,且多链之间的交易不会有重放攻击问题存在(参见7.3.1节关于重放攻击的描述)。其账户的数据结构与原始设计相同,账户树包括了从账户地址到账户状态之间的映射,保存了与智能合约相关的数据信息。账户树根节点的哈希值由区块保存(在account_tree_hash字段中),标示了区块在创建时的状态。每个账户都有一棵账户树。详细内容参见4.1节关于区块的描述,不再详述。 7.3.3 多级联动的账本索引设计 Orbits扩容方案使用了多级联动的账本索引设计,用户无须存储各条子链的全状态数据,仅在主链上就能安全、快速地检索到所有子链的资产和与交易相关的信息。 图76所示为多级联动的账本索引,详细描述如下: (1)assets。账户的资产列表信息,包含该账户所有链的资产列表信息。数据结构为[{chain_id,assets_list:[{amount, key:{code,issuer}}]}]。 (2)chain_id。链的ID信息。 (3)assets_list。某条链上的所有资产列表。 (4)0…15。表示当前树为16叉树,每个节点下有16个叶子节点。 图76 从图7-6中可以看出,路径(Root-B-F)下的账户在链ID为0x0001的链上有资产asset_1,如{amount:100,key:{code:'CNY',issuer:'0x123456'}}。 结合账户树的设计在资产字段添加chain_id标识不同链的资产,就能通过统一账户去关联不同链的资产信息。使用帕特里夏树(Merkle Patricia Tree,MPT)的特性快速定位账户的信息和及资产信息为全局统一账户实现快速索引提供了可能,方便了客户端快速查询账户的资产信息。\" 传统区块链解决了信任问题,但是仍然难以满足性能、成本、安全等要求。区块链系统的扩展性、安全性和隐私保护能力制约了区块链的实际落地,本书首先介绍了区块链的基础技术,然后对解决上述问题所需的关键技术进行了详细的介绍和深入分析,包括扩容技术方案、跨链技术方案、隐私保护方案,满足了商业应用的需求,并通过介绍bubichain的技术架构和开发指南,展示了商用区块链系统需要具备的产品化能力。 区块链商用的前景广阔,本书为你打开了区块链商业应用的大门!