PEReDi 完全隐私的央行数字货币方案
第一个对完全隐私保护建模的方案,基于账户模型,要求交易双方都在线。
角色分类
中央银行 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
交易过程
下图是用户在一笔交易中的状态变化过程
- 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 β(用于执行审计协议)
用户注册
即用户通过与维护者交互得到一个含有维护者签名的初始账户,便于进行第一次交易。
- 初始化:用户初始化自己的状态为 **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,π)
- 对 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~=gaj⋅hrj, 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。
- 证明:接着用户需要调用非交互式零知识证明生成 Proof π \pi π,证明自己确实诚实的按照正确的方式生成了账户,即
- 私钥 s k U sk_U skU与用户公钥 p k U pk_U pkU相关联。
- 账户中的使用的 a a a就是前面秘密分享出来的 a a a,且可以通过打开承诺 c o m M com_{\mathbb{M}} comM进行还原。
- 初始化账户各项值为0。
- 用户知道生成账户 a c c B acc^{\mathfrak{B}} accB和承诺 c o m M com_{\mathbb{M}} comM的两个随机数。
- 还需要证明 x x x从1开始,且每一次交易递增1。
- 发送注册信息:用户广播自己的 c o m M com_{\mathbb{M}} comM,然后通过P2P安全通道向维护者们分别发送注册信息
每个维护人员 M j M_j Mj
- 注册验证:此时每一个维护人员将会分别从广播信道和P2P通道收到的消息里,找到同一个用户 U U U,对其进行验证,如果满足
- 账户已存在
- 公钥不匹配
- 零知识证明不通过
- 承诺不通过
- 未通过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发送给用户。
- 账户绑定:用户收到所有的盲签名后,进行解盲然后聚合为新的签名 σ B \sigma^{\mathfrak{B}} σB和自己的账户绑定。
再收到用户已接受的信息后,央行也会将交易信息 T l B = ψ \mathsf{Tl}_B = \psi TlB=ψ发送给维护者
货币发行
即央行给用户发行资金。
用户:
- 用户向央行提出申请,央行会通过安全匿名信道发送 v v v价值的金额,如果此时用户在Idle状态,则会通过安全匿名通道向央行发送一个新随机数 ρ \rho ρ,该随机数与阈值ElGamal加密生成的 ψ \psi ψ有关。
- 用户收到继续的指令之后,将交易信息 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,π}发送给维护者,交易信息计算过程大致如下
- 对用户公钥和交易价值进行加密:使用随机数 ρ \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)。
- 更新账户和签名:计算出新账户 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,ax⋅a,a)
,然后计算新的签名 σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd(这个和注册协议里的获取方式一样,通过TBS门限盲签名计算)。
- 更新交易标签:计算交易标签 T = g a x + 1 T=g^{a^{x+1}} T=gax+1,该标签每次交易都会递增,可以迫使用户每次都是用最新的账户。
- 零知识证明:最后再次进行零知识证明,证明自己是诚实的进行协议的,即。
- 新账户中的私钥与用在 ψ \psi ψ中的公钥是对应的。
- T T T的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
- σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd是 σ M \sigma_{\mathbb{M}} σM的重随机化且 σ M \sigma_{\mathbb{M}} σM是聚合了 α \alpha α个不同的有效维护者的在原账户上的签名的签名。
- 新账户是在旧帐户和在 ψ \psi ψ中的 v v v的基础上更新的。
- 用户知道随机数 r r e g r_{reg} rreg,该随机数用于生成新账户、新签名和门限签名。
- 使用安全发送给交易信息给维护者,收到上一个维护者的确认信息再发给下一个。
央行 B B B:
- 在确认用户已收到交易后,央行也会发送交易信息 T l B = ψ \mathsf{Tl}_B = \psi TlB=ψ给维护者,收到上一个维护者的确认信息再发给下一个。
每个维护人员 M j M_j Mj:
- 交易验证:接收用户交易信息解析验证,若交易标识符已经存在于交易账本里(包含发行、支付交易、交易终止),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
- 账本交易双方记录:先记录该交易到账本里,等收到同样经过验证的央行交易信息 T l B \mathsf{Tl}_B TlB时(对比消息中的签名 ψ = ψ ′ \psi = \psi' ψ=ψ′),将交易双方拼为交易对 ( T l B , T l U ) (\mathsf{Tl}_B,\mathsf{Tl}_U) (TlB,TlU)然后存在账本里。
- 账本交易id:在账本中存下交易标识 t i d = ( ψ , T ) t_{id} = (\psi,T) tid=(ψ,T),生成新的盲签名 σ j n e w , B \sigma_j^{new,\mathfrak{B}} σjnew,B然后发送给用户
用户:
- 在收到盲签名后,进行解盲然后聚合出新的盲签名 σ M n e w \sigma_{\mathbb{M}}^{new} σMnew。
支付
即正常的交易。
支付用户 U s U_s Us
- 如果处于 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
- 收到后,通过完全匿名信道返回类似的随机数 ρ r \rho_r ρr(与 ψ r \psi_r ψr)有关。,该签名则是用户公钥 p k r pk_r pkr的加密
接收用户和支付用户
- 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),计算过程如下
- 计算门限加密,加密公钥和交易价值 ψ 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ρs⋅pks,pk2,Mρs⋅gv)和 ψ 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ρr⋅pkr), σ s ‾ ( ψ r ) \overline{\sigma_s}(\psi_r) σs(ψr)是对 ψ r \psi_r ψr的知识签名。
- 更新账户和签名:方法和货币发行类似 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,asx⋅as,as)
- 更新交易标签:计算交易标签 T s = g a x + 1 T_s=g^{a^{x+1}} Ts=gax+1,该标签每次交易都会递增,可以迫使用户每次都是用最新的账户。
- 零知识证明:证明自己诚实进行协议,即
- 新账户中的私钥与用在 ψ s \psi_s ψs中的公钥是对应的。
- T s T_s Ts的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
- σ 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 α个不同的有效维护者的在原账户上的签名的签名。
- 新账户是在旧帐户和在 ψ s \psi_s ψs中的 v v v的基础上更新的。
- 用户知道随机数 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)的计算过程类似。
- 双方将交易信息发送给每一个维护人员,收到上一个维护者的确认信息再发给下一个。
每个维护人员 M j M_j Mj
- 交易验证:接收用户交易信息解析验证,若交易标识符已经存在于交易账本里(包含发行、支付交易、交易终止),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
- 账本交易双方记录:先记录该交易到账本里,等收到同样经过验证的另一方交易信息后时(对比消息中的签名 ( ψ 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)然后存在账本里。
- 账本交易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然后发送给对应用户。
接收用户和支付用户
- 收到消息后解盲然后聚合签名。
交易中止
特殊情况,即维护者收到了一方的交易信息并通过验证,但未收到交易另一方的有效交易信息,不能满足交易对,也就表示用户无法为自己新账户的生成收到足够数量的盲签名。此时
支付用户
- 发送交易中止信息 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,ax⋅a,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 π为相应的零知识证明
交易信息的计算过程如下
- 计算 a c c r , B , σ M R n d acc^{r,\mathfrak{B}},\sigma_{M}^{Rnd} accr,B,σMRnd
- 执行零知识证明,即
- T T T的生成也是正确的,它的指数是使用新账户的第5个参数生成的。
- σ M R n d \sigma^{Rnd}_{\mathbb{M}} σMRnd是 σ M \sigma_{\mathbb{M}} σM的重随机化且 σ s , M \sigma_{s,\mathbb{M}} σs,M是聚合了 α \alpha α个不同的有效维护者的在原账户上的签名的签名。
- 新账户是在旧帐户的基础上更新的,也就是金额回到交易之前的状态。
- 用户知道随机数 r a b r r_{abr} rabr,该随机数用于生成新账户、新签名和门限签名。
- 发送交易中止信息 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
- 交易验证:解析消息,若交易标识符已经被中止(账本里存在一条中止记录),或者零知识证明验证、签名验证不通过则忽略掉此交易信息。
- 拜占庭投票:若自己的账本里存在当前交易的标签 T T T(发行或者支付交易),则向拜占庭协议里输入1,否则输入0。
- 若拜占庭结果为1,代表至少有一个诚实的维护人员存下了此前的交易,则
- 存下了交易的诚实维护人员将该交易对 ( T l s , T l r ) (\mathsf{Tl}_s,\mathsf{Tl}_r) (Tls,Tlr)通过认证信道发送给其他的维护人员。
- 收到的信息的维护人员对该交易对进行验证,无效则忽略,有效则对该交易对 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,B,accrnew,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。
- 如果没有存下相关交易对和交易标签,则存下,然后将对应签名发送给对应交易双方。
接收用户和支付用户收到消息后解盲然后聚合签名,交易完成,同时代表中止交易失败。
- 若拜占庭结果为0,代表大部分维护者的账本是没有该交易标签的。
- 已经存有交易对的维护者,从自己的账本里删除掉该交易对信息。
- 存储下新的交易中止信息的标签 t i d = ( A b o r t e d , T ) t_{id} = (Aborted,T) tid=(Aborted,T)。
- 对重新刷新的账户进行签名 σ j r , B \sigma_{j}^{r,\mathfrak{B}} σjr,B,然后发送给用户。
接收用户收到消息后解盲然后聚合签名,交易完成,中止交易成功。
审计
隐私撤销
提交完全匿名的交易对, 审计委员会撤销其隐私并返回交易的元数据,即双方用户以及交易价值。
收到撤销特定交易tag的指令之后,
每个维护人员
- 从账本里查找到与该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),接着调用零知识证明协议,证明解密正确。
- 通过认证信道接收来自其他维护人员的信息(需要达到门限阈值的数量)和相应拉格朗日系数,调用恢复函数恢复出交易信息里的双方用户公钥 ( p k s , p k r ) (pk_s,pk_r) (pks,pkr)以及交易值 g v g^v gv。同样需要调用零知识证明协议证明解密正确。
- 调用密钥检索函数,通过公钥寻找到对应用户,并通过 g v g^v gv计算出 v v v。
追踪溯源
提交用户的标识符,审计委员会追溯出该用户的所有交易。
通过用户标识符,从注册协议中查到用户的交易计数器 a a a的秘密分享,
维护者相互计算交易标签,直到该标签不存在于账本上,由此找到用户最近的交易。
收到追溯的指令之后,
每个维护人员
- 从账本找到用户注册记录,使用零知识证明,证明里面的 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。
- 通过认证信道接收其他维护人员的信息 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˙=gae,e←0,证proof并计算出 g ˙ a \dot{g}^{a} g˙a
- 接着从自己账本里寻找包含此交易tag= g ˙ a \dot{g}^{a} g˙a的交易,若存在,则将交易标签往前提一个 e ← e + 1 e\leftarrow e+1 e←e+1,并存该交易相关 t i d t_{id} tid和相应参与双方信息。若不存在,则向其他所有参与者发送消息说明自己这里没有包含此交易tag= g ˙ a \dot{g}^{a} g˙a的交易。
- 若收到达到门限阈值数量个不包含交易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.
相关文章:

