分层与跨链
高可拓展性
腾讯云如何构建分层与跨链的高可扩展性区块链平台?日前,腾讯云区块链专家工程师刘长辉出席参与了Hyperledger中国主办的区块链在线研讨会,分享了腾讯云区块链针对区块链跨链技术方案的思考与实践,助力行业推进基于区块链构筑大规模可信的信息协作生态。
以下是分享内容精华:
产业区块链面临的挑战与我们的设计思考
今年区块链也被纳入到了新基建范围。从功能上来说,区块链集成了密码学与分布式数据库等技术,能够有效并且安全地实现跨组织的数据共享与协作。而从规模上来说,区块链如果要满足新基建这么大的规模,还面临很多扩展性方面的问题。
总结一下这些问题,具体包括:
扩展性问题:
单个区块链能够承载的数据量是有限的。区块链为了追求去中心化、消息不可篡改和可追溯,付出的成本代价是比较高的,远比我们通常使用的数据库成本要高。所以用单个区块链承载整个产业互联网数据量的规模不太现实 。
第二,单个区块链不能满足不同业务的数据管理模式,而产业区块链会有各种各样的业务,每个业务会有不同的管理模式,比如共识机制不同、背书策略不同等。不同业务全部揉在一个区块链里也不现实。所以说单个区块链不能满足不同业务等数据管理模式的需求。
第三个方面,现在每个区域、业务都会构建自己相对独立的区块链,但又有跨地域、跨业务的协作需求。
面对这些扩展性问题,我们的方案是:通过跨链解决区块链水平扩展问题,通过分层解决跨链的效率与监管问题。因为区块链强调去中心化,所以强调各个参与方之间要相互验证,而在产业互联网里面数据量规模很大,不同业务、不同地域的链之间是相互平行或平等的,没办法去验证其他业务链的数据是否正确。
所以这个时候就有了分层的概念,层级化的治理模式可以提升效率,并且满足监管要求。满足监管要求这一点很好理解,我们整个社会包括政府包括企业都是层级化的。区块链分层其实相当于是牺牲了一部分去中心化特性来提升效率。如果没有分层那整个区块链就是一个完全扁平的结构,要做共识需要所有人来投票,共识的节点规模非常多,如果把它变成层次化的,可以让共识的范围限制在一小部分节点,共识的规模就少了很多。比如在比特币里面,为了提升比特币的效率,在比特币的上面构建第二层系统,也是分层的思路。
跨链应用场景分析
讲完扩展性问题之后我们再分析一下产业区块链领域的跨链场景是什么样的,其实它跟数字货币里的跨链分层度还不太一样。简单来讲,产业区块链的跨链场景就是“分区间建链,全范围跨链”。
分区间建链,全范围跨链
分区间建链是指按业务或者按地域去构建区块链系统,业务或地域之间又有数据共享的要求,举几个简单的例子,在教育系统中,某个学生在广东上学,广东省就会有各个市区的区块链,如果升学或者转学了去到福建省,就涉及到原来在广东落地的区块链学籍、档案、证件、考试成绩等数据,都需要要转移到福建。虽然广东省和福建省的链平时交集较少,但当涉及到转学升学等情况时就会产生跨链的请求。
政务领域也是一样道理:居民办理户口迁移、转换工作地点后迁移社保迁移等这类情况通常来说我们要跑好几个地方才能完成。
总结来说,产业区块链跨链的特质:
第一,是层级化的治理,满足治理现有的体系。
第二,会有监管部门会制定各种规范,业务部门会按照规范实施业务。监管部门其实也不会太多地参与到业务里面,而是只是制定规则。
第三,实名身份,按身份授权。因为产业区块链基本上都是用联盟链的方式,只有被许可的机构或者用户才能加入进来。
第四,跨链数据的可验证。比如一个学生从广东转学到福建,在数据跨链的过程中,福建的链就要验证迁移进来的数据是否准确,不允许在跨链过程中存在可篡改数据的可能性,即使是跨链数据也要做到可验证、可追溯。
第五,支持敏感数据的安全传输,这个对于区块链来说很好理解,我们使用区块链管理的数据都是比较比较敏感的数据,要么是和金钱相关的,要么是和用户隐私或者企业隐私相关。
跨链设计的目标要求和原理:高可扩展性的企业级区块链平台
腾讯云区块链跨链方案的设计目标是一个分层可扩展的区块链多链网络,以实现高可扩展性的企业区块链平台。
主要分成四个方向:
第一,是能支持大规模跨部门、跨地域的数据协作。
第二,要能够灵活地跨链,实现任意多个链之间的灵活跨链,要做到灵活就不能依赖于事先创建跨链通道这种方式。
第三,层级化的治理。平行的应用链之间不需要相互验证,他们彼此也验证不了对方,所以我们想办法通过一个共同可信的层级来建立平行链的信任关系,这个可信的层级类似于跨链的桥梁。
第四,支持敏感数据的安全流通。
跨链设计实践:跨链的关键问题
应对产业区块链的跨链需求,我们面临的关键问题有哪些?
第一是链与链之间的信任机制。比如一个链要和其他链建立跨链连接,首先得互相信任,建立起链与链之间的信任机制。
第二,跨链互操作的数据一致性。跨链通常会在一笔交易中修改多个链上的数据,这些操作要么全部都成功,要么全部都失败,确保数据的最终一致性。
第三,要实现可验证的数据结构。对于区块链来说,数据的可验证性是关键,如果不可验证就和数据库没有区别。比如使用数据库时,客户端提交一个请求,数据库返回一个成功响应,客户端就认为数据库已经提交成功。这种方式对于区块链来说是不可验证的,在区块链中,除了要求身份可验证,还要求数据可验证,如果要验证一个数据是否提交,需要验证数据是否包含在某个已提交的区块中,并且这个区块已经通过哈希的方式形成了链。比如刚刚的例子,一个学生从一个省跨到另一个省,这个学生的身份信息应该要能够被验证,这个学生之前有学校颁发的奖状信息也要可验证,这里就包含了用户可验证和数据可验证两个方面。
最后重要的一点是如何实现高效跨链。
跨链设计实践:高性能可扩展、安全可信的跨链解决方案
带着这些问题我们就来探讨一下符合这些要求的区块链跨链方案可以怎么设计。
1. 系统架构:分层互联,解决问题的万金油
分层可以说是解决扩展性问题的万金油,比如网络模型里分成七层结构。
腾讯云区块链采用分层互联的架构,主要分成两个大层面,包括应用层与治理层。
应用层可以构建大量平行的应用子链,应用子链可以有不同的业务、不同的治理模式。子链只需要聚焦自己的区块链应用,并提供相关的API,并不需要关心复杂的跨链流程是怎么样实现的,因为跨流程转移到治理层去实现。
治理层我们再细分为两部分,底层是跨链数据层,跨链数据层可以管理上层应用子链的路由信息,比如某个链要与另一个链建立联系,它得知道怎么联系到对方,所以路由信息就存在于跨链数据层。跨链数据层相当于一个公开的通讯录,管理身份信息,例如,一个学生的数据可以在不同的省份间跨链,其身份验证就需要由跨链数据层来管理。
在跨链数据层之上有一个跨链事务层,这个跨链事务层负责处理跨链事物的一致性。各个链之间的一笔操作,要么同时成功要么同时失败,都由跨链事务层来解决。同时,跨链事务层还要解决数据的跨链过程中的可验证性,即使是跨链数据也可以验证是从哪里来、修改成什么样。
2. 身份管理——信任的基石
跨链数据层里面存的信息其实就是身份信息。身份信息是信任的基石。对于联盟链来说,所有的操作、权限都是基于身份进行处理的。
身份结构
我们规范了统一的身份系统以实现跨区块链的身份验证,身份主要包括:
身份ID,这是身份的唯一标识码;
身份类型,身份类型可以是:个人、设备、机构、应用子链。其中应用子链的身份类型在跨链中扮演关键作用,每个应用链都有其身份,可以基于身份实现区块链的服务发现功能。举个例子,广东省建了一条和学籍相关的链,这个学籍链也会有个身份,这个学籍链上可能会有很多学生的信息,这些学生的身份就是个人身份,学籍链就是应用子链的身份。每个身份对应对应一对公私钥,公钥公开在身份中,私钥由持有者私下保存;
身份服务,是身份中最重要的部分,记录这个身份关联的网络服务地址,身份类型会分成两大类:如果身份类型是机构或者应用链,那么身份服务就是对外提供的网络服务,比如资源的查询API,或资源更新的API;个人的身份服务就是管理该个人数据的应用子链的身份ID,比如我在深圳,我的个人身份服务可能就是深圳某个链上的服务地址。
将上述身份数据以区块链的形式来管理,就构成了身份链,身份链会提供统一的身份系统,为跨链提供身份的注册、查询、验证等等。
2.1 跨链第一步:基于身份的区块链服务发现
有了身份链之后,我们就可以走出跨链的第一步——服务发现,基于区块链的服务发现该如何实现呢?
身份链其实作为一个公开透明的身份注册信息系统,除了提供对身份的信任背书之外还提供区块链的服务发现。比如新建了一个链,如果这个链要和其他的链进行跨链操作,那就需要把这个链的身份注册到身份链上,其他应用就可以在身份链上查询新链的服务地址,比如更新或查询数据的API。
2.2 跨链通信
跨链查询
有了服务发现之后就可以实现跨链查询。跨链查询是跨链里面的一小步,我们看看如何通过身份服务实现跨链查询。
这个图上下左右一共有四个角色:最底层的身份链,用户申请者C,链A和链B。这个场景是:用户的数据托管在链A上,用户要授权链B去查询其托管在链A上的数据。这个场景中的A、B、C三方都需要去身份链上查询其他二者的身份信息,以验证对方的请求是否具备合法身份的数字签名,以及查找对方的服务地址。身份链通常是由监管部门管理,如果发现某个身份有问题可以进行冻结;身份链是公开的,如果有身份问题可以举报。
这里还有一个细节:比如应用子链B要查询身份链,还要查询链A,涉及到跨链查询的功能,也就是区块链中的预言机功能。
预言机实现:通用版与联盟链简化版
预言机,简单而言,是区块链外的信息写入到区块链内的机制。
上图我们把区块链的节点分成两类:一类是普通的区块链节点,另一类是预言机节点——可以执行预言机的合约。预言机节点中内置了预言机模块。当我们要访问链外的数据时,通常是调用预言机的智能合约,去读链外的数据;预言机再把链外数据写入到区块链,继而同步给其他的区块链节点,并把数据写到状态数据库,这样一来普通的智能合约就也可以使用这些数据。
之所以需要专门的预言机,是因为大部分的智能合约其实不能够直接访问网络资源,虽然部分区块链的智能合约采用通用的编程语言也可以调用网络接口,但直接让智能合约调用网络接口其实是不规范的做法。通过预言机来统一管理网络接口的调用,并将外部的数据最终写入区块链中,可以方便对链外数据进行验证和追溯。
上述流程比较复杂,而对于联盟链来说有更简单的方案,因为联盟链的节点规模并不大,可以简化开发流程和部署方式。
如图,验证节点和预言机节点可以融合在一起,就是通用的区块链节点。智能合约也不区分预言机智能合约和普通的智能合约,而是统一的一份智能合约——这份智能合约可以像普通智能合约那样既可以访问数据库,也可以访问预言机,智能合约的调用过程也需要通过共识与验证。
简化版的数据流程就是:
1)调用智能合约,查询外部数据的指令被分发到预言机;
2)预言机代理合约去外部服务查询数据;
3)预言机将查询到的外部数据返回给智能合约;
4)智能合约直接采用外部数据进行下一步处理,并将最终结果写入状态数据库;
5)智能合约处理的最终结果,与预言机获取的中间结果一起被写入区块。
跨链预言机实现:可信机制
跨链预言机的实现怎么保证是可信的?可信包括两部分:去中心化和数据可验证。
去中心化
我们可以部署多个不同组织的预言机节点,通过区块链的方式保证去中心化。预言机的合约和普通的智能合约过程一样,也是要经过共识,以实现去中心化。
数据可验证
数据可验证,就是怎么验证链外数据的有效性。这个过程是,预言机的链外数据也要由其他的节点验证才能提交,验证链外数据是否通过共识,以及其签名是否准确,并且要写入到区块文件。链外数据在区块里面的可验证格式体现为:
1)链外服务要有身份;
2)有数据路径,即获得链外服务提供的URL;
3)数据原始内容;
4)还有数据的签名,也可以通过身份链来解决身份可靠性的问题。
以上是预言机的实现。
2.3 真正的挑战:跨链互操作
预言机跨链查询是跨链的一小步,真正的跨链互操作的挑战要复杂很多,因为跨链互操作意味着一笔交易可以同时修改多个区块链上的数据。复杂主要体现在:
• 保证多个不同应用子链之间的操作一致性;
• 去中心化;
• 跨链数据的可验证。这是最基础的。
一致性:跨链事务处理
我们要解决一致性,现有的分布式系统里解决一致性有比较成熟的方案——通过一个协调者来实现两阶段的提交。但是区块链中要求去中心化,就需要有多个协调者作为公证人,把公证人集合组成一个联盟链。
腾讯云区块链采用去中心化的两阶段提交方式实现跨链互操作并保证事务的一致性,即从事务链中选取多个节点作为公证人集合,由公证人集合协调不同子链之间的互操作。为了保证跨链过程的可验证性,公证人集合与子链之间需要互相验证:
如图左侧,中间的部分是公证人集合,这个公证人集合用区块链的方式管理,负责协调两个链之间的一致性——他们都通过身份链来验证彼此的身份:公证人集合,在发起提案的时候需要内部达成共识之后才能发起提案,应用子链收到提案后分别对提案进行模拟执行——这一步还没有真正提交,如果公证人收到两边都模拟执行成功的返回,就会真正发起提交,提交提案由链A处理,链A处理完之后会用自己的身份做签名。公证人集合接着提交链B,链B处理完之后也会返回给公证人集合,如果两边都成功了公证人集合才认为这个交易已经完成。
如何实现可验证?可验证包含两部分:提案可验证;提交可验证。
提案是公证人集合发起的,提案可验证是为了防止公证人作恶,需要应用子链对公证人的提案有效性进行验证。提交可验证是防止应用子链作恶,需要公证人集合对应用子链的交易执行结果进行验证。
下面举个例子。有一笔交易,从链A用户转10块钱到链B用户,中间是公证人集合。要完成交易首先要发起提案——链A减10,链B加10,这个就是公证人的提案。发起提案也是在区块链上进行——链A和链B都要验证这个提案是不是有效的,如果公证人作恶给链A减了10块钱,给链B加了20块钱,那就出问题了,所以需要公证人去中心化,通过区块链的方式来表决。
提交可验证就是防止应用子链作恶——可能子链并没有提交,但是返回给公证人已经提交成功的信息。提交可验证事实上是要验证交易所在区块的已经提交,并且区块已经通过hash固化成链,保证一旦执行就不可篡改。
提交可验证该如何实现?如图,事务链是由公证人集合组成的联盟链,其作用是管理跨链事务状态、公开记录跨链凭证。跨链凭证分成子链的跨链凭证和公证人的跨链凭证两个部分。
子链的跨链凭证包括:子链的元信息与子链交易的提交凭证。子链的元信息预先公开在事务链上,如子链的共识机制,共识节点集合等。跨链过程中,公证人验证子链的区块与交易提交凭证是否满足子链提交条件。
公证人集合的跨链凭证包括提案策略和提案签名集:公证人集合事先约定提案策略,并将提案策略写入事务链,提案策略规定有效的提案需要满足什么样的公证人签名组合。跨链过程中,子链验证公证人集合的提案签名集是否满足约定的提案策略。
跨链事务处理需要管理一笔交易在多个不同链之间的执行状态,以确保数据处理的一致性,即交易在多个区块链上要么全部执行成功,要么全部执行失败。
与传统分布式事务不同的是,跨链事务处理过程需要保证去中心化,腾讯云区块链系统基于区块链来管理跨链事务,称之为事务链,采用两阶段的去中心化的跨链互操作方案,实现灵活的、可大规模跨链互联的区块链系统。
跨链身份管理基于区块链为上层应用提供可信身份服务,称之为身份链,用于管理子链身份与用户身份,子链身份即上层的应用子链身份,应用子链如果需要与其他平行子链进行跨链操作,就必须事先在身份链上注册身份,子链身份除身份ID、身份公钥外,还包括该子链对外公开的资源管理API,以便实现基于身份的服务发现。
用户身份即区块链应用的用户身份,身份链为上层所有子链颁发统一的用户身份,子链可以验证其他子链的用户身份,用户也可以在不同的子链上转移自身数据。身份链打通了数据的拥有者、管理者、访问者等不同角色之间的验证流程,为安全的跨链互通提供信任基础。