Platypus: A Central Bank Digital Currency with Unlinkable Transactions and Privacy-Preserving Regulation

论文地址:https://dl.acm.org/doi/10.1145/3548606.3560617

摘要

由于基于区块链的加密货币的普及,支付的日益数字化以及现金在社会中的作用不断减弱,各国央行对部署央行数字货币(CBDC)表现出越来越大的兴趣,这种数字货币可以作为数字现金的替代品。尽管大多数关于CBDC的研究都集中在区块链技术上,但这种技术选择是否提供了最优解决方案尚不明确。特别是,CBDC的集中信任模型为不同的设计提供了机会。在本文中,我们摒弃区块链设计,转而借鉴传统电子现金方案的思想。我们提出了一种新的构建数字货币的方法,将电子现金的交易处理模型与基于账户的资金管理模型相结合。我们认为,这种构建数字货币的方式特别适用于CBDC。我们还设计了第一个这样的数字货币系统,名为Platypus,它提供了强大的隐私保护、高可扩展性以及简单却具有表现力的监管,这些都是CBDC的关键特性。Platypus通过采用类似于Zcash等匿名区块链加密货币中使用的技术来适应我们的账户模型,并将它们应用于电子现金环境,从而实现了这些特性。

关键词 数字货币

问题介绍

区块链在无权限数字货币(即不依赖于可信中央机构的数字货币)中的普及。中央银行数字货币(CBDC)受到这种启发,具有不同于无许可加密货币的信任模式和要求。传统的电子现金为发送者提供了隐私,但泄露了交易金额,在分布帐的系统中,硬币不需要存入,而是进行价值转移。

与基于分类账的系统相比,电子现金系统有几个优点。电子现金系统更容易扩展,对客户端的要求可能会降低,因为在基于分类账的系统中,客户端会随时更新整个分类账或使用轻量级客户端,这就降低了客户端的隐私性。

本文的目标:希望利用中央银行数字货币的不同信任模型,并结合基于账本的数字货币和传统电子现金方案的优势。

为了实现这些目标,作为本文的第一个主要贡献,我们提出了一种构建数字货币的新方式,它将电子现金支付的交易处理模式与基于账户的用户资金管理模式相结合。

作为本文的第二个主要贡献,我们设计了第一个遵循这种设计模式的数字货币系统,名为Platypus。在Platypus中,每个参与者都拥有一个账户,该账户由中央银行签署的一个序列号和余额的承诺(称为账户状态承诺)来表示。交易包括更新发送方和接收方的承诺。发送方和接收方披露其当前账户状态的序列号,以零知识证明他们拥有由中央银行签署的相应状态承诺,并且他们的余额之和保持不变。

动机和目标

目前,在许多司法管辖区,现金的获取和使用都在下降,这就造成了一些企业和家庭无法获取无风险的中央银行货币的风险。CBDC可以填补这一空白,确保人们对货币的信心。

现金不仅提供无风险的中央银行货币,而且还提供非常强大的隐私保证。在现金支付中,第三方既不会知道交易双方的身份,也不会知道交易的价值。这也是CBDC应该具有的特性。对CBDC的另一个监管要求是执行反洗钱法。然而,这与改善支付隐私的目标存在部分冲突。解决这一冲突的方法是允许匿名支付,但每单位时间内的支付金额不得超过一定限额,超过限额后收款人需向监管机构披露身份。基于这些动机和想法,我们将重点放在零售CBDC上。

假设

我们假设中央银行的隐私是不可信的。

我们认为完全防范基于网络的去匿名化攻击(例如,将一个IP地址与多个交易联系起来)不在本文的讨论范围之内。

我们假设客户之间通过安全通道进行通信,并且所有使用的加密原语根据其安全性的标准定义都是安全的。

我们假设承诺具有计算约束力和隐藏性,签名是不可伪造的,零知识证明系统是零知识并提供健全性,加密是CPA安全的。

我们还假设零知识证明提供语句的不可并行性

Platypus 设计

Platypus采用账户模型和电子现金的混合设计,每个参与者负责跟踪自己的账户状态,账户状态被保存为类似于电子现金系统中硬币的对象。然而,与电子现金不同的是,客户通常拥有多个可用于交易的硬币,而客户只有一个账户状态,该账户状态在每次交易中都会被消耗,并被新的账户状态取代。该账户状态由账户余额balibal_i和序列号serialiserial_i的账户状态承诺stateistate_i表示。账户状态承诺由之前的交易产生,并由中央银行签署。为了签署这些状态承诺,中央银行使用其秘密密钥skCsk_C(与公钥pkCpk_C相对应)。

image-20230719094248803

如图显示了在发送方和接收方均已参与系统的正常情况下交易的处理过程。

