区块链安全技术指南(txt+pdf+epub+mobi电子书下载)

作者:黄连金 等

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

区块链安全技术指南

区块链安全技术指南试读:

前言

为什么要写这本书

这本书的初衷是希望给区块链项目提供一些安全方面的指导来改变目前区块链项目匆匆上线,安全系数不高,安全问题层出不穷的现状,也希望正在开发或将来需要开发的区块链项目在安全方面给予足够的重视。我们认为安全问题会是区块链项目落地的主要绊脚石。一个不注意安全的区块链项目,成功系数不会很高。区块链有很好的安全属性,比如数据不可篡改、数据不会丢失、可利用一些加密技术对数据进行加密等。但是从许多与区块链有关的安全事件可以看出,区块链的安全属性不能保证区块链项目百分之百安全。本书尽量从多个不同的方面,比较系统地对区块链的安全进行分析,并且对区块链项目落地所需要考虑的因素,提供一些建议。本书特色

本书是为数不多系统性地阐述区块链安全的书。

本书的主要特色是以深入浅出的形式讲解区块链的安全,便于读者更好地理解为什么区块链安全是一个重要的课题,以及如何解决某些区块链的安全问题。读者对象

本书的读者对象包括:

·区块链的开发者

·区块链安全的架构师

·区块链项目的主要技术负责人

·其他对区块链安全感兴趣的人如何阅读本书

在阅读过程中,读者可以根据工作需要将某些章节多读几遍。因为章节与章节之间的依赖性不强,完全可以根据工作需要抽出重点来读。

第1章详解区块链的安全属性,主要从保密性、数据完整性、可用性、物理安全性4个方面对区块链的安全属性进行详解。在分析过程中,本章穿插了一些实例,使得内容讲解更为直观、易懂。本章所介绍的内容,可以使读者对区块链的安全属性有更深层次的了解,对做好区块链的安全工作具有非常重要的参考价值。

由于区块链的安全性分析极具抽象性,所以第2章特意挑选了一些主流数字货币(包括比特币、以太币和Zcash),对其安全属性进行分析。通过本章的学习,读者可以了解主流数字货币的代码、密码学算法以及“钱包”等,进一步加深对区块链相关安全技术的认识。

第3章为应用与智能合约层的安全控制。本章主要从Web或者移动客户端应用程序、智能合约,以及身份与访问控制3个方面对安全问题进行分析。在当前信息技术快速发展的背景下,移动设备已经成为很多人上网的主要工具。为此,本章从一开始就对Web或者移动客户端应用程序的安全性进行了分析,让读者对相关的危险因素有所了解。在智能合约的安全方面,主要从智能合约的概念、安全编码、漏洞、开源工具等几个方面进行了分析,为读者在开发相关内容方面提供了重要的参考。在本章的最后,从多个方面对区块链的身份管理与访问控制进行了分析。通过对这部分内容的学习,读者可以了解在开发区块链的过程中,如何高效、安全地做好身份管理与访问控制等工作。

第4章为激励层安全机制设计。本章主要从激励的产生和分配以及激励层安全两方面进行了分析。首先,分别借助比特币、以太币的激励模式对激励的产生和分配进行了分析,可以让读者对区块链激励层的存在有较为直观的认识。在此基础上,本章又从激励模式的安全隐患、安全事件、法律风险以及安全措施等方面,对激励层安全进行了分析,让读者了解安全对激励层的重要性,以及如何设计才能有效避免区块链激励层安全事件的发生。

第5章为网络层安全与控制。网络层是区块链的重要组成部分,能否做好安全与控制直接影响区块链的价值。本章主要从P2P加密、客户端与节点通信加密、防御DDoS攻击3个方面进行了分析。通过对本章的学习,读者可以对网络层安全与控制的相关内容有全面的了解。这对开发过程中提高区块链的安全性具有重要指导作用。

第6章为数据层与共识安全。数据层是区块链设计的基础部分,是影响区块链能否正常运行的关键。本章主要从区块链数据加密技术、数据传输、区块链交易签名、共识攻击、区块链安全性考虑5个方面进行分析。通过本章的学习,读者可以了解关于数据层安全更多的知识。这对于提高区块链的安全,保障区块链的正常运行具有重要的参考价值。

第7章为私钥的安全。本章从私钥的重要性、使用方法、存在的问题等多个方面对私钥的安全进行了全面的分析。通过对本章的学习,读者可以对私钥安全性在区块链技术中的重要性有更深层次的认识,了解如何使用私钥才能有效避免安全问题的出现以及私钥的更新、找回与吊销等。除此之外,本章还对私钥保护的正确“姿势”、硬件钱包等内容做了分析。有了这些内容的指导,读者可以参考、拓展关于保障硬件钱包、移动钱包方面的设计思路,提高区块链的安全性。

