请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
04/29
22:31
分享
评论
  • 分享嘉宾

    韦云川,北京理工大学博士、加州大学戴维斯分校访问学者、IEEE会员、中国计算机学会CCF会员。现任BitAsset Labs首席科学家,下一代硬件公链平台项目SperaX合伙人。在区块链技术、无线通信安全、抗量子密码技术等领域有广泛研究和积累。曾荣获国家留学基金委公派留学奖学金、北京理工大学人民奖学金 、中国航天科技集团一院技术改进奖一等奖。学术论文曾被顶级国际会议 IEEE INFOCOM 录用并作专题报告,研究成果发表于IEEE Trans. Mobile Computing、Computer Networks等顶级期刊,获得10余项发明专利授权。

    分享环节

    1.前言

    区块链是在P2P网络中的分布式账本技术。它是比特币、以太坊等诸多密码学货币背后的支撑性技术。由于区块链中的账本只能采用追加写以及被网络中所有节点共享,因此即使互不信任的节点也能很方便地对数据进行验证,并依赖定的共识机制来达一致。因此,区块链技术能显着降低多节点间的信任成本,因而在跨境支付、凭据业务、供应链以及些金融领域有着广阔的应用场景和应用价值。

    因为不同的节点都需要对同样的数据进行计算验证,所以要求区块链上的数据都是公开的。这方面增加了数据透明度与公信力,也带来了另一方面的问题——数据隐私问题。在区块链中,部分节点可能并不希望自己的交数据公开,包括交易双方身份、交易金额、合约内容等等。这不仅对于注重个人隐私的客户很重要,对于金融系统以及供应链系统来说,数据隐私也是他们盈利的关键点之一。因此,要想让区块链有更广阔的使用空间,需要兼顾区块链的多节点信任特点以及保证数据隐私。


    2.人性与隐私问题

    对个体来说,按照弗洛伊德的观点,人们对别人隐私的窥探欲,来自于童年,来自对自己身世和来历的好奇心。儿童通过窥探父母隐私来了解自身来历,是一种成长过程中的正常欲求。如果一个人在童年时期破解了父母的全部情感隐私,从理论上讲,这个孩子长大之后,将不会过分热衷于别人的隐私。只有那些儿童期窥探欲没有得到足够满足的人,到成年期后才会疯狂地窥探别人的隐私。有极少数人,通过窥探别人隐私的过程,来满足一种扭曲、变态的原始欲求,形成了一种变态人格。虽然由于社会文化背景的不同,我们不能完全用弗洛伊德的观点来评判窥探别人隐私的动机,但确实有人在窥视别人隐私时,会下意识地把自己压抑的欲望、憎恨或期待投射到别人身上,在心理上得到报复性或胜利的满足。心理学者苏晓波曾说:“只要人格还没有成熟,人们就还会热衷于窥探别人的隐私;只要还有欲望被深深压抑的人,就会有人挖空心思地揭露别人隐私,借着别人的隐私,宣泄自身的欲望;只要人性还存在着缺陷,窥探隐私的喜好,就永远不会结束。”

    在当今移动互联网时代,人们使用的很大一部分服务都是免费服务。当人们使用这些免费服务时,其自身的隐私就成了公司的盈利的商品。百度公司董事长兼CEO李彦宏在2018中国发展高层论坛上发表了“中国经济的新动能”为主题的演讲。讲演中,李彦宏说到:“中国人更加开放或者对隐私问题没有那么敏感,如果说用隐私来交换便捷性或者效率,很多情况下他们是愿意这么做的。”。该发言引起了社会舆论巨大的讨论。在互联网时代,移动互联网时代的个人隐私问题一直是一个痛点,苹果iCioud的艳照门,Facdbook的大规模用户信息泄漏令人风声鹤唳。

    如今,我们每个人都有智能手机,都在使用智能手机上的各种APP。出门,我们用智能手机APP叫车;吃饭,我们用APP团购;支付我们用APP支付软件支付,而这个APP支付软件联系着我们的银行账户,有我们家的地址(交水电费,收快递),知道我们家的车牌号(购买车险),甚至知道你的工作单位,月收入(验证你的社保和住房公积金信息)。智能手机上的GPS记录你24小时的位置,摄像头可以拍摄你的影像,话筒可以记录周围的声音。当这些大数据联合起来,你根本无处遁形。你一年365天,一天24小时,一小时3600秒的以一举一动都在被大数据做用户画像默默的记录。你使用的APP越多,个人信息被记录的就越多,大数据对用户的画像就更加精确。

    如果是大数据级别的用户画像被滥用或被盗用,那么用户就无以遁形,别有用心的人掌握所有用户的信息以后,可以为用户量身定做各种陷阱,骗取用户的财产,伤害用户的人身安全等等。隐私问题已成为当今社会绕不过去的一大难题。


    3.区块链的隐私问题

    区块链交易并不需要用户现实身份,然而比特币等区块链技术并不是匿名系统。严格地讲,比特币是化名系统,所谓化名就是我们在网络中使用的一个与真实身份无关的身份。例如在比特币系统的交易中,使用者无需使用真名而是采用公钥哈希值作为交易标识。在这个例子中公钥哈希值就可以代表使用者的身份,与真名无关,因此,比特币是具备化名性的。

    但匿名与化名是不同的。在计算机科学中,匿名指的是具备无关联性(unlinkability)的化名。所谓无关联性,就是指站在攻击者的角度,无法将用户与系统之间的任意两次交互进行关联。在比特币中由于用户反复使用公钥哈希值作为交易标识,交易之间显然能建立关联。因此比特币并不具备匿名性。

    区块链数据对所有人都是公开的,包括每一个想要利用信息获取经济利益的恶意罪犯。一旦区块链用户的真实身份和区块链账户信息遭到泄露,该用户所有的链上信息将被获取。2013年Meikejohn等人列出一个包含服务提供商、交易所、矿池标签的标签簇图来表明可以查询任意交易地址与这些标签的交易时间、数额等。结合服务提供商的地址信息及公开账本,如果可以获取个人用户现实生活中的身份信息(例如用户去实体店用比特币支付并被摄像头拍下),那么个人用户的历史消费记录将显露无遗,这将带来严重的用户隐私问题。

    在金融系统或者供应链系统中也存在类似的问题。例如:如果两家公司在区块链上签订了智能合约,但并不希望马上披露以免引发股价异常波动又或者销售商并不希望披露自己的供应商,否则可能造成竞争加剧以及自己的成本上升。在这些场景中使用者一方面希望使用区块链低成本共识的特点,一方面又想保护自己的商业隐私。

    如何在保障隐私的情况下实现区块链的特性(交易可验证、历史可查等),下面我们我们将介绍几种典型的匿名化技术。


    4.隐私交易相关技术

    针对隐私需求,近几年来有大量的研究工作被提出:在密码学货币领域中有达世币(Dash)、门罗币(Monero)、零钞(Zcash)等等,它们能在一定程度上解决交易数据的隐私问题;而Hawk主要用解决合约内容的隐私问题;Quorum基于于金融中实际的业务情况将数据划分为隐私和公开两部分进行操作来保护用户隐私; Coco(confidentialconsortium blockchain)框架则利用可信执行环境( trusted execution environment,TEE)在对整个区块链数据进行加密的同时兼顾了数据在各个节点的可验证性。上述研究保护隐私的原理各不相同,有些研究采用多项技术来保护隐私,而且他们针对的区块链场景也有差别。

    在Dash、Monero和Zcash等几种支持隐私交易的加密货币中,Dash使用了一种称之为合币(CoinJoin)的关键技术;Monero的关键技术有两个:隐蔽地址(stealthaddress)和环签名(ringsignature);Zcash使用的关键技术为零知识证明(zero knowledge proof)。在Dash中,存在主节点被控制以及参与混币有恶意用户的风险,这在一定层度上会导致用户隐私的泄露。Monero中使用的环签名技术需要与其他用户的公钥进行混合,因此可能会遭遇到恶意用户从而暴露隐私。Zcash利用零知识证明避免了上述技术中的相关问题,让用户只是通过和加密货币本身进行交互来隐藏交易信息,是目前匿名性最好的加密货币。由于篇幅所限,本文只对Dash和Monero进行简单介绍,着重介绍Zcash的相关背景和原理。


    5.Dash

    Dash中使用的合币技术,简单来说,就是通过一些主节点(master node)来将多个用户(至少3个)的多笔交易进行混合、形成单一交易的技术。在Dash中,每个用户都会提供一个输入输出地址,然后将其送到主节点进行混合(即任意交换输入输出地址)。交易只能以0.1,1,10或者100个达世币来进行,这样就增加了攻击者从数额的角度来猜测交易关联度的难度。同时主节点要保证乱序输出。

    Dash中一个关键的保护隐私的角色就是主节点,因为主节点依然存在被攻击者控制的可能性。为了解决这个问题,Dash中引入了链式混合(chaining)以及盲化(blinding)技术。所谓链式合,就是指用户的交易会随机选择多个主节点,并在这些主节点中依次进行混合,最后输出;所谓盲化技术,就是指用户不直接将输入输出地址发送到交易池,而是随机选择一个主节点,让它将输入输出传递到一个指定的主节点,这样后一个主节点就很难获取用户的真实身份。通过这2个技术除非攻击者控制了很多的主节点,否则几乎不可能对指定交易进行关联。第一个主节点转发输出地址,而输入地址就是主节点的地址,从而第2个主节点拿不到输人地址。

    除了防范交易数额以及输入输出地址的关联攻击,Dash还防范了交易时间上的关联攻击。每个用户往往都会具备自己的交易习惯,例如每天的交易时间段以及短时间内进行多笔交易等等。这些时间信息也会在一定程度暴露用户身份。为了解决这个问题,Dash提出了被动(passive)匿名化的方案,保证用户客户端以固定的时间间隔发起交易请求,来参与主节点的混合。


    6.Monero

    由于在Dash中依然存在主节点被控制以及参与混币有恶意用户的风险,这在一定程度上会导致用户隐私的泄露。为了解决这个问题,门罗币提出了一种不依赖于中心节点的加密混合方案,即隐蔽地址(stealth address)和环签名(ring signature)。

    隐蔽地址是为了解决输人输出地址关联性的问题。每当发送者要给接收者发送一笔金额时,他会首先通过接收者的地址(每次都重新生成),利用椭圆曲线加密算出一个一次性的公钥。然后发送者将这个公钥连同一个附加信息发送到区块链上,接收方可以根据自己的私钥来检测每个交易块,从而确定发送方是否已经发送了这笔金额。当接收方要使用这笔金额时,可以根据自己的私钥以及交易信息计算出来一个签名私钥,用这个私钥对交易进行签名即可。这个私钥是专门用来签名某次交易的,由于公钥一次性,私钥也是一次性。

    隐蔽地址虽然能保证接收者地址每次都变化,从而让外部攻击者看不出地址关联性,但并不能保证发送者的匿名性。因此门罗币提出了个环签名的方案。每当发送者要建立一笔交易时,他会使用自己的私钥加上从其他用户的公钥中随机选出的若干公钥来对交易进行签名。验证签名时,也需要使用其他人的公钥以及签名中的参数。同时,发送者签名的同时还要提供钥匙映像(key image)来提供身份的证明,区块链会根据发送方的私钥及之前交易信息产生“镜像钥匙”并保存在区块链里。每次有新交易过来都会检查“钥匙镜像”这之前是否已经出现过,以保证一笔交易不会重复执行,即防止“双花问题”。

    除了交易地址,交易金额也会暴露部分隐私。门罗还提供了一种叫作环状保密交易(RingCT)的技术来同时隐藏交易地址以及交易金额。在 RingCT 的交易中, 用户不会直接公开给网络5XMR,而是提供一个数字rct,作为交易金额输出。rct= 随机数 + 5(真正的交易金额)。随机数是用来为真实金额遮盖的,由钱包自动产生。网络可使用这个rct值去验证交易输入是否等于交易输出的金额,以确认没有额外的 Monero 被伪造产生。然而,对于一个外部的观察者而言,无从得知实际交易金额。

    有了隐蔽地址(stealth address)、环签名(ringsignature)、环状保密交易(RingCT),Monero完备地实现了针对某一笔交易,第三者无从了解交易发送方(环签名的缘故),交易的接收方(隐蔽地址的缘故),交易金额(环状保密交易的缘故)


    7.Zcash

    7.1.零知识证明

    首先我们简要介绍什么是零知识证明。它指的是证明着能够在不向验证着提供任何有用信息的情况下,使验证者相信某个论断是正确的。在Zcash的设计中,就采用了一种叫做zkSNARK(zero knowledgesuccinct non-interactive arguments of knowledge)的非交互式的零知识证明。

    在这里我们并不深入介绍zkSNARK的细节,只是大致描述Zcash中如何使用这项技术以及保证匿名性的。


    7.2.Zcash原理介绍

    如下图Zcash系统的概览,其底层实现依然基于类似于比特币的结构,而Zcash系统利用zkSNARK构造了去中心化的混币池通过铸币(mint)与浇铸(pour)操作可以完成匿名性。所谓铸币过程,就是用户使用一定数额的零钞(ZEC)兑换等值的承诺(commitment),向一个列表中写入承若的过程。其中承诺必须由个一次性的序列号以及用户私钥才能计算得到,并且是不可逆的。

    与比特币类似,ZEC发行数量的增加基于挖矿所得,而矿工得到的零钞是可查询有记录的,其使用也需要私钥签名。因此若是直接使用ZEC,其与比特币类似,可以直接完成各个地址之间的转账,但这时是不匿名的。而经过铸币操作得到的承若与个人地址表面上无关(但是其生成依赖于公钥和一个一次性随机数)。当用户想要花这个币时(即转账),与比特币需要提供签名不同,用户需要做2件事:1)给出序列号;2)利用zkSNARK证明自己知道存在于承诺列表中的某个承诺的用户私钥。这样,用户就可以在完全不暴露身份的情况下,花出这个币。

    以上的情形有3个问题:1)币值总限制在已有承诺列表的数额中,实际使用不方便;2)发送方可以通过序列号来判断接收方正在花钱;3)接收方必须马上花掉得到的币,否则可能被发送方提取。为了解决这3个问题,Zcash中引人了一种浇铸(pour)的操作来花销钱币。简单地讲,浇铸操作就是通过一列零知识证明,将一个币铸造成多个等值的币。每个新币都有自己的密钥、数额、序列号等等,且部分信息需要用接收者私钥算出。除了发送者都无从得知接收者是谁,而发送者无法知道新币的序列号,因此无法使用这个币,也无法知道接收者在何时花掉了这个新币,从而解决了以上3个问题。

    除了发送方和接收方,矿工作为Zcash交易系统中确认交易的成分,他们会在不知道交易发起者是谁,交易接收者是谁的情况下完成交易确认。矿工只需要验证交易发起者的零知识证明,确认某个交易发起人可以使用承诺列表里的某个承诺,并把承诺对应的序列号放入列表。在这个过程中,矿工不知道用户具体用了承诺列表中的哪个承诺,而仅仅是知道某个承诺被使用了。而由序列号的唯一性保证了同一承诺不能被使用2次(即防止了“双花”)。

    用户还可以用赎回操作将混币池中的ZEC提取出来,即所谓赎回操作。赎回操作则是把一个承诺重新换为ZEC,与之前的过程类似,矿工也并不知道哪个承诺被赎回换为ZEC。因此甚至可以说不用向任何人转账,仅仅是把个ZEC放到混币池中再赎回,它的来源都不可追踪。


    7.3.Zcash交易简单描述

    7.3.1.交易结构与地址种类

    Shielded address表示的是这种地址是具有隐私性的,通常以字母z开头,或称z-addrs,一个交易的送方可以是z-addr同时收方也是一个z-addr,而其他的交易资讯,如送的ZEC数量与收的ZEC数量同时都可以遮蔽保有隐私性,而证明某个地址的确保有某个utxo的所有权并可交易,则需要透过密码学的zero-knowledge proof的方式产生一个证明,并且此种零知识证明具有non-interactive的性质,亦即任意public verifier皆可自行验证某個prover有权花费某个utxo这件事的真伪。

    另外,交易手续费将永远是公开的,故一个Zcashtransaction本身可以包含隐私的地址、公开的地址、隐私的ZEC数量、公开的ZEC数量、公开的手续费等资料。


    7.3.2.交易隐私性的种类

    Public:此种交易的交易收送方和金额都是公开的,与bitcoin相同,可以说是没有任何隐私性,只有区块链自有的匿名性

    Shielding:由非隐私账户转给隐私账户

    Deshielding:隐私账户转给非隐私账户

    Private:完全隐私交易


    7.3.3.隐私交易

    每一个未花掉的UTXOs可以想象成是一个note,可以用元组表示(pubkey,value,r),pubkey是该note拥有者的公钥,value是面值,rho是序列号,具有唯一性,目的是为了防止双花。未花费的notes可以这样表示:

    Note1 = (pk1, r1, v1)

    Note2 = (pk2, r2, v2)

    Note3 = (pk3, r3, v3)

    为了保护隐私,区块链上不能直接存储notes,而是存储notes的密文:

    H1 = HASH(Note1)

    H2 = HASH(Note2)

    H3 = HASH(Note3)

    只要新的Note一生成,那么它的hash值就会被提交到区块链上。如果拥有者想要花费一个note,那么他需要向全网提交该note中r 的hash值,表示该note已被消费。举例,当note2被使用掉之后,记录note的资料库如下表:

    HASHED NOTES

    NULLIFIER SET

    H1 = HASH(Note1)

    nf1 = HASH(r2)

    H2 = HASH(Note2)


    H3 = HASH(Note3)


     

    7.3.4.生成隐私交易

    假设Alice拥有note1,想要交易给Bob,Bob的公钥是PK4,在先不解释太多密码学的前提下,先假设Alice和Bob之间有个私有通道可以直接沟通,则一个交易会如下步骤执行:

    ①Alice随机挑选一个r4,并定义新的Note4=(PK4, r4)

    ②Alice透过私有通道传送Note4给Bob

    ③Alice传送Note1的nullifier,nf2=HASH(r1)给所有完整节点

    ④Alice传送Note4的hash value,H4=HASH(Note4)给所有完整节点

    当每个完整节点接收到nf2和H4,会检查nf2是不是在nullifier set中,若不存在,则将nf2加到nullifier set中,并将H4加到hashed notes中,故经过Alice和Bob此次交易后,note资料库如下表:

    HASHED NOTES

    NULLIFIER SET

    H1 = HASH(Note1)

    nf1 = HASH(r2)

    H2 = HASH(Note2)

    nf2 = HASH(