PEReDi 完全隐私的央行数字货币方案
第一个对完全隐私保护建模的方案,基于账户模型,要求交易双方都在线。 角色分类 中央银行 B B B:负责发行数字货币和货币政策,但不控制用户账户的状态,没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…...

yolov5+pyside6+登录+用户管理目标检测可视化源码
一、软件简介 这是基于yolov5目标检测实现的源码,提供了用户登录功能界面; 用户需要输入正确的用户名和密码才可以登录。如果是超级管理员,可以修改普通用户的信息,并且在检测界面的右上角显示【管理用户】按钮。 支持图片、视频、…...

电脑如何设置个性便签 电脑个性便签分享
每次坐在电脑前,我都仿佛置身于一片信息的海洋。工作、生活、学习,方方面面的事情都需要我用心去记录。在这样一个快节奏的时代,电脑无疑成了我最得力的助手。但记事的时候,我总希望有一个既方便又有个性的工具,能让我…...

备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验
备考ICA----Istio实验12—配置双向TLS Istio Ingress Gateway实验 本实验部分配置延续上个Istio实验11 1. 重新配置secret 重新配置secret使其带有ca证书可以验证客户端证书是否合法 先删除原有secret,再配置新的secret # 删除原tls类型的secret kubectl -n istio-system d…...