除了上述内容,本书还包括3个附录。附录A介绍的是区块链安全基础概念、原理与分析方法,可以更好地理解区块链。当制定区块链安全性测试标准时,可以适当地参考、借鉴。附录B主要介绍DAG的基本概念、原理与主流项目,从中可以了解DAG给区块链安全带来的价值和影响。附录C介绍区块链私钥管理的一种方法,主要用于企业级数字资产的安全。勘误和支持

本书从不同的角度来阐述区块链安全,抛砖引玉。我们不能说这本书包含了区块链项目落地需要考虑的所有安全因素,因为不可能面面俱到。区块链目前尚处于初级的技术发展阶段,新的安全隐患和新的安全措施会在发展的过程之中不断涌现。我们希望这本书是“活着”的书,通过不断地修订,尽量把新的内容添加到这本书,也欢迎区块链安全专家在这方面给我们多提一些意见。

本书不是从空中楼阁造出来的,我们参阅了大量网络公开的内容,并且引用了很多区块链安全专家在不同新闻媒体或者网络所刊登的内容以及个别面对面的交流信息。对于被引用的内容或者面对面交流的信息,我们尽量与各位专家进行了沟通,并且获得了同意,比如NEO创始人、OnChain创始人及CEO达鸿飞,NEO创始人兼核心开发者张铮文,上交所技术有限责任公司架构师朱立,复杂美CTO王志文,元界CEO顾颖(初夏虎),元界CTO陈浩,公信宝CEO黄敏强,Dfinity CEO丁磊(Tom Ding)等。不过,仍有可能某些内容与网上公开的内容存在类似或雷同之处,在所难免,敬请谅解。如果在阅读本书的过程中发现有类似的内容,请及时与我们联系,我们会在修订版中增加引用的出处。致谢

在这里,首先要感谢高婧雅编辑,她从一开始便对本书高度重视,在写作过程中不断鼓励我们。在北京的一次会议上,高编辑和我基本上拟订了这本书的架构和一些基本内容,并且以后又经过几次优化,才有现在这本书的框架。

非常感谢本书所有的作者,他们在百忙之中抽出时间写了这本书,并且经过多次修改。应该说没有这些作者的贡献,就不会有这本书。

感谢深圳市微风智联科技有限公司的李恩典和梁福彬,他们非常有启发意义的讨论和对我负责写作的内容的多次修改,是我完成写作的最大助力。

非常感谢世界银行集团首席信息安全官、区块链实验室负责人林儒明先生,他不仅为本书做序,还在写作过程中不断鼓励我们,多次提供良好的建议。

中国万向控股有限公司副董事长、万向区块链实验室董事长兼总经理肖风博士对本书的构思和一开始的概念提出了很多宝贵意见,给予我们很大的帮助,同时还为本书作序,在此也表示感谢。

北京理工大学计算机学院副院长、网络与信息安全学科方向责任教授祝烈煌也为本书作序,在这里表示诚挚的感谢。

中国电子技术标准化研究院区块链研究室主任李鸣为本书写了推荐语,在此也表示感谢。

本书一共有9位作者,在著作委托书的联合签名上,我们第一次使用了区块链技术。感谢北京信任度科技有限公司CEO马臣云(也是本书的作者)的大力支持,我们利用该公司的信签电子合同签署平台非常快捷地完成了多人的电子签名。签署后的文档存储在由第三方CA机构、司法鉴定中心等组建的可信联盟链上。存证验证地址:http://bc.trustdo.cn/result.ht-ml?evidenceId=0x992c316f99baa714006424b6e86a87826dfd6d4cf4af3dbf9a75e3ebb5af6496">http://bc.trustdo.cn/result.ht-ml?evidenceId=0x992c316f99baa714006424b6e86a87826dfd6d4cf4af3dbf9a75e3ebb5af6496。

存证有关信息如下。

·存证地址:0x992c316f99baa714006424b6e86a87826dfd6d4cf4af3dbf9a75e3ebb5af6496。

·存证时间:2018-03-2507:47:04。

·存证内容:fileHash:81e4324b2c842dd05ee977670fba5d6a,fileName:黄连金-吴思进-曹锋-季宙栋-马臣云-尚维斯-李恩典-徐浩铭-翁俊杰委托书.pdf。黄连金第1章详解区块链的安全属性

