PEReDi 完全隐私的央行数字货币方案

news2024/9/22 13:35:19

第一个对完全隐私保护建模的方案,基于账户模型,要求交易双方都在线

角色分类

中央银行 B B B:负责发行数字货币和货币政策,但不控制用户账户的状态,没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相关的转移价值,并且不负责执行支付的监管规则。
维护者 M J M_J MJ:如商业银行和金融机构。负责验证交易和进行监管合规的各种审计操作,它们之间共享系统状态,且负责在用户发布交易时不断更新系统状态。所有的维护者的集合时公开的,只要敌手控制的维护者少于一定阈值,该系统就满足安全性。每个维护者都持有自己的账本(存有注册信息和交易信息)。
本方案中

  • 所有维护者的数量为 ∣ M ∣ = D |\mathbb{M}| = D M=D,设定了两个需要一定数量的维护者参与的门限阈值 α \alpha α(用于交易验证)和 β \beta β(用于执行审计协议)。
  • 拥有两对ElGamal门限加密密钥对 ( p k 1 , j , s k 1 , j ) (pk_{1,j},sk_{1,j}) (pk1,j,sk1,j) ( p k 1 , j , s k 1 , j ) (pk_{1,j},sk_{1,j}) (pk1,j,sk1,j)

用户 U U U:作为交易的发送方或接收方。
本方案中

  • 拥有一对公私钥 ( p k U , s k U ) (pk_U,sk_U) (pkU,skU)
  • 用于生成每笔交易tag= T T T的私钥 a a a

交易过程

下图是用户在一笔交易中的状态变化过程
image.png

  • Idle:惰态,用户交易之前的初始状态,发起交易的时候会发送交易信息 TI(包含用户的新盲签名账户)给所有维护者。发送交易之后,用户的状态将会更新为 Receiving/Sending
  • Receiving/Sending:处于该状态的时候,会自动忽略掉环境命令(生成新发送交易/接收交易,接收发行货币等等),也就是必须等上一笔交易完成,才能进行下一笔。当从此状态返回为 **Idle **状态时,代表一笔交易结束。结束有两种情况
    • Successful:即,交易成功,交易双方使用了满足规范的新账户,并且维护者们也收到了双方有效的交易信息(TI)。用户收到至少门限个维护人员的盲签名后,解盲并在新账户上聚合出新的签名,最后更改自己的状态,至此就可以开启下一笔交易。
    • Pending:也就是交易双方没有收到足够数量的盲签名,在收到 AR 中止请求(包含)的时候一直处于 Receiving/Sending 状态。用户在收到环境命令-中止交易 AR(包含用户重新刷新盲签名的账户)后,用户向维护者发送 AR。此时用户的状态切换为 Aborting
      • if 至少门限个维护者收到交易双方的 TI 对并存到了各自的账本里,此时维护者就会忽略掉重新刷新的账户,并且给用户发送他们自己的签名(为了用户的新账户),然后用户用这些盲签名,解盲,在新的账户聚合出签名。最后账户切换为 Idle
      • else 维护者们对重随机的账户签名,并标记交易为中止,忽略掉新账户。用户用盲签名,解盲,在重随机账户上聚合出签名,最后账户切换为 Idle

协议流程

初始化

主要是需要确保中央银行、维护人员都完成初始化,即激活在线。参与者们各自为每个方案的密码机制生成公私钥对。公钥会被保存在公钥目录中,该目录在需要的时候可以被获取到。用户会持有公私钥对以及一把私钥 a a a(用于标签生成)。
维护者的数量为 D D D,两个门限阈值 α \alpha α(用于交易验证)和 β \beta β(用于执行审计协议)

用户注册