SpringBoot 统一后端返回格式、处理全局异常
文章目录 引言I 统一标准格式1.1 定义返回标准格式1.2 定义状态码1.3 返回数据模型1.4 枚举定义1.5 Json序列化处理1.6 获取枚举字典II 处理全局异常2.1 全局异常处理器2.2 自定义异常2.3 请求数据模型III 预备知识:注解3.1 JsonInclude3.2 JsonIgnoreProperties...

C++学习基础版(一)
目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 (1)cout输出流 (2)endl操纵符 (3)cin输入流 二、C表达式和控制语句 1、数据机构 特别:布尔类型bool 2、算数运…...

Rust 双向链表 LinkedList 和安全删除元素的方法
一、LinkedList 基本用法 在Rust中,LinkedList 是标准库中 std::collections 模块提供的一个双向链表实现。这个双向链表在每个节点中都保存了其前一个和后一个节点的引用,允许在链表的任一端进行有效的添加和移除操作。 以下是一个简单的示例…...

Android 开发中 Gradle 使用详解:构建、配置与优化技巧
文章目录 1. 基本概念2. 配置构建脚本2.1 项目级构建脚本2.2 模块级构建脚本 3. 自定义构建变体和应用 flavorDimensions4. 多模块项目4.1 创建模块4.2 配置模块依赖 5. 使用 Gradle 插件6. 使用 Gradle 命令 Gradle 是一种先进的构建工具,它被广泛应用于 Android 开…...