区块链的本质是一个去中心化的数据库。在运行过程中,区块链将数据信息采用分布式方式记录,并且由所有的参与者共同记录。这些数据信息会被存储在所有的节点之中,而不是像传统数据库一样,仅仅存在于唯一的中心化机构。因此,在安全性方面,较传统技术实现了质的突破。安全性已经成为信息化社会的主旋律,如果安全问题无法得到有效的解决,那么区块链就无法实现推广。因此,安全性已经成为制约区块链发展的重要因素。本章将通过安全的4个要素(见图1-1)介绍和分析区块链的安全属性。

第一个要素是保密性(Conf identiality):数据和交易的内容在传输与存储的过程中被加密,从而保护了用户隐私和企业、机构的商业机密、知识产权及其他机密信息。

第二个要素是完整性(Integrity):确保信息在存储、使用、传输过程中不会被非授权用户篡改,同时还要防止授权用户对系统及信息进行不恰当的篡改,保持信息内部、外部表示的一致性。

第三个要素是可用性(Availability):确保授权用户或实体对信息及资源的正常使用不会被异常拒绝,允许其可靠而及时地访问信息及资源。

如图1-1左边所示,传统的信息安全主要涉及保密性、可用性和完整性3个要素。随着物联网(IoT)的发展,这3个要素已经不能完整地代表安全需求了。图1-1 安全要素的转变1.1 保密性

保密性(Conf identiality)是指网络信息不会被泄漏给非授权的用户、实体或过程,即信息只能供授权用户使用。信息外露已经成为影响信息化技术发展的重要因素,没有人愿意自己的隐私信息被他人获取。区块链的发展与信息的保密性紧密联系在一起。从本质上分析,区块链属于分布式账本。与传统的信息技术不同,它通过去中心化、去信任的方式对可靠数据库进行集体维护。

常用的保密技术包括以下几种。

1)物理保密:利用各种物理方法,如限制、隔离、掩蔽、控制等,保护信息不被泄漏。

2)防窃听:使对手侦收不到有用的信息。

3)防辐射:防止有用信息以各种途径辐射出去。

4)信息加密:在密钥的控制下,用加密算法对信息进行加密处理。即使对手得到了加密后的信息,也会因为没有密钥而无法读懂有效信息。

5)授权(Authorization)和验证(Authentication)。常见的授权包含验证与访问控制(Access Control)两个部分。验证是指用户或者业务模块通过一个私密的凭证来确保身份。它可以是一个密码,可以是一类数字签名(包括证书),也可以使用相对复杂的双向动态授权协议。验证后的访问控制则是将数据权限进行更细粒度的拆分,提供一次性或者短暂性的访问权限。Token作为一个权证,只能用来访问其对应权限下的数据,可以防止私密数据过量泄漏。而目前一些新的方法中,权证分发本身被改善成了一个数字签名的过程,通过完全的非对称密码系统,让数据提供方原本需要保存的Token,转变为只需要验证访问请求所携带的数字签名就可以获知权限的Certif icate/Signature。例如,Hyperledger区块链平台就采用这种方式,分别签发注册凭证(Enrollment Certif icate)和交易凭证(Transaction Certif icate),为不同的业务场景提供不同的数据访问权限。

区块链主要采用地址随机化、信息加密和状态通道的方式来做到信息的保密。1.1.1 比特币的半匿名性

比特币的出现对虚拟货币领域而言具有划时代的意义。它采取分布式的设计并且将发行权分享给很多的用户,通过特殊的计算方法,可以避免超量发行的尴尬。在设计方面,比特币是以密码箱的设计原则为基础,对保障流通交易的安全性和保密性具有重要作用。1.半匿名性与隐私安全

比特币用户的地址是由随机算法产生的,具有一定的保密性。一个用户可以有多个比特币地址,并且地址跟他现实生活中的真实身份没有任何联系,因而具有一定匿名性。不过这一特性实为“半匿名”,比特币的交易仍可以追本溯源到交易者本身。比特币的交易历史是完全公开的,所有人都可以通过钱包地址在区块链中查询钱包现金的流入与流出,并可向上追溯至这些比特币的终极起源,即从区块生成后发送到的那个地址。这对个人隐私构成了巨大威胁。

比特币协议为上述问题提供了两种解决方案:

1)所有的比特币交易使用公共密钥,而无须个人身份证明;

2)比特币客户端可以生成无数个公共密钥,以帮助用户防止跟踪。

然而,越来越多的研究表明,这些保护措施是不够的。如果通过一些社会工程学手段,使得某个比特币钱包的物理地址(如IP地址)暴露,再配以大数据分析,那么资金的来龙去脉与关系网将无从遁形。德国和瑞士学者的一项研究显示,约40%比特币用户的真实身份可被发现,这其中有些用户还使用了官方推荐的隐私保护措施。美国加州大学圣地亚哥分校研究者发表的一篇论文中称,比特币交易网络对少数大账户的依赖性与日俱增,这使得用户的身份安全性大大降低。日后,通过大宗交易追踪到交易者的真实身份将变得很容易。

