Matthew Green和Ian Miers 发表于2017年论文《Bolt: Anonymous Payment Channels for Decentralized Currencies》。
相关代码实现见:
使用payment channel进行链下支付的典型方案有:
无需将每笔交易提交到链上,channel在2方初始建立a shared deposit时会使用链,然后2方可直接进行支付——调整该deposit中相应的ownership shares,仅 在需要关闭channel 或 存在争议需要解决 时,才会再与链上通讯。
若2方之间无直接的payment channel,可通过中间peer路由实现支付。
payment channel的最大优势在于,可在无需引入可信第三方和中心化机制的情况下,大幅减少链上的交易存储空间。
尽管payment channel可解决扩容问题,但是存在一些隐私弱点:尽管交易发生在链下,任何人都可获知 the pseudonymous identities and initial (resp. final) channel balances of the
participants。更严重的是,对于交易对手方,payment channel可提供的隐私保护有限。
更严重的是,通过建立channel来为Tor bandwidth 或 web content 付费,用户可含蓄地将该channel的每笔交易 关联 到其通过该channel的其他所有支付信息。
Bolt(Blind Off-chain Lightweight Transactions)中,包含了一系列技术,用于构建privacy-preserving unlinkable payment channels for a decentralized currency。本文提出了三种实现方式:【将通道内双方的角色分别称为customer客户 和 merchant供货商。】
链的作用主要为:
任何payment channel必须满足2个条件:
payment channel的隐私性:
本文提出了2种构建隐私支付通道的方案:
e-cash scheme中有一个名为bank的可信第三方,bank会issue one-time tokens(又名coins),customer可一次性赎回这些one-time tokens。
merchant承担bank的角色,会issue a “wallet” of anonymous coins to the customer,customer可spend这些coins back to the merchant。
关闭channel时,customer会将剩余的coins发给自己,然后向链上提供相应的证据。merchant可通过提交双花证明来抗议customer的statement。
以上方案存在如下弱点:
单向支付通道限制了:所有支付仅能由customer 到 merchant。
因此,基于现有(non-anonymous)支付通道 + 盲签名和zkProofs,来实现双向隐私支付通道。
关键点在于:
防止dishonest customer在通道关闭时使用老版本的refund token。
为此,在每次支付时,customer都需要给merchant一个revocation token for the previous state。如果customer表现honest,则该revocation token将永远不会关联channel 或 任何previous transactions。
一旦customer misbehave——将过期的refund token提交上链,则merchant可立即监测到该情况,将该revocation token提交到链上作为customer恶行的证明,链上会将该channel的balance都奖励给merchant。
基于双向支付通道可构建第三方支付。A 通过 untrusted中介I 向 B 支付。
本文的主要优势在于,中介I 无法将交易关联到用户,也不知道特定交易包含的金额。即使I compromised,其也无法claim any transactions passing through it。
对于单项支付通道,当通道关闭时,最终channel balances将公开。customer和merchant之间的支付为non-interactive的,为完全匿名的。
对于双向支付通道,在执行过程中终止时,merchant可让customer处于无法再发起支付交易的状态,这无法阻止merchant向链上求助来关闭通道,但需要考虑2方面的隐私:
对于传统商业设置,abort的后果可很小:无论是何种支付机制,若供货商无法提供合适的商品,customer可终止交易。对于微支付场景,应考虑abort的情况。customer应扫描链上未成熟的关闭,若customer的open channels数低于其最小anonymity set,则abort该channel。
APC(Anonymous Payment Channel)匿名支付通道为2方基于某链(支付网络,该支付网络应可conditionally escrowing funds and binding these transactions funds to some data,如记录Bitcoin链上)构建的链下支付通道。
APC中包含了一组probabilistic算法:
以及2个交互协议:
Establish
Pay
实例化匿名支付通道的流程为:
Establish
协议来激活支付通道。若双方不认可the initial channel balances,则协议返回 ⊥ \perp ⊥,且可关闭通道。Pay
协议任意多次,直到一方 或 双方关闭该通道。APC的正确性是指:若整个过程中都是是正确且honest执行的,则每次运行Pay
协议都是成功的,且最终的 R e f u t e Refute Refute输出可反应正确的final channel balance。
APC的安全性主要体现在:
APC中涉及的技术要点有:
本文实际实现了3种APC协议:
主要对[CHL05]中的compact e-cash技术进行改进实现的高效、succinct单向匿名支付通道。
在compact e-cash scheme中,customer withdraw a fixed-size wallet capable of generating B B B coins。customer的wallet基于tuple ( k , s k , B ) (k,sk, B) (k,sk,B),其中:
customer的wallet一经merchant签名,即可用于生成最多 B B B coins:
第 i t h i^{th} ith coin包含了tuple ( s , T , π ) (s,T,\pi) (s,T,π),其中:
整个构建过程,可保证Verifier可立即发现双花,因为2笔交易使用相同的serial number s s s。
结合double-spend tags,Verifier可恢复spender的public key。
与此同时,各个coin spends无法与 用户或其他coin spends 进行关联。
基于compact e-cash构建的单向支付通道,merchant承担bank角色,会为customer issue a wallet of B B B coins,customer可将其匿名地 spend back to the merchant。
在关闭通道时,customer可简单滴spends any unused coins “to herself”,从而向merchant证明其没有该通道的spending capability(若后续再尝试spend这些coins,merchant可将其看作是双花行为)。
但是compact e-cash提供了succinct wallet,但是未能在关闭通道时提供succinct protocol。因为customer无法在不影响wallet中之前花费coin隐私性的情况下,简单地公开wallet secrets。因此,需要一种机制来succinctly reveal only a fraction of the coins in a wallet,而无需reveal all the coins。与此同时,还希望避免复杂的证明。
本文的方案为:merchant会存储必要的信息来验证通道关闭,因此需要对[CHL05]中的compact e-cash scheme进行改进。
具体为:
其中的Establish
和Pay
协议为:
4.1节的单向支付通道,存在如下缺陷:
因此需要构建双向支付通道,支持:
Pay
protocol to transfer arbitrary values (受限于最大支付金额)双向支付通道的customer wallet 与 单向支付通道的customer wallet 结构类似,包含了:
当merchant为wallet的内容提供盲签名后,该wallet被激活。
Signed wallets are obtained as in the previous protocol, with a commitment being placed in the anchor transaction and signing happening once the transaction is confirmed.
不同于之前协议中使用a series of individual coins来支付 ϵ \epsilon ϵ,此处,customer和merchant简单地将现有价值为 B c u s t B^{cust} Bcust的signed wallet 交换为 价值 B c u s t − ϵ B^{cust}-\epsilon Bcust−ϵ的新signed wallet(对应有a fresh wallet public key w p k n e w wpk_{new} wpknew)。此时的 ϵ \epsilon ϵ可为正值,也可为负值。
customer采用zero knowledge proof和签名来证明 the contents of the new requested wallet are constructed properly,该新wallet的balance与之前的balance之差为 ϵ \epsilon ϵ,且 ( B c u s t − ϵ ) ≥ 0 (B^{cust}-\epsilon)\geq 0 (Bcust−ϵ)≥0。
与此同时,customer需要公开 w p k o l d wpk_{old} wpkold,以此向merchant保证该wallet不会双花。old wallet将由customer使用相应的私钥 w s k wsk wsk进行“revoked” message签名来使其失效。
关闭通道时,customer需要向链上提供由merchant签名的valid wallet。
构建过程中的调整在于:使现有wallet失效的同时,签名一个新的wallet。若merchant在old wallet失效之前签名了新wallet,则customer可retain the funds in the old wallet while continuing to use the new one。若merchant在签名新wallet之前使old wallet失效,若merchant拒绝签名新的wallet,则customer没有办法来关闭通道。
为此,需要通过interactive payments,区分在关闭通道时提供的value,采用2个子阶段协议来获取每组值。不公开最新的wallet w w w,customer使用包含了 B c u s t B^{cust} Bcust、当前wallet公钥 以及 merchant签名 的 refund token r t rt rt来关闭通道,
即,将Pay
协议分为2个阶段:
双向支付通道整个构建过程为:
其中双向支付通道中的Establish
和Pay
协议为:
双向支付通道的一个主要限制在于:
若A与中介I开通了双向支付通道,B与中介I开通了双向支付通道,则A可通过中介I向B进行支付。
双向第三方支付通道的主要挑战在于支付的原子性,即:
一旦中介I向接收方B付款,则A才向中介I付款。这将给中介I带来风险,若A无法完成整个支付。同时,若中介disonest,也会给A带来风险。
回忆下4.2节双向支付通道Pay
协议的2个阶段:
为了保证chained transaction A → I → B A\rightarrow I\rightarrow B A→I→B 的安全,要求这2个环节中的第一阶段为原子式成功或失败。
为此,需要给refund tokens增加条件,这些条件为simple statements for the network to evaluate on examining a token during the Resolve
protocol。
特别地,为了避免接收方 B B B claiming funds form I I I if 付款方 A A A has not delivered a corresponding payment to I I I,为此,需要给 B B B的refund token引入如下条件:
在第三方支付通道中,由于 I I I作为积极参与者,并不维护channel的状态, I I I也无需知道支付的金额。只要 A , B A,B A,B对支付金额 ϵ \epsilon ϵ达成共识(即双方在各自的channel中有足够的金额),任何一方都无法向 I I I透露 ϵ \epsilon ϵ。 I I I仅确信the balance of funds is conserved。
为了隐藏支付金额,需要将图3 Pay
协议中构建 π 2 \pi_2 π2的proof statement进行修改:
不再向merchant公开 ϵ \epsilon ϵ,customer需对 ϵ \epsilon ϵ进行commit,然后在支付中将该值作为secret input。同时,也要调整协议中 B B B的wallet, B B B需要证明其wallet已调整了 − ϵ -\epsilon −ϵ。
整个 π 2 \pi_2 π2调整为:
然后 A A A向 I I I证明that the two payments cancel or (if f e e fee fee is non-zero),leave B B B with f e e fee fee extra funds via a proof:
第三方支付通道整个流程为:
第三方支付通道中的Pay
协议为:
第三方支付通道的主要挑战在于:
malicious I I I可选择性地在交易中终止协议,从而迫使 A A A和 B B B向链上提交交易以恢复其资金。可link该payment到 A , B A,B A,B的channel。这种问题,在交互式协议中,很难从根本上避免。
可在通道中冲入匿名currency,以尽可能地减少匿名信的威胁。关联2个不同的channel并不会泄露参与者的身份。最重要地是,由于中介仅可在每个通道使用一次abort技术,merchant无法关联同一通道内的不同支付。最后,执行abort的中介会在链上产生公开记录,使得参与者可回避该malicious中介。
以上三种创建方式,当通道关闭时,存在channel balance将会被公开的隐私问题。
While individuals can protect their identities and initial channel balances by using an anonymous currency mechanism to fund channels, the information about channel balances leaks useful information to the network.
注意,对于不存在争议的通道关闭流程,可按如下方式隐藏信息:
在类似Zerocash [SCG+14]的系统中,the final payment redeeming coins to the merchant and customer can be modified to include an additional statement: the amounts paid in this transaction are consistent with the commitment, and do not exceed the initial funding transaction that created the channel.【本文未来将进一步研究】