在步骤1中,Alice发起交易,通过创建发送方账户更新向接收方Bob发送vTxv_{Tx}值。Alice 使用随机盲因子 blindTxblind_{Tx} 对值 vTxv_Tx 创建一个承诺,称为交易承诺,用 commTx=comm(vTx,blindTx)comm_{Tx}=comm(v_{Tx},blind_{Tx}) 表示。

然后,爱丽丝创建一个新的状态承诺statei+1Astate_{i+1}^A,该状态承诺statei+1Astate_{i+1}^A承诺一个新的伪随机(基于长期密钥)选择的序列号seriali+1Aserial^A_{i+1}和一个值bali+1A=baliAvTxbal_i+1^A=bal_i^A-v_{Tx},其中baliAbal^A_i是在当前状态承诺stateiAstate_i^A中承诺的余额。然后 Alice 创建一个非交互式零知识证明zkpi+1Azkp_{i+1}^A 来证明她正确地执行了这些步骤。

零知识证明zkpi+1Azkp_{i+1}^A 以及交易承诺commTxcomm_{Tx}、旧状态serialiAserial_i^A和新账户状态承诺statei+1Astate_{i+1}^A随后被发送给接收者Bob。Alice还提供了打开承诺commTxcomm_{Tx}所需的随机值blindTxblind_{Tx},这样Bob就可以用它为自己的账户更新创建零知识证明。

为了完成交易(步骤 2 ),Bob 接着创建一个接收方的账户更新,其步骤与 Alice 类似,不同之处在于他的零知识证明zkpj+1Bzkp_{j+1}^B重复使用了交易承诺 commTxcomm_{Tx},并证明了他在新状态statej+1Bstate^B_{j+1} 中的账户余额与他之前的状态statejBstate_j^B相比,正好增加了vTxv_{Tx},序列号为 serialjBserial_j^B

一旦 Bob 创建了证明 zkpj+1Bzkp_{j+1}^B,他就会发送交易承诺 commTxcomm_{Tx}、Alice’ 和他的序列号(serial𝑖𝐴,serial𝑗𝐵)(serial_𝑖^𝐴, serial^𝐵_𝑗 )、 向中央银行提交两个新的状态承诺(statei+1𝐴,state𝑗+1𝐵)(state_{i+1}^{𝐴}, state^𝐵_{𝑗+1})和两个零知识证明zkpi+1A,zkp𝑗+1𝐵zkp^A_{i+1}, zkp^𝐵_{𝑗+1}

然后,中央银行通过验证两个零知识证明并检查序列号(serial𝑖𝐴,serial𝑗𝐵)(serial_𝑖^𝐴, serial^𝐵_𝑗 )是否在以前的交易中使用过来执行交易(步骤 3 )。如果是这种情况,中央银行会将这两个序列号添加到已使用的序列号集合中,用其私人密钥skCsk_C签署两个新的状态承诺(statei+1𝐴,state𝑗+1𝐵)(state_{i+1}^{𝐴}, state^𝐵_{𝑗+1}),并发送签署的序列号σ𝑖+1A=Sign(𝑠𝑘𝐶,state𝑖+1A)\sigma _{𝑖+1}^A = Sign(𝑠𝑘_𝐶, state^A_{𝑖+1})σ𝑖+1B=Sign(𝑠𝑘𝐶,statej+1B)\sigma _{𝑖+1}^B = Sign(𝑠𝑘_𝐶, state^B_{j+1}) 返回给 Bob,Bob 检查签名是否有效,如果有效,则接受付款(步骤 4)。然后,鲍勃将σi+1A\sigma_{i+1}^A 转发给爱丽丝,爱丽丝验证签名并更新其存储的状态信息,从而完成支付(第 5 步)。

交易细节

Setup

为建立系统,中央银行创建一个用于签署账户状态承诺的私钥/公钥对skC,pkCsk_C,pk_C,并公布其公钥pkCpk_C。中央银行还设置了一个参数 balmaxbal_{max},这是账户余额的最大限制,以防止数值溢出(即由于所有数值都是有限域元素,因此可确保余额不能为负),其值可设置为大于账户余额的所有实际数值。

当用户𝑈 注册进入系统时,他们会创建一个密钥𝑠𝑘𝑈=(𝑠𝑘U1,𝑠𝑘𝑈2)𝑠𝑘_𝑈 = (𝑠𝑘_{U1},𝑠𝑘_{𝑈2}),由两个随机选择的密钥𝑠𝑘𝑈1,𝑠𝑘𝑈2𝑠𝑘_{𝑈 1},𝑠𝑘_{𝑈 2} 组成。