聚道云助力:易快报CDP无缝对接,登录同步一步到位!
一、客户介绍 某企业咨询有限公司是一家专注于为企业提供全方位、高质量咨询服务的领先机构。该公司致力于将先进的管理理念和实践经验与企业实际需求相结合,助力企业实现可持续发展。无论是战略规划、组织优化、人力资源管理,还是市场营销、财务管理等…...

Java解决幸运数字
Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数,因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数,因为(126)10 (176)8,(126)10…...

将一个nextjs项目部署到vercel
注:下面均为AI创作(本人已验证该流程可行) 将一个 Next.js 项目部署到 Vercel 是一个相对直接的过程,因为 Vercel 是由同一个团队开发的,专门为 Next.js 优化。以下是部署一个 Next.js 项目到 Vercel 的基本步骤&…...

RocketMQ学习笔记:分布式事务
这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、分布式事务的难题2、解决方式2.1、半事务消息和事务回查2.2、代码样例2.2.1、TransactionListener2.2.2、TransactionMQProducer2.2.3、MessageListenerConcurrently2.2.4、流程图 1、分布…...

单臂路由和三层交换机
目录 一.单臂路由 1.单臂路由的工作原理 2.单臂路由的配置 2.1画出拓扑图 2.2配置PC 2.3配置交换机 2.4配置路由器 2.5测试 二.三层交换机 1.三层交换机的概述 2.三层交换机的配置 2.1画出拓扑图 2.2配置PC 2.3配置二层交换机 2.4配置三层交换机 2.5测试 3.拓展 三.总结 一.…...

红岩思维导图的制作软件,分享4款热门的!
红岩思维导图的制作软件,分享4款热门的! 在当今信息爆炸的时代,思维导图作为一种有效的知识整理和思维拓展工具,受到了广大用户的青睐。红岩思维导图以其独特的风格和实用性,成为了许多人学习和工作中的得力助手。那么…...

es 集群开机自动启动
前面搭建了 es 集群,但是每次机器重启 都需要手动启动,很麻烦,所以这里介绍一下开机自动启动 首先使用 root 用户 es : 执行以下命令 vim /etc/init.d/elasticsearch 将以下内容 cv 进去 #!/bin/bash #chkconfig: 345 63 …...