从本质上来说,比特币的去匿名化依赖于根本性的洞察。仅仅给定一组关于人的信息和一组关于比特币交易的信息,而不提供任何涉及二者关系的信息,则确定哪个地址属于哪个人确实是非常困难的。[1]但是,当你知道哪怕一条关联信息,可能很快就可以确定该用户最喜欢的商家。除了简单地“追踪比特币”,还有两个比特币侦探可以使用的更高级的工具。2.破解半匿名的方法(1)闭包

首先,存在一个概念,即闭包。我们来看一个示例。如果地址A在某个闭包里并且存在一个使用来自地址A和地址B的货币作为输入的交易,则地址B也在该闭包里。计算一个地址的闭包时,只需在从这个地址开始,一直到你停止添加新地址的过程中重复地应用闭包的定义。

这个概念的威力如下:同一个闭包里的所有地址几乎可以肯定都归同一个用户所有。如果一个交易有多个输入地址,则原因几乎总是用户需要把一定数额的钱支付到某个地址里,但是其任何一个地址里钱的总额都不够,于是钱包软件为了付款不得不从两个甚至更多的地址里取钱。有了这个工具,如果你能证明哪怕一个地址归属于某个具体的人(比如说,如果你是一个从他们那里接受比特币付款的商人),那么你就很可能发现他们的绝大部分钱包地址。(2)“零钱地址”启发式算法

在消费时,零钱地址被比特币钱包用来发送额外的钱给交易的收款地址。比如,如果你收到了50比特币,然后花了1比特币,剩余的49比特币就存入一个由你的钱包新生成的零钱地址。之所以不把那49比特币发回原来的地址,是为了增加隐蔽性。有人已经找到启发式算法来解决怎么才能自动辨别零钱地址和交易的正常收款地址。通过这类启发式算法,研究人员比只使用地址闭包发现了更多的线索,常常可以追踪交易链长达几百步并最终获得成功。3.弥补匿名性不足的方法

解决比特币匿名性不足的方法除了利用单个钱包多个地址以外,还有一种是混合服务。比如,在网站blockchain.info和丝绸之路上的服务。混合服务的工作原理如下:用户给混合服务一个接收混合后的比特币的地址,而混合服务给用户一个发送比特币的地址。全世界成千上万的用户把比特币发送给混合服务商,而服务商在内部进行混合后,除了扣除少量手续费外,其余的比特币如数(不是相同的比特币)发到每个用户的接收地址上。由于在区块链上找不到用户发送地址和接收地址的关联,所以在理论上只要混合完成相关信息就会被抹掉。但是,这种匿名方式需要提前建立双方的信任。用户不仅需要信任服务商不会透露自己的两个地址之间的关联,还需要相信服务商不会偷走自己的钱。如果服务商偷了钱,用户将无法证明。

此外,比特币开发者Amir Taaki和Pablo Martin研究出一种新的方法——半去中心化来解决比特币的半匿名性问题,其工作原理大致如下。

N个人聚在一起并且同意混合X个比特币,他们中的一个人发送N和X的值以及“房间号码”给一个中间服务商。每个人用匿名网络(比如Tor)给服务商发送一条带有房间号码和接收地址的信息。一旦N个人都发送进来了他们的接收地址,则服务商会给每个人发送确认信息。每个人都匿名地给服务商发送一条包含房间号和发出地址的信息。服务商在所有人都把X个比特币发过来后,用这些比特币构造一个交易并向每个接收地址发送X个比特币。然后,服务商把交易发给每个人来签名。每个人都检查交易中向自己的接收地址发送的比特币的数额是否正确,检查完毕后发送给服务商自己的签名。随后,服务商公开签过名的交易。

如上所说,这个协议没有一点特别的创意。事实上,Taaki和Martin第一次发现这个主意是在一个比特币开发员Gregory Maxwell描述CoinJoin概念的论坛帖子里。然而,神奇的地方在于它的实现过程,这两个人使用Taaki本人发明的比特币工具箱SX快速实现了交易。这种实现方法的优势在于易于使用。Taaki和Martin专门创造了一个简单的图形用户界面,用户只需输入发送地址、服务商的网址和接收地址,系统就会自动处理一切。

中间商不知道哪个发送地址对应着哪个接收地址(因为人们在不同阶段、不同时间发送他们的信息),也没有机会偷走比特币。如果中间商用自己的接收地址替换了别人的接收地址,没有收到比特币的人发现后会拒绝签收交易,这将导致协议失效。唯一失败的可能性只在于没有发生的交易。此外,任何人都可以成为交易商而本质上却不需要任何起步费。实际上,完全去中心化的体系可以让N个人中的一个人在百忙之中充当交易商。