即用户通过与维护者交互得到一个含有维护者签名的初始账户,便于进行第一次交易。
image.png

  1. 初始化:用户初始化自己的状态为 **Idle,**接着初始化注册协议,调用门限盲签名算法TBS获取带有盲签名的账户 a c c B acc^{\mathfrak{B}} accB(账户的内容大致有 a c c = ( B , S , R , s k U , a x , a ) acc = (B,S,R,sk_U,a^x,a) acc=(B,S,R,skU,ax,a) B , S , R , x B,S,R,x B,S,R,x,分别代表余额,发送总值,接收总值和交易计数器,它们初始的时候都会被置为0),计算注册信息, R I j = ( a c c B ˉ , a j , r j , c o m M , p k U , π ) \mathsf{RI}_j=(\mathsf{acc}^{\bar{\mathfrak{B}}},a_j,r_j,\mathsf{com}_{\mathbb{M}},\mathsf{pk}_{\mathbf{U}},\pi) RIj=(accBˉ,aj,rj,comM,pkU,π)
    1. a a a进行秘密分享得到 { a j } j = 1 \{a_j\}_{j=1} {aj}j=1并得到 a a a的承诺 c o m j ~ = g a j ⋅ h r j \tilde{\mathsf{com}_j}=g^{a_j}\cdot h^{r_j} comj~=gajhrj c o m M = { c o m j ~ } j = 1 D com_{\mathbb{M}} = \{\tilde{\mathsf{com}_j}\}^D_{j=1} comM={comj~}j=1D
    2. 证明:接着用户需要调用非交互式零知识证明生成 Proof π \pi π,证明自己确实诚实的按照正确的方式生成了账户,即
      1. 私钥 s k U sk_U skU与用户公钥 p k U pk_U pkU相关联。
      2. 账户中的使用的 a a a就是前面秘密分享出来的 a a a,且可以通过打开承诺 c o m M com_{\mathbb{M}} comM进行还原。
      3. 初始化账户各项值为0。
      4. 用户知道生成账户 a c c B acc^{\mathfrak{B}} accB和承诺 c o m M com_{\mathbb{M}} comM的两个随机数。
      5. 还需要证明 x x x从1开始,且每一次交易递增1。
  2. 发送注册信息:用户广播自己的 c o m M com_{\mathbb{M}} comM,然后通过P2P安全通道向维护者们分别发送注册信息

每个维护人员 M j M_j Mj

  1. 注册验证:此时每一个维护人员将会分别从广播信道和P2P通道收到的消息里,找到同一个用户 U U U,对其进行验证,如果满足
    1. 账户已存在
    2. 公钥不匹配
    3. 零知识证明不通过
    4. 承诺不通过
    5. 未通过KYC(Know your customer)的验证

则忽略掉注册请求,否则就为其生成一条用户记录 U R = ( a j , r j , c o m M , U ) UR=(a_j,r_j,com{\mathbb{M},U}) UR=(aj,rj,comM,U)存在自己的账本里,接着为该账户生成盲签名 σ j B \sigma^{\mathfrak{B}}_j σjB然后,P2P发送给用户。

  1. 账户绑定:用户收到所有的盲签名后,进行解盲然后聚合为新的签名 σ B \sigma^{\mathfrak{B}} σB和自己的账户绑定。

再收到用户已接受的信息后,央行也会将交易信息 T l B = ψ \mathsf{Tl}_B = \psi TlB=ψ发送给维护者

货币发行

即央行给用户发行资金。
image.png
用户

  1. 用户向央行提出申请,央行会通过安全匿名信道发送 v v v价值的金额,如果此时用户在Idle状态,则会通过安全匿名通道向央行发送一个新随机数 ρ \rho ρ,该随机数与阈值ElGamal加密生成的 ψ \psi ψ有关。
  2. 用户收到继续的指令之后,将交易信息 T l U = { ψ , a c c n e w , B , σ M R n d , T , v , π } \mathsf{Tl}_U=\{\psi,acc^{new,\mathfrak{B}},\sigma^{Rnd}_{\mathbb{M}},T,v,\pi\} TlU={ψ,accnew,B,σMRnd,T,v,π}发送给维护者,交易信息计算过程大致如下
    1. 对用户公钥和交易价值进行加密:使用随机数 ρ \rho ρ、公钥 p k U pk_U pkU g v g^v gv计算出加密公钥和交易简直密文的 ψ = ( ψ 1 , ψ 2 , ψ 3 ) = ( g ρ , p k 1 , M ρ ⋅ p k U , p k 2 , M ρ ⋅ g v ) \psi=(\psi_1,\psi_2,\psi_3)=(g^\rho,\mathsf{pk}_{1,M}^\rho\cdot\mathsf{pk}_{\mathsf{U}},\mathsf{pk}_{2,M}^\rho\cdot g^v) ψ=(ψ1,ψ2,ψ3)=(gρ,pk1,MρpkU,pk2,Mρgv)
    2. 更新账户和签名:计算出新账户 a c c n e w , B acc^{new,\mathfrak{B}} accnew,B,账户的更新算法为