为了创建注册交易,𝑈 会生成伪随机值 $serial^𝑈_1,blind^𝑈_1 从他们的私钥从他们的私钥serial_1^U=f_{sku1},blind_1^U=g_{shku2}$,并用它们创建新的状态承诺 state1𝑈=comm(serial1𝑈,bal1𝑈,blind1𝑈)state^𝑈_1 = comm(serial^𝑈_1,bal^𝑈_1,blind^𝑈_1 ),表示没有余额的账户,即 bal1U=0bal_1^U=0,𝑈 创建一个非交互式零知识证明 zkp1𝑈zkp^𝑈_1,证明账户状态承诺对应于余额为零的账户,即 zkp𝑈1 证明了以下语句

给出公众值:state1Ustate_1^U,知晓私值: skU1,serial1U,blind1Usk_{U1},serial_1^U,blind_1^U

这样:state1U=comm(serial1U,0,blind1U),serial1U=fskU1(0)state_1^U=comm(serial_1^U,0,blind_1^U),serial_1^U=f_{skU1}(0)

然后𝑈 将状态state1Ustate_1^Uzkp1𝑈zkp^𝑈_1 发送给中央银行。银行检查证明是否正确,然后签署账户状态承诺状态state1Ustate_1^U,并将签名发回给𝑈。

Transaction Creation

我们将介绍发送方(Alice)和接收方(Bob)之间的交易是如何创建的。我们假定,除非另有说明,客户会对所有值保密,并且他们会通过安全通道进行通信。在实践中,发送方需要通过认证通道(类似于接收比特币地址)从接收方那里接收一个公钥,然后用来建立通道。这个公钥可以作为二维码显示在支付终端、电子商务网站或手机上。

A当前账户状态:state𝑖𝐴=comm(serial𝑖𝐴,bal𝑖𝐴,blind𝑖𝐴)state_𝑖^𝐴 = comm(serial_𝑖^𝐴, bal_𝑖^𝐴, blind_𝑖^𝐴)

B前账户状态:statejB=comm(serialjB,baljB,blindjB)state_j^B = comm(serial_j^B, bal_j^B, blind_j^B)

此外,两人都持有中央银行对其账户状态承诺的签名:σiA=Sign(skC,stateiA),σjB=Sign(skC,statejB)\sigma _i^A =Sign(sk_C,state_i^A),\sigma _j^B =Sign(sk_C,state_j^B)

  1. Transaction Initiation:

(i) 为了给 Bob 创建一个值为vTxv_{Tx}的交易,Alice 选择一个新的随机值 blindTxblind_Tx 并创建一个承诺 commTx=comm(𝑣Tx,blindTx)comm_{Tx} = comm(𝑣_{Tx},blind_{Tx})
(ii) Alice 还从她的秘钥推导出伪随机值 serial𝑖+1A,blind𝑖+1Aserial_{𝑖+1}^A, blind_{𝑖+1}^Aserial𝑖+1A=𝑓𝑠𝑘𝐴1(serial𝑖𝐴),blind𝑖+1A=𝑔𝑠𝑘𝐴2(blind𝑖𝐴)serial_{𝑖+1}^A = 𝑓_{𝑠𝑘𝐴1} (serial_𝑖^𝐴) ,blind_{𝑖+1}^A = 𝑔_{𝑠𝑘𝐴2} (blind_𝑖^𝐴) 并创建新的账户状态 state𝑖+1A=comm(serial𝑖+1A,bal𝑖𝐴𝑣Tx,blind𝑖+1A)state_{𝑖+1}^A =comm(serial_{𝑖+1}^A, bal_𝑖^𝐴 - 𝑣Tx, blind_{𝑖+1}^A).

(iii) 然后,爱丽丝创建一个非交互式零知识证明 zkp𝑖+1Azkp_{𝑖+1}^A,证明以下语句: 给定公共值
serial𝑖𝐴,commTx,state𝑖+1A,balmax,𝑝𝑘𝐶serial_𝑖^𝐴, comm_{Tx}, state_{𝑖+1}^A, bal_{max}, 𝑝𝑘_𝐶
我知道秘密值
𝑠𝑘_{𝐴1},bal_𝑖^𝐴,bal_{𝑖+1}^A,blind_𝑖^𝐴,𝜎_𝑖^𝐴,𝑣_{Tx},blind_{Tx},serial_{𝑖+1}^A,blind_{𝑖+1}^A

使得
True = Vrfy(𝑝𝑘_𝐶, comm(serial_𝑖^𝐴, bal_𝑖^𝐴, blind_𝑖^𝐴), 𝜎_𝑖^𝐴)

commTx=comm(𝑣Tx,blindTx)comm_{Tx} = comm(𝑣_{Tx}, blind_{Tx})
state𝑖+1A=comm(serial𝑖+1A,bal𝑖+1A,blind𝑖+1A)state_{𝑖+1}^A = comm(serial_{𝑖+1}^A, bal_{𝑖+1}^A, blind_{𝑖+1}^A)

balmaxbal𝑖+1Abal_{max} ≥ bal_{𝑖+1}^A