这种机制也许不经意间实现了另一个目标:如果得到广泛的应用,它有很大的可能使得“闭包”概念不能发挥作用。闭包依赖的前提假设是一个交易的所有发送地址都是由一个人签收的,然而交易的不同发送地址是由不同的人签收的。当然,目前使用的协议可以被轻松地骗过,因为闭包算法可以故意避开各个发送地址来发送金额相等的交易。从理论上说,一个人在同一场交易活动中可以参加多次,也就是说发出和接收的面额不同(比如说,通过一个地址发出0.03比特币,但通过3个不同接收地址各收取0.01个比特币)。从另一方面看,一般的钱包可以故意使它们的交易看起来像是匿名交易。比如,一个钱包提供商可以使其钱包总是提供0.01比特币的零钱,因而每笔交易都自然而然地看起来像是经过了混合(混币)。尽管将来会有一些方法可以识破很多这类事情,但是这仍然使闭包的地位从必杀技降为普通试探性方法。

例如,在2017年7月被破获的BTC-e洗钱案件中,安全专家便是利用比特币的半匿名性的弱点追踪到嫌疑人。[1] 某个比特币交易或地址关联到现实世界中的某个具体的人或事件,从那里就有可能“追踪比特币”并且获取许多其他方面的信息。比如说,追踪者可能会发现该用户的老板、最喜欢的商家、顾客和其他人的比特币地址。1.1.2 Hyperledger Fabric CA的动态交易证书