a c c n e w = ( B n e w , S n e w , R n e w , s k U , a x + 1 , a ) = ( B o l d + v , S o l d , R o l d + v , s k U , a x ⋅ a , a ) acc^{new}={(B^{new},S^{new},R^{new},sk_U,a^{x+1},a)} = (B^{old}+v,S^{old},R^{old}+v,sk_U,a^x \cdot a ,a) accnew=(Bnew,Snew,Rnew,skU,ax+1,a)=(Bold+v,Sold,Rold+v,skU,axa,a)
,然后计算新的签名 σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd(这个和注册协议里的获取方式一样,通过TBS门限盲签名计算)。

  1. 更新交易标签:计算交易标签 T = g a x + 1 T=g^{a^{x+1}} T=gax+1,该标签每次交易都会递增,可以迫使用户每次都是用最新的账户。
  2. 零知识证明:最后再次进行零知识证明,证明自己是诚实的进行协议的,即。
    1. 新账户中的私钥与用在 ψ \psi ψ中的公钥是对应的。
    2. T T T的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
    3. σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd σ M \sigma_{\mathbb{M}} σM的重随机化且 σ M \sigma_{\mathbb{M}} σM是聚合了 α \alpha α个不同的有效维护者的在原账户上的签名的签名。
    4. 新账户是在旧帐户和在 ψ \psi ψ中的 v v v的基础上更新的。
    5. 用户知道随机数 r r e g r_{reg} rreg,该随机数用于生成新账户、新签名和门限签名。
  3. 使用安全发送给交易信息给维护者,收到上一个维护者的确认信息再发给下一个。

央行 B B B

  1. 在确认用户已收到交易后,央行也会发送交易信息 T l B = ψ \mathsf{Tl}_B = \psi TlB=ψ给维护者,收到上一个维护者的确认信息再发给下一个。

