邓智洪 刘金旺
(湖南科技大学 数学与计算科学学院,湖南 湘潭425199)
区块链最初是为比特币[1]所设计的,是一种分布式数据结构,用于记录节点维护的交易,无需中央授权。在区块链中,所有节点在共享状态上达成一致意见,这是一个由非受信任的参与者组成的大型网络。区块链含有不同于普通账本的独特特性,如透明性、可追溯、容错性和去中心化。比特币是公有链网络,而联盟链网络则包含一组已识别的节点,因此被许多系统用于在许可的环境中部署各种分布式应用,超级账本(Fabric)[1]便是联盟链技术中的佼佼者。在传统的联盟链业务流程中,有一些方法是用来保护隐私的,如安全多方计算[2]和随机访问控制。然而,这些被动的隐私保护方法并不能完全解决基于交易信息共享的隐私保护问题。本文将探究超级账本的几种隐私保护机制的设计细节与作用。
Fabric采用执行-排序-验证的三阶段的架构来完成一笔交易,这种设计相比较于其它的联盟链系统根本的区别是先执行事务,再进行排序,大大提升了效率。具体的交易流程可分为七步:
步骤1.用户通过Client/SDK把一笔交易提交给背书节点。
步骤2.背书节点模拟执行这笔交易,生成状态数据读写集,并对其进行签名,因此此过程并不会更新peer的账本信息。
步骤3.背书节点将签名后的读写集返回给Client/SDK。
步骤4.Client/SDK接受背书信息后将内容返回给Orderer排序节点,Orderer节点会对一段时间内接受到的所有交易信息进行一个全排序,并将其打包成块,此过程Orderer节点只起到对交易进行排序的作用,并不能查看交易的具体内容。
步骤5.Orderer排序节点通过Deliver接口将打包成块的信息发送给记账节点。
步骤6.记账节点对从Orderer节点接收到的信息进行验证,验证的内容包括背书节点对每笔交易的签名是否正确、背书策略是否正确、读写集的版本号是否正确等,若满足要求则将数据写入账本。
栽培果树的总目标是要实现速生、早产、丰产、稳产、优质、寿命长和效益高。而实现这些目标,必须紧紧抓住5个环节:①良种是前提,是丰产优质的内因;②立地是基础条件,劣质荒脊地、低洼易涝地勿用;③防治病虫是“治安保卫”“质量监督”,防患于未然;④整形修剪是“树冠组织”工作,有利于达到早产、高产、稳产的目的;⑤肥水是“后勤供给”工作,足则丰产稳产,缺则欠而不稳。五环缺一不可,这就是总则。
步骤7.记账节点给Client/SDK发送一个event,用于告诉Client/SDK这笔交易已经写入账本。
通道可理解为Fabric网络中分享与维护同一账本的节点集合,Fabric网络中设置的通道配置有访问策略,该策略控制对通道资源(链码,事务和分类账状态)的访问,从而仅在通道中的节点内保留信息的隐私和机密性。各自通道内的组织维护各自的账本数据,不同通道间的组织生成不同的账本,确保通道内成员之间形成一个专门的密闭网络,实现跨通道的组织间数据互不查阅,互不相关。因此,具有大量交易的双边业务关系可以通过通道满足其隐私要求。
为实现同一通道内组织间更细粒度的隐私保护,Fabric设置了私有数据机制,它基于策略创建私有数据集合,从而定义同一通道中具有权限的组织才可以访问私有数据,而通道内的其余组织只知道发生了这样一笔交易,并不具备查看和操作私有数据的权限,因此并不知道此交易的具体内容。
私有数据集合包括两个部分。第一,私有数据实体:在具有权限的节点之间通过Gossip协议传输数据,并且存储在这些节点的私有状态数据库中,可通过链码API进行访问。第二,私有数据的哈希值:这部分数据用于背书和排序时调用,最后存储到通道内每一个peer节点的账本数据库中,哈希值用于验证私有数据的正确性和完整性。
比较普通数据的传输流程,私有数据在通道内的传输流程也可分为七步,流程图如图1所示。
图1 私有数据传输流程
步骤1.Client/SDK端调用链码功能(读或写私有数据)的提案来发送一份带有隐私数据的交易给具有该私有数据集合操作权限的背书节点。
步骤2.背书节点模拟执行这边交易,并将私有数据存储在节点内被称为“transient date store”的临时数据库中。
步骤3.背书节点通过Gossip协议将交易发送给其它具有权限的节点,发送到满足要求的节点后将这些节点返回的结果进行签名,最后将所有的背书响应返回给Client/SDK端。背书响应包括已背书的读写集,需要强调的是该读写集不带有私有数据,而是key-value格式的私有数据哈希值,因此Client/SDK是不能查看到私有数据的。
步骤4.Client/SDK端提交交易(带有私有数据哈希值的提交响应)给Ordering-Service排序节点,私有数据哈希值将同正常交易一样被排序节点打包进区块,最后排序节点将带有私有数据哈希值的区块发送给所有的记账节点。
步骤5.具有操作私有数据权限的记账节点会通过验证区块中私有数据哈希值与临时存储数据库中该私有数据计算后的哈希值是否一致,从而来确保私有数据的正确性和完整性。
步骤6.当验证私有数据没有问题后具有权限的节点将把私有数据从临时存储数据库中移动到私有数据库和私有读写副本中,并删除临时存储数据库中的数据。
步骤7.通知Client/SDK端已完成交易。
当拥有私有数据的集合内的成员需要与其它组织共享私有数据时,例如当集合内的成员有争议或者他们想将资产转移给第三方时,第三方可以计算私有数据的哈希值,并检查哈希值是否与账本上的哈希值一致,从而证明交易的存在。
对于非常私密的数据,共享数据的组织也可以出于策略原因强烈要求删除存储数据,只保留数据的散列值作为事务不能被篡改的证据。为了支持后续事务,一旦将一定数量的后续区块添加到私有数据库中,就可以清除以前的私有数据。
3.3.1 身份混淆器
身份混淆器是一种基于X.509和加密算法的密码协议套件,保留隐私且实现匿名性,交易时不用透露交易者的身份,其底层核心便是零知识证明[2]。身份混淆器(如图2)涉及到用户、发行者和验证者这三方。发行者通过发布数字证书去证明用户的属性是可信的,用户随后生成拥有该证书的“零知识证明”,并且选择性的公开自己的部分属性,验证者则可进行有效验证。由于该证明是零知识的,因此用户并不会向发布者和验证者以及其他组织透露任何隐藏的信息。
图2 身份混淆机制
3.3.2 身份混淆器应用于超级账本
身份混淆器应用于超级账本其三方替换为Fabric-CA、Fabric-SMP和Fabric-SDK。Fabric-SDK为用户提供相应的API,Fabric-CA作为身份的发行者,验证者则需要满足Fabric中的身份混淆器的MSP身份。步骤如下:
步骤1.设置:生成由Fabric-CA签名的秘钥对,并且公钥可被区块链参与方使用。
步骤2.发行:peer或client端会生成一个密钥,并创建对注册证书(ECert)的请求。Fabric-CA以身份混淆器凭证的形式颁发ECert,ECert包含了成员拥有的属性。ECert与对应的凭证密钥一起存储在peer或由client/SDK存储。
步骤3.签署交易:当peer或client端需要签署交易时,它会生成新的不可链接的token,该token包括签署交易内容、证明拥有由CA颁发的有效证书和公开事务的访问控制策略所需的属性。
步骤4.验证交易:使用Fabric-CA的公钥验证token。
Fabric利用基于零知识证明技术的身份混淆器为客户的交易提供匿名身份验证,从而实现身份的混淆,确保用户信息的保密。
从最开始作为数字加密货币比特币的底层技术,到现在应用于金融、溯源、物联网、共享经济等诸多领域的超级账本,区块链的更新迭代的速度是如此之快。本文基于一种著名的区块链联盟链技术超级账本,提出其具备的隐私保护机制,并探究它们各自的设计细节与作用。当面向更多的应用场景时,这些机制还存在操作复杂和效率低等问题,希望在未来得到更好的解决。