使用JMeter从JSON响应的URL参数中提取特定值
在使用Apache JMeter进行API测试时,我们经常需要从JSON格式的响应中提取特定字段的值。这可以通过使用JMeter内置的JSON提取器和正则表达式提取器来完成。以下是一个具体的例子,展示了如何从一个JSON响应中提取rowId的值,同时处理字符串终止符…...

汽车电子行业知识:自动驾驶系统结构和各模块功能
文章目录 2.自动驾驶系统结构和各模块功能2.1.自动驾驶系统结构2.2.车载传感器2.2.1.激光雷达2.2.2.毫米波雷达2.2.3.超声波雷达2.2.4.摄像头2.2.5.GNSS2.2.6. IMU2.2.7.多传感器融合 2.3.各功能模块2.3.1.高精度地图2.3.2.定位2.3.3.感知2.3.4.决策2.3.5.规划2.3.6.控制2.3.7.…...

Oracle参数文件详解
1、参数文件的作用 参数文件用于存放实例所需要的初始化参数,因为多数初始化参数都具有默认值,所以参数文件实际存放了非默认的初始化参数。 2、参数文件类型 1)服务端参数文件,又称为 spfile 二进制的文件,命名规则…...

鸿蒙(HarmonyOS)Navigation如何实现多场景UI适配?
场景介绍 应用在不同屏幕大小的设备上运行时,往往有不同的UI适配,以聊天应用举例: 在窄屏设备上,联系人和聊天区在多窗口中体现。在宽屏设备上,联系人和聊天区在同一窗口体现。 要做好适配,往往需要开发…...

PTGui图像拼接实验
1 PTGui图像拼接实验 1.1 概述 图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术 图像配准(image alignment)和图像融合是图像拼接的两个关键…...

C++|类封装、类的分文件编写练习:设计立方体类、点和圆的关系
文章目录 练习案例1:设计立方体类CPP代码 练习案例2:点和圆的关系CPP代码 代码总结类的分文件编写 练习案例1:设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 CPP代码 class Cube { pub…...

大数据开发扩展shell--尚硅谷shell笔记
大数据开发扩展shell 学习目标 1 熟悉shell脚本的原理和使用 2 熟悉shell的编程语法 第一节 Shell概述 1)Linux提供的Shell解析器有: 查看系统中可用的 shell [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin/bin/dash/bin/t…...

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法
直接说结论:基础不好先做1800、强化之前660,强化可选880/1000题。 首先,传统习题册存在的一个问题是题量较大,但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大,但有些题目难度不够平衡,有些过于简单…...

【GameFramework框架内置模块】17、声音(Sound)
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…...

视频记录历史播放位置效果
简介 每次打开页面视频从上一次的播放位置开始播放 利用lodash库做节流 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…...

Request Response
简介 Request(请求) & Response(响应) 浏览器会向服务器发送请求数据,服务器也需要返回响应数据给浏览器,因此我们需要设置对应的类来代表请求数据和响应数据,且Servlet中的service方法就需…...

How to convert .py to .ipynb in Ubuntu 22.04
How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook,我也试了一下,感觉还不错,不过,也遇到了一些问题,比方说,我有堆的.py文件,如果要一个一…...

【prometheus-operator】k8s监控集群外redis
1、部署exporter GitHub - oliver006/redis_exporter: Prometheus Exporter for Redis Metrics. Supports Redis 2.x, 3.x, 4.x, 5.x, 6.x, and 7.x redis_exporter-v1.57.0.linux-386.tar.gz # 解压 tar -zxvf redis_exporter-v1.57.0.linux-386.tar.gz # 启动 nohup ./redi…...

MySQL索引(图文并茂)
目录 一、索引的概念 二、索引的作用 三、创建索引的原则依据 四、索引的分类和创建 1、索引的分类 2、索引的创建 2.1 普通索引 2.1.1 直接创建索引 2.1.2 修改表方式创建 2.1.3 创建表的时候指定索引 2.2 唯一索引 2.2.1 直接创建唯一索引 2.2.2 修改表方式创建 …...

Redis 教程系列之Redis PHP 使用 Redis(十二)
PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP。 接下来让我们安装 PHP redis 驱动:下载地址为:https://github.com/phpredis/phpredis/releases。 P…...