超级账本(Hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,其目标是让成员共同合作,共建开放平台,满足多个行业用户的需求,并简化业务流程。Hyperledger Fabric CA是Fabric的一个重要模块,如图1-2所示。图1-2 CA在Hyperleder Fabric框架体系架构中的流程图

Fabric CA为网络提供身份管理、隐私、保密和可审计性的服务。在一个不带权限的区块链中,参与者是不需要被授权的,且所有的节点都可以同样地提交交易并把它们汇集到可接受的块中。例如,它们没有角色的区分。Fabric CA通过公钥基础设施(Public Key Infrastructure,PKI)和去中心化、共识技术使得不带权限的区块链变成带权限的区块链。在Fabric中,用户通过注册来获得长时间的、可能根据用户类型生成的身份凭证(或称登记证书,Enrollment Certif icates)。在用户使用过程中,这样的证书允许交易证书颁发机构(Transaction Certif icate Authority,TCA)颁发匿名的动态交易证书。动态交易证书解决了比特币的半匿名问题,因为每一笔不同的交易可以用不同的动态交易证书。实体的登记证书可以用来产生动态交易证书,但是按照密码学原理,从动态交易证书不可能推断出实体的登记证书,这样用户的数据加密得到了保障。1.1.3 用零知识证明做数据加密

零知识证明(Zero Knowledge Proof,ZKP)并非新鲜事物,其概念初见于1985年的论文《互动证明系统的知识复杂性》。ZKP是一种密码学技术,允许两方(证明者和验证者)来证明某个提议是真实的,而且无须泄漏除了它是真实的之外的任何信息。在密码学货币和区块链中,这通常是指交易信息数据。

有人借用最简单的阿拉伯童话《一千零一夜》对零知识证明做了通俗、形象的介绍。阿里巴巴掌握着让芝麻开门的咒语。强盗向他拷问打开山洞石门的咒语时,他不想让人听到咒语,于是想了个好办法。他对强盗说:“你们离我一箭之地,用弓箭指着我。你们举起右手我就念咒语打开石门,举起左手我就念咒语关上石门。如果我做不到或逃跑,你们就用弓箭射死我。”强盗们同意了,因为这能帮助他们搞清楚阿里巴巴到底是否知道咒语这个问题。强盗举起了右手,只见阿里巴巴的嘴动了几下,石门果真打开了。强盗举起了左手,阿里巴巴的嘴动了几下后石门又关上了。强盗还是有点不信,说不准这是巧合呢。于是不断地换着节奏举右手、举左手,石门跟着他们的节奏开开关关。最后强盗们想,如果还认为这只是巧合,自己未免是个傻瓜,那还是相信阿里巴巴吧。这就是最简单易懂的零知识证明。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。

根据零知识证明的定义和有关例子,可以得出零知识证明具有以下3条性质。

①完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。

②合理性。没有人能够假冒证明方,使这个证明成功。

③零知识性。证明过程执行完之后,验证方只获得了“证明方拥有该知识”这条信息,而没有获得关于该知识本身的任何一点信息。

零知识证明及其有关协议的主要优点:

①随着零知识证明的使用,安全性不会降级,因为该证明具有零知识性质。

②高效性。该过程计算量小,双方交换的信息量少。

③安全性依赖于未解决的数学难题,如离散对数、大整数因子分解、平方根等。

④许多零知识证明相关的技术避免了直接使用有政府限制的加密算法,这就给相关产品的出口带来了优势。1.利用零知识证明的Zcash

为了让比特币变得更具隐匿性,Zooko Wilcox发起了Zerocoin项目,并在Zcash协议(即Zerocash)的原开发团队、约翰·霍普金斯大学、麻省理工学院、以色列理工学院和特拉维夫大学的各个小组的共同协作下,逐步提高了原协议(即Zerocoin)的效率和匿名性。“棱镜门”事件的主角爱德华·斯诺登曾这样评价该项目:可解决比特币匿名程度不够的问题。

Zerocoin项目的原理:在比特币交易的区块链的主链上再加上一条侧链,这条侧链用于在数字货币交易过程中,当“付费者”的数字货币从钱包拿出的时候就将其拆分成数份,并在全网上重发一遍。而这些被拆分的数字货币会在到达“收款者”的地址之前组合到一起,从而达到匿名交易的目的。

随着Zerocash技术不断成熟,人们认为是时候开发一种新的数字货币来取代比特币了。于是2016年1月20日Zcash官网宣布:“Zerocash协议”将被开发成一种全新的数字货币,即Zcash。它与比特币的相同之处在于,Zcash的总量也被设为2100万。Zcash采用PoW分配方式,前4年里,矿工挖矿所得的20%会自动分配给Zcash团队和其投资者,也就是总量的10%。Zcash项目的主要特点,是其交易会自动隐藏区块链交易的发送方、收款方以及交易的价值,只有掌握正确的密钥(View Key)的人才可访问这些内容。当然,用户可自行选择哪些人可以拥有这种权限。Zcash与比特币相比,更注重隐私,以及对交易透明的可控性。

Zcash利用了简化的零知识证明——zk-SNARKs(零知识简洁非互动性知识参数),一种在无须泄漏数据本身情况下证明某些数据运算的方式。zk-SNARKs是Zcash和Hawk(后文会解释)背后的密码学工具,这两个协议都使用了ZKPs来创建区块链。在Zcash的例子中,这些SNARKs被用于验证交易;在Hawk的例子中,它们被用于验证智能合约。所有这些在完成的同时还能保护用户的隐私。

zk-SNARKs是一种简洁的非互动性零知识证明,其中的证明非常简短,很容易验证。可以将它们看作是一个逻辑回路,这个逻辑回路需要生成一个证明来验证每一笔交易。zk-SNARK通过对每一笔交易进行快照来实现生成一个证明,然后让接收方相信计算是正确的,而且不会泄漏证明之外的其他任何数据。一个SNARK执行的基本操作就是将能够解密的数据编码到回路中。因为zk-SNARKs能够很快被验证,证明计算量非常小,因此它们可以保护运算的完整性,而且不会给非参与者带来负担。需要知道的是,该技术尚未成熟,还有很多局限性。它们是激励CPU来生成证明,需要1分钟才能生成新的证明,因此规模化仍然是需要解决的一个问题。zk-SNARKs另外的一个问题是开始的证明方和验证方的初始配置(intial setup)可能会被黑客利用。总之,该技术目前仍处于不断发展、成熟的过程中。2.利用zk-SNARKs的Hawk智能合约

Hawk的目的是为以太坊提供可编程性和表达力,同时综合Zcash固有的隐私性。Hawk智能合约系统从简化版本的开源Zerocash协议开始,在此基础上建立智能合约层。Hawk可以把数据或数字货币进行加密,然后作为智能合约的输入和输出。因此,在区块链上看不到什么是智能合约的输入和输出。此外,并不是每一笔交易都需要用到数据加密的智能合约。用户可以根据特殊隐私的需要,选择可以处理加密数据的智能合约。如图1-3所示为Hawk编译器的视图。图1-3 Hawk编译器视图

Hawk程序员可以用直观的方式编写一个需要加密的智能合约,而不必考虑具体的加密算法,Hawk的编译器将自动生成有效的零知识证明加密。这样,智能合约的使用者就可以利用零知识证明加密的智能合约来进行交易。下面是Hawk智能合约的例子。智能合约可以分为公开和私有两部分,私有的部分(下面代码的第3~26行)可以利用零知识证明加密来保护隐私。

1 HawkDeclareParties(Seller,/* N parties */); 2 HawkDeclareTimeouts(/* hardcoded timeouts */); 3 // 私有的部分 4 private contract auction(Inp &in, Outp &out) { 5 int winner = -1; 6 int bestprice = -1; 7 int secondprice = -1; 8 for (int i = 0; i < N; i++) { 9 if (in.party[i].$val > bestprice) { 10 secondprice = bestprice; 11 bestprice = in.party[i].$val; 12 winner = i; 13 } else if (in.party[i].$val > secondprice) { 14 secondprice = in.party[i].$val; 15 } 16 } 17 // 优胜者支付secondprice给卖主 18 // 其他人的资产将被退回 19 out.Seller.$val = secondprice; 20 out.party[winner].$val = bestprice-secondprice; 21 out.winner = winner; 22 for (int i = 0; i < N; i++) { 23 if (i != winner) 24 out.party[i].$val = in.party[i].$val; 25 } 26 } 27 // 公开的部分 28 public contract deposit { 29 // Manager较早存入SN 30 def check(): // invoked on contract completion 31 send $N to Manager // refund manager 32 def managerTimeOut(): 33 for (i in range($N)): 34 send $1 to party[i] 35 }1.1.4 使用状态通道让数据不可见

状态通道让本来应该发生在链上的交易在不增加任何参与者的前提下搬到链下去完成。这种策略最著名的例子是比特币的支付渠道(闪电网络),它允许在任何两方之间直接发送不需要费用的支付或者交易。支付渠道状态通道的一种形式。对通常在区块链上执行的任何交易来说,通过支付渠道,可以在不需要任何额外信任的情况下将这些交易从链上移到链下,从而减少成本,提高交易速度。1.状态通道的基本思想

区块链的一部分状态是通过签名或某种智能合约锁定的,只有相关的参与者完全同意才能更新这一部分状态。参与者可以在链下进行很多交易,这些交易不马上发表在链上。每笔交易都可以对原来的状态进行更新,后面的交易“胜过”以前的交易。在一系列的交易后,参与者可以将最后的状态提交回链上,这将关闭状态通道。如果参与者之间更新的“状态”是数字货币余额,那么就是一个支付通道。付款通道有3个步骤:①打开通道;②在通道里进行交易;③关闭通道。打开和关闭通道的步骤1和3涉及链上操作。但是在步骤2中,可以快速进行无限数量的更新,而无须涉及区块链主链。而这正是状态通道发挥作用的地方,因为只有步骤1和3需要发布到网络、支付费用,或等待确认。事实上,经过周密的规划和设计,状态渠道几乎可以无限期地保持开放,并作为更大的枢纽和分支系统的一部分来为整个经济或生态系统赋能。

状态通道的一个突出优点,就是增强了隐私,因为状态通道使得数据不会在链上公开,只有参与者之间(比如交易的买方和卖方)才能看到数据。经过上交所技术有限公司朱立的同意,下面转载他的文章来分析闪电网络、雷电网络和Corda背后的原理和技术细节。2.闪电网络概述

比特币自诞生起一直存在若干技术问题:论处理能力,目前全网只有7笔/秒;论时延,大致10分钟才出一个块;论交易最终性,一般建议将等待6个块的确认视作交易最终化,大额交易则建议等待更多;论容量,目前已生成40多万个区块,约60GB数据量,且眼见的未来只见增加不见减少。

在闪电网络出现前,虽然比特币社区也试图通过区块扩容、隔离见证等技术在一定程度上提高交易处理能力,但始终无法实现数量级的改善。至于前面提及的其他技术难题,现存的PoW机制是万万动不得的,需要等待多个区块的确认也是不能触碰的底线;更麻烦的是,交易处理能力和区块链数据容量似乎是一对无可调和的矛盾。

思路决定出路,常规方法找不到出路,就逼得社区换一种思路考虑这个问题。代码性能调优的经验提示我们,优化编译、改进算法、调整数据结构等方式虽然很重要也很管用,但怎么能比得上“根本不执行”的强悍?既然在比特币区块链中优化性能如此艰难,为何不尽可能将交易放到链外执行?以比特币区块链为后盾,在链下实现真正的点对点微支付交易,区块链处理能力的瓶颈可能会被彻底打破,时延、最终性、容量甚至隐私问题也迎刃而解,这就是比特币“闪电网络”的思路。

闪电网络并不试图解决单次支付的银货兑付问题,其假设是单次支付的金额足够小,即使一方违约另一方的损失也非常小,风险可以承受。因此使用时必须注意“微支付”这个前提。多少资金算“微”,显然应该根据业务而定。闪电网络的关键技术有三,依次是RSMC(Recoverable Sequence Maturity Contract,序列到期可撤销合约)、HTLC(Hashed Timelock Contract,哈希时间锁定合约)和闪电网络后者依赖于前者。技术实现虽然复杂,但本质却很简单。

如图1-4所示,Alice想给Dave发送0.05BTC,但Alice和Dave之间并没有微支付通道。没关系,Alice找到了一条经过Bob、Carol到达Dave的支付路径,该路径由Alice/Bob、Bob/Carol和Carol/Dave 3个微支付通道串接而成。图1-4 闪电网络的支付路径

Dave生成一个秘密R并将Hash(R)发送给Alice,Alice不需要知道R。R和Hash(R)的作用就像是古代调兵用的一对虎符。Alice和Bob商定一个HTLC合约:只要Bob能在3天内向Alice出示哈希正确的R,Alice便支付给Bob 0.052BTC;如果Bob做不到这点,这笔钱3天后将自动退还Alice。

Bob和Carol商定一个HTLC合约:只要Carol能在2天内向Bob出示哈希正确的R,Bob便支付给Carol 0.051BTC;如果Carol做不到这点,这笔钱到期将自动退还Bob。

最后,Carol和Dave商定一个HTLC合约:只要Dave能在1天内向Carol出示哈希正确的R,Carol便支付给Dave 0.05BTC;如果Dave做不到这点,这笔钱到期将自动退还Carol。

一切就绪后,Dave及时向Carol披露R并拿到0.05BTC;现在Carol知道了R,她可以向Bob出示密码R并拿到0.051BTC(差额部分的0.001BTC成了Carol的佣金);Bob知道R后当然会向Alice出示并拿到他的那份0.052BTC,差额部分的0.001 BTC成了Bob的佣金,如图1-5所示。图1-5 闪电网络逐级提款

整个过程很容易理解。最终效果是Alice支付了0.052BTC,Dave安全地拿到0.05BTC,整个闪电支付网络为此收取的佣金成本是0.002BTC。上述过程中的全部动作都发生在比特币区块链之外。尽管闪电网络本身可以基于任何合适的传统技术构建,闪电网络的支付通道也可能逐渐向少数大型中介集中,变成若干大型中介彼此互连、普通用户直连大型中介的形式,但这种方案仍然具有传统中心化方案不可比拟的优势,因为用户现在并不需要信任中介,不需要在中介处存钱才能转移支付,资金安全受到比特币区块链的充分保护。3.雷电网络

虽然在区块链技术蓬勃发展的今天,比特币日益显得臃肿和老旧,但比特币社区仍然为区块链技术贡献着重要的思想。基于闪电网络的思路,以太坊社区也提出了自己的链下微支付通道解决方案——雷电网络(Raiden Network)。

Raiden项目源码托管在https://github.com/raiden-network/raiden,开发语言为Python(目前尚未完成),其实施原理则是基于《Universal Payment Channels》一文。当我们将以太坊作为一个侧链导入其他加密货币之后,很容易依托以太坊智能合约为各类加密货币开发微支付通道。

Raiden项目的思路直接继承自比特币闪电网络,但也有所发展。因为以太坊智能合约对报文格式没有特别的字段限制,使得Raiden得以为通道余额快照引入一个单增序号,极为轻松、自然地解决了旧版本快照的识别和作废问题。

首先要在以太坊上建有一个智能合约,由智能合约处理下文提到的OpenTransaction、UpdateTransaction等指令。下面是Raiden建立交易通道的主要形式。

Opening Transaction: Party 1: Public key or other signature verification information for one of the participants // 参与者之一的公钥或其他签名验证信息 Party2: Public key or other signature verification information for the other participants // 其他参与者的公钥或其他签名验证信息 Amount 1: The amount of money that Party 1 has placed in the channel // 第一 方渠道中的金额 Amount 2: The amount of money that Party 2 has placed in the channel // 第二 方渠道中的金额 Signature 1: Party 1’s signature on Opening Transaction // 第一方在开盘交易中的签名 Signature 1: Party 2’s signature on Opening Transaction // 第二方在开盘交易中的签名

和闪电网络一样,双方需要在以太坊区块链上开设通道并各自锁定以太币。这步动作可通过向Raiden智能合约发送一条双方签名认可的报文来实现。报文中的关键信息包括双方公钥、双方锁定资产数量、双方签名。

此后的任何支付动作都可以发生在以太坊区块链外,参与双方只需要私下传递一系列报文。其中最重要的报文是UpdateTransaction(更新交易通道),其形式如下。

Update Transaction: Sequence Number: This number is incremented with each new Update Transaction // 这个数字随着每个ji交易更新而递增 Net Transaction Amount: The amount of money to transfer from Party 1 to Party 2(can be negative) // 从第一方转到第二

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?