每个维护人员 M j M_j Mj

  1. 交易验证:接收用户交易信息解析验证,若交易标识符已经存在于交易账本里(包含发行、支付交易、交易终止),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
  2. 账本交易双方记录:先记录该交易到账本里,等收到同样经过验证的央行交易信息 T l B \mathsf{Tl}_B TlB时(对比消息中的签名 ψ = ψ ′ \psi = \psi' ψ=ψ),将交易双方拼为交易对 ( T l B , T l U ) (\mathsf{Tl}_B,\mathsf{Tl}_U) (TlB,TlU)然后存在账本里。
  3. 账本交易id:在账本中存下交易标识 t i d = ( ψ , T ) t_{id} = (\psi,T) tid=(ψ,T),生成新的盲签名 σ j n e w , B \sigma_j^{new,\mathfrak{B}} σjnew,B然后发送给用户

用户:

  1. 在收到盲签名后,进行解盲然后聚合出新的盲签名 σ M n e w \sigma_{\mathbb{M}}^{new} σMnew

支付

即正常的交易。
image.png

支付用户 U s U_s Us

  1. 如果处于 Idle,则将初始化支付协议,通过完全匿名信道向接收用户 U r U_r Ur发送交易价值 v v v和与阈值签名 ψ s \psi_s ψs生成有关的随机数 ρ s \rho_s ρs这个签名生成和前面 ψ \psi ψ类似,都是对用户公钥 p k s pk_s pks和交易价值 v v v的加密。

接收用户 U r U_r Ur

  1. 收到后,通过完全匿名信道返回类似的随机数 ρ r \rho_r ρr(与 ψ r \psi_r ψr)有关。,该签名则是用户公钥 p k r pk_r pkr的加密

接收用户和支付用户

  1. U s U_s Us U r U_r Ur计算交易信息 T l s \mathsf{Tl}_s Tls T l r \mathsf{Tl}_r Tlr。其中 T l s = ( ψ s , ψ r , σ s ‾ ( ψ r ) , a c c s n e w , B , σ s , M R n d , T s ) \mathsf{Tl}_s=(\psi_s,\psi_r,\overline{\sigma_s}(\psi_r),\mathsf{acc}_s^{\mathsf{new},\mathfrak{B}},\sigma_{s,\mathbb{M}}^{\mathsf{Rnd}},\mathsf{T}_s) Tls=(ψs,ψr,σs(ψr),accsnew,B,σs,MRnd,Ts),计算过程如下
    1. 计算门限加密,加密公钥和交易价值 ψ s = ( ψ s , 1 , ψ s , 2 , ψ s , 3 ) = ( g ρ s , p k 1 , M ρ s ⋅ p k s , p k 2 , M ρ s ⋅ g v ) \psi_s=(\psi_{s,1},\psi_{s,2},\psi_{s,3})=(g^{\rho_s},\mathsf{pk}_{1,\mathbb{M}}^{\rho_s}\cdot\mathsf{pk}_{s},\mathsf{pk}_{2,\mathbb{M}}^{\rho_s}\cdot g^v) ψs=(ψs,1,ψs,2,ψs,3)=(gρs,pk1,Mρspks,pk2,Mρsgv) ψ r = ( ψ r , 1 , ψ r , 2 ) = ( g ρ r , p k 1 , M ρ r ⋅ p k r ) \psi_r=(\psi_{r,1},\psi_{r,2})=(g^{\rho_r},\mathsf{pk}_{1,\mathbb{M}}^{\rho_r}\cdot\mathsf{pk}_r) ψr=(ψr,1,ψr,2)=(gρr,pk1,Mρrpkr) σ s ‾ ( ψ r ) \overline{\sigma_s}(\psi_r) σs(ψr)是对 ψ r \psi_r ψr的知识签名。
    2. 更新账户和签名:方法和货币发行类似 a c c s n e w = ( B s n e w , S s n e w , R s n e w , s k s , a s x s + 1 , a s ) = ( B s o l d + v , S s o l d , R s o l d + v , s k s , a s x ⋅ a s , a s ) acc^{new}_s={(B^{new}_s,S^{new}_s,R^{new}_s,sk_s,a_s^{x_s+1},a_s)} = (B^{old}_s+v,S^{old}_s,R^{old}_s+v,sk_s,a^x_s \cdot a_s ,a_s) accsnew=(Bsnew,Ssnew,Rsnew,sks,asxs+1,as)=(Bsold+v,Ssold,Rsold+v,sks,asxas,as)
    3. 更新交易标签:计算交易标签 T s = g a x + 1 T_s=g^{a^{x+1}} Ts=gax+1,该标签每次交易都会递增,可以迫使用户每次都是用最新的账户。
    4. 零知识证明:证明自己诚实进行协议,即
      1. 新账户中的私钥与用在 ψ s \psi_s ψs中的公钥是对应的。
      2. T s T_s Ts的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
      3. σ s , M R n d \sigma^{Rnd}_{s,\mathbb{M}} σs,MRnd σ s , M \sigma_{s,\mathbb{M}} σs,M的重随机化且 σ s , M \sigma_{s,\mathbb{M}} σs,M是聚合了 α \alpha α个不同的有效维护者的在原账户上的签名的签名。
      4. 新账户是在旧帐户和在 ψ s \psi_s ψs中的 v v v的基础上更新的。
      5. 用户知道随机数 r s r_s rs,该随机数用于生成新账户、新签名和门限签名。

T I r = ( ψ s , ψ r , σ r ‾ ( ψ s ) , a c c r n e w , B , σ r , M R n d , T r ) \mathsf{TI}_r=(\psi_s,\psi_r,\overline{\sigma_r}(\psi_s),\mathsf{acc}_r^{\mathsf{new},\mathfrak{B}},\sigma_{r,\mathbb{M}}^{\mathsf{Rnd}},\mathsf{T}_r) TIr=(ψs,ψr,σr(ψs),accrnew,B,σr,MRnd,Tr)的计算过程类似。

  1. 双方将交易信息发送给每一个维护人员,收到上一个维护者的确认信息再发给下一个。

每个维护人员 M j M_j Mj

  1. 交易验证:接收用户交易信息解析验证,若交易标识符已经存在于交易账本里(包含发行、支付交易、交易终止),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
  2. 账本交易双方记录:先记录该交易到账本里,等收到同样经过验证的另一方交易信息后时(对比消息中的签名 ( ψ s , ψ r ) = ( ψ s ′ , ψ r ′ ) (\psi_s,\psi_r) = (\psi_s',\psi_r') (ψs,ψr)=(ψs,ψr)),将交易双方拼为交易对 ( T l s , T l r ) (\mathsf{Tl}_s,\mathsf{Tl}_r) (Tls,Tlr)然后存在账本里。
  3. 账本交易id:在账本中存下交易标识 t i d = ( ψ , T ) t_{id} = (\psi,T) tid=(ψ,T),为双方生成新的盲签名 σ s , j n e w , B , σ r , j n e w , B \sigma_{s,j}^{new,\mathfrak{B}},\sigma_{r,j}^{new,\mathfrak{B}} σs,jnew,B,σr,jnew,B然后发送给对应用户。

接收用户和支付用户

  1. 收到消息后解盲然后聚合签名。

交易中止

特殊情况,即维护者收到了一方的交易信息并通过验证,但未收到交易另一方的有效交易信息,不能满足交易对,也就表示用户无法为自己新账户的生成收到足够数量的盲签名。此时
支付用户

  1. 发送交易中止信息 A R   =   ( a c c r , B , σ M R n d , T , π ) \mathrm{AR~=~(acc^{r,\mathfrak{B}},\sigma_{M}^{Rnd},T,\pi)} AR = (accr,B,σMRnd,T,π)给维护者,其中
  • 更新账户为 a c c r = ( B r , S r , R r , s k U , a x + 1 , a ) = ( B o l d , S o l d , R o l d , s k U , a x ⋅ a , a ) acc^r={(B^r,S^r,R^r,sk_U,a^{x+1},a)} = (B^{old},S^{old},R^{old},sk_U,a^x \cdot a ,a) accr=(Br,Sr,Rr,skU,ax+1,a)=(Bold,Sold,Rold,skU,axa,a) a c c r , B acc^{r,\mathfrak{B}} accr,B代表盲化版本。
  • T = g a x + 1 T = g^{a^{x+1}} T=gax+1为最近使用的交易tag
  • π \pi π为相应的零知识证明

交易信息的计算过程如下

  1. 计算 a c c r , B , σ M R n d acc^{r,\mathfrak{B}},\sigma_{M}^{Rnd} accr,B,σMRnd
  2. 执行零知识证明,即
    1. T T T的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
    2. σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd σ M \sigma_{\mathbb{M}} σM的重随机化且 σ s , M \sigma_{s,\mathbb{M}} σs,M是聚合了 α \alpha α个不同的有效维护者的在原账户上的签名的签名。
    3. 新账户是在旧帐户的基础上更新的,也就是金额回到交易之前的状态。
    4. 用户知道随机数 r a b r r_{abr} rabr,该随机数用于生成新账户、新签名和门限签名。
  3. 发送交易中止信息 A R   =   ( a c c r , B , σ M R n d , T , π ) \mathrm{AR~=~(acc^{r,\mathfrak{B}},\sigma_{M}^{Rnd},T,\pi)} AR = (accr,B,σMRnd,T,π)给每一个维护人员,收到上一个维护者的确认信息再发给下一个。

每个维护人员 M j M_j Mj

  1. 交易验证:解析消息,若交易标识符已经被中止(账本里存在一条中止记录),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
  2. 拜占庭投票:若自己的账本里存在当前交易的标签 T T T(发行或者支付交易),则向拜占庭协议里输入1,否则输入0。
  3. 若拜占庭结果为1,代表至少有一个诚实的维护人员存下了此前的交易,则
    1. 存下了交易的诚实维护人员将该交易对 ( T l s , T l r ) (\mathsf{Tl}_s,\mathsf{Tl}_r) (Tls,Tlr)通过认证信道发送给其他的维护人员。
    2. 收到的信息的维护人员对该交易对进行验证,无效则忽略,有效则对该交易对 a c c s n e w , B , a c c r n e w , B \mathsf{acc}_s^{\mathsf{new},\mathfrak{B}},\mathsf{acc}_r^{\mathsf{new},\mathfrak{B}} accsnew,Baccrnew,B进行签名 σ s , j n e w , B , σ r , j n e w , B \sigma_{s,j}^{new,\mathfrak{B}},\sigma_{r,j}^{new,\mathfrak{B}} σs,jnew,B,σr,jnew,B
    3. 如果没有存下相关交易对和交易标签,则存下,然后将对应签名发送给对应交易双方。

接收用户和支付用户收到消息后解盲然后聚合签名,交易完成,同时代表中止交易失败。

  1. 若拜占庭结果为0,代表大部分维护者的账本是没有该交易标签的。
    1. 已经存有交易对的维护者,从自己的账本里删除掉该交易对信息。
    2. 存储下新的交易中止信息的标签 t i d = ( A b o r t e d , T ) t_{id} = (Aborted,T) tid=(Aborted,T)
    3. 对重新刷新的账户进行签名 σ j r , B \sigma_{j}^{r,\mathfrak{B}} σjr,B,然后发送给用户。

接收用户收到消息后解盲然后聚合签名,交易完成,中止交易成功。

审计

隐私撤销

提交完全匿名的交易对, 审计委员会撤销其隐私并返回交易的元数据,即双方用户以及交易价值。

image.png
收到撤销特定交易tag的指令之后,
每个维护人员

  1. 从账本里查找到与该tag t i d t_{id} tid相关的加密交易对 ( ψ s , ψ r ) (\psi_s,\psi_r) (ψs,ψr),并对其解密得到 ( ψ s , 1 s k 1 , j , ψ s , 1 s k 2 , j , ψ r , 1 s k 1 , j ) (\psi_{s,1}^{sk_1,j},\psi_{s,1}^{sk_2,j},\psi_{r,1}^{sk_1,j}) (ψs,1sk1,j,ψs,1sk2,j,ψr,1sk1,j),接着调用零知识证明协议,证明解密正确。
  2. 通过认证信道接收来自其他维护人员的信息(需要达到门限阈值的数量)和相应拉格朗日系数,调用恢复函数恢复出交易信息里的双方用户公钥 ( p k s , p k r ) (pk_s,pk_r) (pks,pkr)以及交易值 g v g^v gv。同样需要调用零知识证明协议证明解密正确。
  3. 调用密钥检索函数,通过公钥寻找到对应用户,并通过 g v g^v gv计算出 v v v
追踪溯源

提交用户的标识符,审计委员会追溯出该用户的所有交易。
image.png
通过用户标识符,从注册协议中查到用户的交易计数器 a a a的秘密分享,
维护者相互计算交易标签,直到该标签不存在于账本上,由此找到用户最近的交易。
收到追溯的指令之后,
每个维护人员

  1. 从账本找到用户注册记录,使用零知识证明,证明里面的 a j a_j aj是之前得到的那个,可以通过注册协议广播的 c o m j ~ \tilde{\mathsf{com}_j} comj~得证,即证明 c o m j ~ ∈ c o m M \tilde{\mathsf{com}_j} \in com_{\mathbb{M}} comj~comM
  2. 通过认证信道接收其他维护人员的信息 x ‾ j = ( соm ~ j , g ˙ a j , g ˙ ) \overline{\mathrm{x}}_j=(\tilde{\text{соm}}_j,\dot{g}^{a_j},\dot{g}) xj=(соm~j,g˙aj,g˙)以及对应的零知识证明proof(需要达到门限阈值的数量)和相应拉格朗日系数,其中 g ˙ = g a e , e ← 0 \dot{g}=g^{a^e},e\leftarrow 0 g˙=gaee0,证proof并计算出 g ˙ a \dot{g}^{a} g˙a
  3. 接着从自己账本里寻找包含此交易tag= g ˙ a \dot{g}^{a} g˙a的交易,若存在,则将交易标签往前提一个 e ← e + 1 e\leftarrow e+1 ee+1,并存该交易相关 t i d t_{id} tid和相应参与双方信息。若不存在,则向其他所有参与者发送消息说明自己这里没有包含此交易tag= g ˙ a \dot{g}^{a} g˙a的交易。
  4. 若收到达到门限阈值数量个不包含交易tag的消息,则可以输出目前位置记录的所有交易信息( t i d t_{id} tid,相应参与双方信息)。

小结

  • 交易中止这块是特殊情况,不是很理想。账户丢失被盗这类问题没有解决。
  • 离线情景没有考虑

参考

Kiayias, Aggelos, Markulf Kohlweiss, and Amirreza Sarencheh. “Peredi: Privacy-enhanced, regulated and distributed central bank digital currencies.” Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security. 2022.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++航海王:追寻罗杰的编程之路】queue

目录 1 -> queue的介绍和使用 1.1 -> queue的介绍 1.2 -> queue的使用 1.3 -> queue的模拟实现 1 -> queue的介绍和使用 1.1 -> queue的介绍 queue的文档介绍 1. 队列是一种容器适配器,专门用于在FIFO(先进先出)上下文中操作,其…

【C++】隐藏的this指针

文章目录 1.this指针的引出2.this指针的特性 1.this指针的引出 我们通过日期类来学习this指针&#xff0c;首先我们先定义一个日期类。 class Date { public:void Display(){cout << _year << "-" << _month << "-" << _d…

关于《海岛奇兵》中n点能量可造成最大伤害的计算

最近在玩海岛奇兵, 里面有 武器A, 第n次使用消耗(10 6 * (n - 1))点能量并造成18315伤害; 武器B, 第n次使用消耗 (3 2 * (n - 1))点能量并造成8124伤害, 就想着能不能写一个程序计算一下, 当有x点能量时, 可造成的最大伤害是多少? 分别使用AB武器各多少次? 讨论: https://…

一文读懂!进销存系统如何及时分析产品采购价格?库存检验?以及财务对账?

进销存管理系统如何及时分析产品采购价格&#xff1f;库存检验如何在进销存管理系统中进行&#xff1f;财务对账在进销存管理系统中如何实现&#xff1f;本文将为你一一解答&#xff0c;深入了解进销存管理系统的场景功能。 立即收藏&#xff0c;获取更多实用干货&#xff01;…

【好书推荐3】Python网络爬虫入门到实战

【好书推荐3】Python网络爬虫入门到实战 写在最前面内容简介作者简介目录前言/序言 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff…

中御海参已确定参加2024第七届燕窝天然滋补品博览会

参展企业介绍 烟台中御海参有限公司成立于2018年09月19日&#xff0c;公司坐落在山东省&#xff0c;详细地址为&#xff1a;山东省烟台市蓬莱区大辛店镇三甲村36号;经国家企业信用信息公示系统查询得知&#xff0c;烟台中御海参有限公司企业的经营范围为&#xff1a;食品生产&a…

抖音小店赚钱吗?入驻抖店需要多少钱?一篇告诉你值不值得去做!

哈喽~我是电商月月 抖音是现在流量最大的软件&#xff0c;抖音赚钱的方式有很多&#xff0c;和直播&#xff0c;拍视频等形式来比&#xff0c;抖音小店绝对是最值得被新手小白关注的项目&#xff01; 商家和达人博主是互利共赢的关系 商家想靠达人卖货拿利润&#xff0c;主播…

3.Python数据分析—数据分析入门知识图谱索引(知识体系中篇)

3.Python数据分析—数据分析入门知识图谱&索引-知识体系中篇 一个人简介二数据获取和处理2.1 数据来源&#xff1a;2.2 数据清洗&#xff1a;2.2.1 缺失值处理&#xff1a;2.2.2 异常值处理&#xff1a; 2.3 数据转换&#xff1a;2.3.1 数据类型转换&#xff1a;2.3.2 数据…

解决“ModuleNotFoundError: No module named ‘transformers’”错误的全面指南

一、问题背景与原因 在Python编程中&#xff0c;ModuleNotFoundError是一个常见的错误&#xff0c;表明解释器无法在指定的路径或Python环境中找到所需的模块。特别是当我们尝试导入像transformers这样的第三方库时&#xff0c;如果库没有被正确安装&#xff0c;就会遇到这样的…

【机器学习】无监督学习算法之:K均值聚类

K均值聚类 1、引言2、K均值聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.4.1 距离计算公式2.4.1 中心点计算公式 2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; K均值聚类 我不懂&#xff0c;能不能给我讲一讲&#xff1f; 小鱼&#xff1a;行&#xf…

python关于字符串基础学习

字符串 python字符串是不可改变的 Python不支持单字符类型&#xff0c;单字符也是作为一个字符串使用的。 字符串编码 python3直接支持Unicode,可以表示世界上任何书面语言的字符 python3的字符默认就是16位Unicode编码&#xff0c;ASCII是Unicode的子集 使用内置函数 ord()…

艺术统计图表绘制方法(六叶形图)

艺术统计图表绘制方法&#xff08;六叶形图&#xff09; 在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表&#xff0c;现时企业的PPT展示的图表应用不再满足于Excle&#xff0c;Word等的图表绘…

人工智能聊天机器人与大型语言模型 (LLM):哪个适合您的业务?

简介&#xff1a;欢迎来到未来 您可能听说过人工智能聊天机器人和大型语言模型 (LLM)&#xff0c;对吧&#xff1f; 这些技术奇迹正在重塑企业的沟通和运营方式。 但是&#xff0c;这是一个价值百万美元的问题&#xff1a;哪一个适合您的业务&#xff1f; 让我们深入了解一下&…

shopee全托管服务是什么?Shopee全托管服务有什么特点及优势

2023年各大电商平台都大力推广自家的全托管业务&#xff0c;Shopee也在2023年7月份正式发布全托管业务&#xff0c;2024年&#xff0c;Shopee重点发力全托管业务&#xff0c;对入驻卖家将投入更大的扶持资源。但还有很多小伙伴并不了解什么是shopee全托管服务&#xff0c;所以今…

【数据结构与算法】java有向带权图最短路径算法-Dijkstra算法(通俗易懂)

目录 一、什么是Dijkstra算法二、算法基本步骤三、java代码四、拓展&#xff08;无向图的Dijkstra算法&#xff09; 一、什么是Dijkstra算法 Dijkstra算法的核心思想是通过逐步逼近的方式&#xff0c;找出从起点到图中其他所有节点的最短路径。算法的基本步骤如下&#xff1a;…

Simple negative sampling for link prediction inknowledge graphs

摘要 知识图嵌入方法学习知识图中实体和关系的低维向量表示&#xff0c;便于知识图中的链接预测任务。在学习嵌入过程中&#xff0c;采样负三元组是很重要的&#xff0c;因为KGs只观察到正三元组。据我们所知&#xff0c;均匀随机、基于生成对抗网络(GAN)和nscach、结构感知负…

PTA由斜杠划分区域

在由 1 x 1 方格组成的 N x N 网格 grid 中&#xff0c;每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。 返回区域的数目。 输入格式: 第一行输入一个正整数N&#xff08;N<30&#xff09; 随后N行&#xff0c;每行输入一个长度为N的字符串…

基于单片机的太阳能充电系统设计

摘要:本文所设计的太阳能充电系统主要由以下几个模块组成:STC89C52 主控模块、TP4056 充电电路、电压AD 采集模块、LCD1602 液晶显示模块和太阳能充电电池等组成。此太阳能充电器制作简单,性价比高,性能稳定。 关键词:LCD1602;太阳能充电系统;ADC0832 太阳能充电系统的充…

DARTS-: ROBUSTLY STEPPING OUT OF PERFORMANCE COLLAPSE WITHOUT INDICATORS

DARTS-&#xff1a;增加辅助跳跃连接&#xff0c;鲁棒走出搜索性能崩溃 论文链接&#xff1a;https://arxiv.org/abs/2009.01027 项目链接&#xff1a;GitHub - Meituan-AutoML/DARTS-: Code for “DARTS-: Robustly Stepping out of Performance Collapse Without Indicators…

分页多线程处理大批量数据

1.业务场景 因为需要从一个返利明细表中获取大量的数据&#xff0c;生成返利报告&#xff0c;耗时相对较久&#xff0c;作为后台任务执行。但是后台任务如果不用多线程处理&#xff0c;也会要很长时间才能处理完。 另外考虑到数据量大&#xff0c;不能一次查询所有数据在内存…