bal𝑖+1A=bal𝑖𝐴𝑣Txbal_{𝑖+1}^A = bal_𝑖^𝐴 - 𝑣_{Tx}

serial𝑖+1A=𝑓𝑠𝑘𝐴1(seriali𝐴)serial_{𝑖+1}^A = 𝑓_{𝑠𝑘𝐴1} (serial_i^𝐴)
(iv) 然后 Alice 将𝑣TxblindTxcommTxserial𝑖𝐴state𝑖+1Azkp𝑖+1A𝑣_{Tx}、blind_{Tx}、comm_{Tx}、serial_𝑖^𝐴、state_{𝑖+1}^A、zkp_{𝑖+1}^A发送给 Bob。

  1. Transaction Completion

(i) 收到 Alice 发送的部分交易后,Bob 会删除serialj+1B=fskB1(serialjB),blind𝑗+1𝐵=gskB2(blindjB)serial_{j+1}^B=f_{skB1}(serial_j^B),blind^𝐵_{𝑗+1}=g_{skB2}(blind_j^B)的伪随机值serialj+1B,blindj+1Bserial_{j+1}^B,blind_{j+1}^B并且创建新的statej+1B=comm(serialj+1BbaljB+vTx,blindj+1B)state_{j+1}^B=comm(serial^B_{j+1},bal_j^B+v_{Tx},blind_{j+1}^B)

(ii) 如果B已经有一个账户,鲍勃创建一个非交互式零知识证明 zkp𝑗+1𝐵zkp^𝐵_{𝑗+1},与A的证明类似(不同之处在于证明他的余额增加了交易值),证明以下语句:

serialjB,commTx,statej+1B,balmax,pkCserial_j^B,comm_{Tx},state_{j+1}^B,bal_{max},pk_C

知道秘密值
𝑠𝑘_{B1},bal_j^B,bal_{j+1}^B,blind_j^B,𝜎_j^B,𝑣_{Tx},blind_{Tx},serial_{j+1}^B,blind_{j+1}^B

使得

True = Vrfy(𝑝𝑘_𝐶, comm(serial_j^B, bal_j^B, blind_j^B), 𝜎_j^B)

commTx=comm(𝑣Tx,blindTx)comm_{Tx} = comm(𝑣_{Tx}, blind_{Tx})
statej+1B=comm(serialj+1B,balj+1B,blindj+1B)state_{j+1}^B = comm(serial_{j+1}^B, bal_{j+1}^B, blind_{j+1}^B)

balmaxbalj+1Bbal_{max} ≥ bal_{j+1}^B

balj+1B=baljB𝑣Txbal_{j+1}^B = bal_j^B - 𝑣_{Tx}

serialj+1B=𝑓𝑠𝑘B1(serialjB)serial_{j+1}^B = 𝑓_{𝑠𝑘B1} (serial_j^B)

(iii) 然后 B将commTx,serial𝑖𝐴,state𝑖+1A,zkp𝑖+1A,serialiB,statei+1B,zkpi+1Bcomm_{Tx},serial_𝑖^𝐴,state_{𝑖+1}^A,zkp_{𝑖+1}^A,serial_i^B,state_{i+1}^B,zkp_{i+1}^B发送给 银行。

  1. Transaction Execution

(i) 中央银行检查序列号serialiAserial_i^Aserial𝑗𝐵serial^𝐵_𝑗 是否出现在其存储的以前使用过的序列号集中,并且两个零知识证明 zkpi+1Azkp_{i+1}^Azkp𝑗+1𝐵zkp^𝐵_{𝑗+1} 均已验证。如果情况并非如此,则中央银行拒绝交易并通知 Bob。
(ii) 否则,中央银行接受交易,并将这两个序列号添加到之前使用过的序列号集合中,将新的状态承诺签名为 𝜎^𝐴_{i+1} =Sign(𝑠𝑘_𝐶, state_{𝑖+1}^A)𝜎^𝐵_{𝑗+1} = Sign(𝑠𝑘_𝐶, state^𝐵_{𝑗+1}) 并发送给B。此外,中央银行还会发布转行动(即从 B 收到的所有值加上 𝜎_{𝑖+1}^A𝜎^𝐵_{𝑗+1})。

  1. Payment Acceptance

Bob 检查从中央银行收到的签名是否有效,接受付款并存储𝜎^𝐵_{𝑗+1},以便在这种情况下更新其账户,并将𝜎^A_{i+1}转发到A。否则,他会拒绝付款并通知 Alice。

  1. Payment Completion

Alice 检查从 Bob 收到的签名是否有效。否则,或者如果超时后仍未收到 Bob 的签名,她会检查中央银行的公共交易日志,以检索交易和新账户状态承诺上的签名。然后,她存储 σi+1A\sigma ^A_{i+1} 来更新她的账户,支付完成。