Platypus 一种集中式的央行数字货币方案

集中式的CBDC,混合使用账户模型和UTXO模型。

角色分类

image.png
中央银行:发行货币,交易验证,公开交易日志,防止双花。

  • 不是完全受信任的,假定为会遵守监管要求,但可能会破坏交易隐私,即获取交易信息(交易价值以及交易双方信息)。
  • 持有公私钥对

    (

    s

    k

    C

    ,

    p

    k

    C

    )

    (sk_C,pk_C)

    (skC,pkC),用于签名用户账户状态承诺。

监管者:发行证书,执行监管需求,如AML(反洗钱)。
用户:作为交易双方,维护自己的账户状态。

  • 持有公私钥对

    (

    s

    k

    U

    ,

    p

    k

    U

    )

    (sk_U,pk_U)

    (skU,pkU)

基本交易流程

image.png
账户由三部分组成,账户状态

s

t

a

t

e

i

state_i

statei,金额

b

a

l

i

bal_i

bali,序列号

s

e

r

i

a

l

i

serial_i

seriali
假设交易双方为A、B

  1. Transaction Initiation:发送方A更新自己账户,并发送一共6部分内容,

    1. v

      T

      x

      v_{Tx}

      vTx:交易金额。

    2. b

      l

      i

      n

      d

      T

      x

      blind_{Tx}

      blindTx:随机盲因子,用于生成承诺。

    3. c

      o

      m

      m

      T

      x

      comm_{Tx}

      commTx:交易承诺,

      c

      o

      m

      m

      T

      x

      =

      c

      o

      m

      m

      (

      v

      T

      x

      ,

      b

      l

      i

      n

      d

      T

      x

      )

      comm_{Tx}=comm(v_{Tx},blind_{Tx})

      commTx=comm(vTx,blindTx)

    4. s

      e

      r

      i

      a

      l

      i

      A

      serial_i^A

      serialiA:旧状态的序列号。

    5. s

      t

      a

      t

      e

      i

      +

      1

      A

      state_{i+1}^A

      statei+1A:新账户状态,基于以前的账户状态,通过伪随机生成的序列号

      s

      e

      r

      i

      a

      l

      i

      +

      1

      A

      serial_{i+1}^A

      seriali+1A和新的账户余额

      b

      a

      l

      i

      +

      1

      A

      =

      b

      a

      l

      i

      A

      v

      T

      x

      bal_{i+1}^A=bal^A_i-v_{Tx}

      bali+1A=baliAvTx生成。

    6. z

      k

      p

      i

      +

      1

      A

      zkp_{i+1}^A

      zkpi+1A:零知识证明,证明自己完全遵循上述步骤。

  2. Transaction Completion:接收方B更新自己账户,拿到信息后,和A一样计算自己的新账户状态,和相应的零知识证明,证明自己账户遵循合理步骤,账户相比之前的状态正好增加了对应金额。然后发送以下给央行。
  3. c

    o

    m

    m

    T

    x

    comm_{Tx}

    commTx:交易承诺。

  4. (

    s

    e

    r

    i

    a

    l

    i

    A

    ,

    s

    e

    r

    i

    a

    l

    i

    B

    (serial_i^A,serial_i^B)

    (serialiA,serialiB:交易双方的旧帐户序列号。

  5. (

    s

    t

    a

    t

    e

    i

    +

    1

    A

    ,

    s

    t

    a

    t

    e

    i

    +

    1

    B

    )

    (state_{i+1}^A,state_{i+1}^B)

    (statei+1A,statei+1B):交易双方的新账户状态。

  6. (

    z

    k

    p

    i

    +

    1

    A

    ,

    z

    k

    p

    i

    +

    1

    B

    )

    (zkp_{i+1}^A,zkp_{i+1}^B)

    (zkpi+1A,zkpi+1B):交易双方的零知识证明。

  7. Transaction Execution:央行首先验证双方零知识证明,然后检验两个旧帐户序列号是否出现在之前的交易中,没有出现则添加到已使用记录中,然后对两个用户状态签名得到

    (

    σ

    i

    +

    1

    A

    ,

    σ

    i

    +

    1

    B

    )

    (sigma_{i+1}^A,sigma_{i+1}^B)

    (σi+1A,σi+1B)

  8. Payment Acceptance:B验证签名是否有效,有效则接受此交易更新账户信息,然后转发

    σ

    i

    +

    1

    A

    sigma_{i+1}^A

    σi+1A给A。

  9. Payment Completion:验证签名并更新账户信息。

此外,为了防止B不发送签名给A,央行会同时发布从B收到的所有信息以及自己对新账户的签名,用于A通过自己的序列号找到自己的交易信息并接受。

基础协议流程

CRS(Common Reference String)在CDBC背景下是成立的,此背景默认Central Bank为trusted,无需其他假设。
设定一个监管者,一个央行,两个用户。

初始化

央行

  1. 创建自己密钥对

    (

    s

    k

    C

    ,

    p

    k

    C

    )

    (sk_C,pk_C)

    (skC,pkC),并公开公钥。

  2. 设置金额最大值

    b

    a

    l

    m

    a

    x

    bal_{max}

    balmax,防止溢出

用户注册

用户

  1. 生成私钥

    s

    k

    U

    =

    (

    s

    k

    U

    1

    ,

    s

    k

    U

    2

    )

    sk_U = (sk_{U1},sk_{U2})

    skU=(skU1,skU2),用于伪随机生成序列号

    s

    e

    r

    i

    a

    l

    1

    U

    serial^U_1

    serial1U和盲因子

    b

    l

    i

    n

    d

    1

    U

    blind^U_1

    blind1U

  2. 生成新的状态承诺

    s

    t

    a

    t

    e

    1

    U

    =

    (

    s

    e

    r

    i

    a

    l

    1

    U

    ,

    b

    a

    l

    1

    U

    ,

    b

    l

    i

    n

    d

    1

    U

    )

    state^U_1=(serial^U_1,bal^U_1,blind^U_1)

    state1U=(serial1U,bal1U,blind1U)

  3. 生成零知识证明

    z

    k

    p

    1

    U

    zkp^U_1

    zkp1U,证明自己的状态承诺中的

    b

    a

    l

    1

    U

    =

    0

    bal^U_1=0

    bal1U=0

  4. 发送

    (

    s

    t

    a

    t

    e

    1

    U

    ,

    z

    k

    p

    1

    U

    )

    (state^U_1,zkp^U_1)

    (state1U,zkp1U)给央行。

央行

  1. 验证,对账户签名,然后发送签名

    σ

    1

    U

    sigma_{1}^U

    σ1U给用户。

交易

假设交易双方为A, B。那么双方的当前的账户为

s

t

a

t

e

i

A

=

(

s

e

r

i

a

l

i

A

,

b

a

l

i

A

,

b

l

i

n

d

i

A

)

state^A_i=(serial^A_i,bal^A_i,blind^A_i)

stateiA=(serialiA,baliA,blindiA)

s

t

a

t

e

j

B

=

(

s

e

r

i

a

l

j

B

,

b

a

l

j

B

,

b

l

i

n

d

j

B

)

state^B_j=(serial^B_j,bal^B_j,blind^B_j)

statejB=(serialjB,baljB,blindjB)
双方都拥有当前账户的签名

σ

i

A

=

S

i

g

n

(

s

k

C

,

s

t

a

t

e

i

A

)

sigma_{i}^A=Sign(sk_C,state^A_i)

σiA=Sign(skC,stateiA)

σ

j

B

=

S

i

g

n

(

s

k

C

,

s

t

a

t

e

j

B

)

sigma_{j}^B=Sign(sk_C,state^B_j)

σjB=Sign(skC,statejB)

  1. Transaction Initiation

发送方A

  1. 确定交易金额

    v

    T

    x

    v_{Tx}

    vTx,选择随机数

    b

    l

    i

    n

    d

    T

    x

    blind_{Tx}

    blindTx,并创建承诺

    c

    o

    m

    m

    T

    x

    =

    c

    o

    m

    m

    (

    v

    T

    x

    ,

    b

    l

    i

    n

    d

    T

    x

    )

    comm_{Tx}=comm(v_{Tx},blind_{Tx})

    commTx=comm(vTx,blindTx)

  2. 生成新的序列号和盲因子,然后创建新的账户承诺

    s

    t

    a

    t

    e

    i

    +

    1

    A

    =

    c

    o

    m

    m

    (

    s

    e

    r

    i

    a

    l

    i

    +

    1

    A

    ,

    b

    a

    l

    i

    A

    v

    T

    x

    ,

    b

    l

    i

    n

    d

    i

    +

    1

    A

    )

    state_{i+1}^A=comm(serial_{i+1}^A,bal^A_i-v_{Tx},blind_{i+1}^A)

    statei+1A=comm(seriali+1A,baliAvTx,blindi+1A)

  3. 零知识证明,生成proof

    z

    k

    p

    i

    +

    1

    A

    zkp_{i+1}^A

    zkpi+1A。证明自己

    1. 旧账户是正确的,即账户和签名能通过验证,

      T

      r

      u

      e

      =

      V

      r

      f

      y

      (

      p

      k

      C

      ,

      c

      o

      m

      m

      (

      s

      e

      r

      i

      a

      l

      i

      A

      ,

      b

      a

      l

      i

      A

      ,

      b

      l

      i

      n

      d

      i

      A

      )

      ,

      σ

      i

      A

      )

      True = Vrfy(pk_C,comm(serial_{i}^A,bal^A_i,blind_{i}^A),sigma_{i}^A)

      True=Vrfy(pkC,comm(serialiA,baliA,blindiA),σiA)

    2. 承诺计算正确。
    3. 账户状态更新正确。
    4. 金额没有超过阈值。
    5. 金额更新正确。
    6. 序列号更新正确,即在旧序列号上伪随机产生。
  4. 发送信息

    v

    T

    x

    b

    l

    i

    n

    d

    T

    x

    c

    o

    m

    m

    T

    x

    s

    e

    r

    i

    a

    l

    i

    A

    s

    t

    a

    t

    e

    i

    +

    1

    A

    z

    k

    p

    i

    +

    1

    A

    v_{Tx},blind_{Tx},comm_{Tx},serial_i^A,state_{i+1}^A,zkp_{i+1}^A

    vTxblindTxcommTxserialiAstatei+1Azkpi+1A给B。

  1. Transaction Completion

接收方B

  1. 生成新的序列号和盲因子,然后创建新的账户承诺

    s

    t

    a

    t

    e

    j

    +

    1

    B

    =

    c

    o

    m

    m

    (

    s

    e

    r

    i

    a

    l

    j

    +

    1

    B

    ,

    b

    a

    l

    j

    B

    v

    T

    x

    ,

    b

    l

    i

    n

    d

    j

    +

    1

    B

    )

    state_{j+1}^B=comm(serial_{j+1}^B,bal^B_j-v_{Tx},blind_{j+1}^B)

    statej+1B=comm(serialj+1B,baljBvTx,blindj+1B)

  2. 零知识证明,生成proof

    z

    k

    p

    j

    +

    1

    B

    zkp_{j+1}^B

    zkpj+1B,和A一样。

  3. 发送信息

    c

    o

    m

    m

    T

    x

    s

    e

    r

    i

    a

    l

    i

    A

    s

    t

    a

    t

    e

    i

    +

    1

    A

    z

    k

    p

    i

    +

    1

    A

    s

    e

    r

    i

    a

    l

    j

    B

    s

    t

    a

    t

    e

    j

    +

    1

    B

    z

    k

    p

    j

    +

    1

    B

    comm_{Tx},serial_i^A,state_{i+1}^A,zkp_{i+1}^A,serial_j^B,state_{j+1}^B,zkp_{j+1}^B

    commTxserialiAstatei+1Azkpi+1AserialjBstatej+1Bzkpj+1B给央行

  4. Transaction Execution

央行

  1. 验证零知识证明和序列号是否重复,不通过则拒绝并通知B。
  2. 否则接受交易,存储序列号到已使用列表,对两个更新的新账户进行签名

σ

i

+

1

A

=

S

i

g

n

(

s

k

C

,

s

t

a

t

e

i

+

1

A

)

sigma_{i+1}^A=Sign(sk_C,state^A_{i+1})

σi+1A=Sign(skC,statei+1A)

σ

j

B

=

S

i

g

n

(

s

k

C

,

s

t

a

t

e

j

B

)

sigma_{j}^B=Sign(sk_C,state^B_j)

σjB=Sign(skC,statejB)

  1. 发送两个签名给B,公开交易到公开交易日志里,会同时发布从B收到的所有信息以及自己对新账户的签名。

  2. Payment Acceptance

接收方B
检查签名是否有效,有效则存下签名,转发A的签名给A。

  1. Payment Completion

发送方A
检查签名是否有效,有效则存下签名,至此交易完成。

提升方案

看完前面的方案可能会有点懵,监管者呢,提都没提?WTF?好像很多功能都还没有,怎么中止交易,怎么披露信息,怎么标识用户,怎么执行的监管等等好像啥都没说😇。
原文的描述比较模糊,没有将相关信息放入基础方案里面,只给了单独一章用于表述该角色的额外功能,而且一些函数只给了一个粗浅的定义,并没提具体实施(咱也不知道为啥,可能是想表现可扩展性高?这就是不给源码的原因吗?)

新增角色

监管者
定义为能执行一些监管规则。

  • 持有发行证书密钥对

    (

    s

    k

    R

    C

    ,

    p

    k

    R

    C

    )

    (sk_{RC},pk_{RC})

    (skRC,pkRC),加密密钥对

    (

    s

    k

    R

    E

    ,

    p

    k

    R

    E

    )

    (sk_{RE},pk_{RE})

    (skRE,pkRE)

新增步骤

用户注册
增加向监管者注册的步骤,明确身份。

  1. 用私钥计算出公钥作为自己的唯一标识符,标识为

    p

    i

    U

    ,

    s

    i

    U

    (pi_U,si_U)

    piU,siU

  2. 向监管者注册,并证明自己知道对应的私钥,然后收到监管者签名

    σ

    R

    U

    =

    s

    i

    g

    n

    (

    s

    k

    R

    C

    ,

    (

    p

    i

    U

    ,

    p

    a

    r

    a

    m

    s

    )

    )

    sigma^U_R=sign(sk_{RC},(pi_U,params))

    σRU=sign(skRC,(piU,params))

    p

    a

    r

    a

    m

    s

    params

    params可以是一些单独不同的规则所需要的参数,如每个用户的不同的持币限制。

  3. 签名以及公共身份会包含在账户承诺中,所以需要证明新旧账户承诺中的身份是一样的。

交易监管

  1. 添加辅助信息说明:在账户状态承诺里新增了辅助信息,用于用户对交易信息的一些说明,同样需要证明,那么新的完全体账户状态承诺就变为

s

t

a

t

e

i

A

=

(

s

e

r

i

a

l

i

A

,

b

a

l

i

A

,

b

l

i

n

d

i

A

,

p

i

U

,

a

u

x

i

U

)

state^A_i=(serial^A_i,bal^A_i,blind^A_i,pi_U,aux_i^U)

stateiA=(serialiA,baliA,blindiA,piU,auxiU)

a

u

x

i

U

aux_i^U

auxiU为辅助信息(可以理解为一些额外的监管规则)
辅助信息在每一笔交易也许会不一样,故需要进行更新,更新函数为updateAux。

  1. 特定条件下的信息披露:新增一个披露函数RegInfo,输入为用户的状态信息,输出为密文信息或者披露信息(特定条件下),如用户身份,余额等信息。当然,要使得披露信息对外不可区分,需要加密,采用监管者公钥加密

    p

    k

    R

    E

    pk_{RE}

    pkRE,计算密文

    E

    i

    +

    1

    U

    E^U_{i+1}

    Ei+1U的过程的正确性需要进行证明,密文将作为交易的一部分发送给央行,央行会转发给监管者,监管者可以解密查看。

  2. 额外检查:新增额外检查函数checkOther。

交易零知识证明
增加了这么多信息,那么交易所需要的零知识证明自然需要增加。
以下是完整的需要证明的式子
image.png
红色部分为新增的,即

  1. 拥有合法的身份,即拥有对应身份的私钥
  2. 监管者的签名是有效的。
  3. 额外辅助信息更新正确
  4. 证明自己的计算披露函数和加密过程正确
  5. 额外校验校验也正确

小结

  • 没有交易中止功能,出现密钥丢失,被骗等很难追回。
  • 交易追溯是通过公开日志查询的。
  • 没有提多个监管者的方案。
  • 没有异步交易,离线交易功能。

参考

Wüst, Karl, et al. “Platypus: A central bank digital currency with unlinkable transactions and privacy-preserving regulation.” Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security. 2022.

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>