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

news2024/11/26 13:57:46

集中式的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.

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

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

相关文章

瑞吉外卖实战学习--5、新增员工功能

新增员工功能 效果图1、开发流程2、页面发送ajax请求,将新增员工的信息以json的形式提交给服务器2.1、在填写信息的时候会发现身份校验比较麻烦,可以在validate中将全局的校验方式去掉,方便填写2.3、看到接口未employee2.4、前端代码分析3、服务器接收到提交的数据并调用ser…

无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写

如果你拥有一台Mac设备,总会遇到尴尬的那一刻——你在Mac上用得好好的移动硬盘怎么都不能被PC识别到。又或者你朋友在PC上用得好好的移动硬盘,连上你的Mac后,Mac里的文件死活就是拷贝不进移动硬盘里。这种坑,相信大多数使用Mac的小…

Linux 基于chrony进行时钟同步方案验证

Linux 基于chrony进行时钟同步方案验证 1. 背景介绍2. 验证过程2.1 追踪配置2.2 追平记录2.2 追平时间换算 3. 疑问和思考3.1 如何统计追踪1s需要花费多长时间? 4. 参考文档 chrony是一个Linux系统中用于时钟同步的工具。它使用NTP(网络时间协议&#xf…

【Java常用的API】JDK8相关时间类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

c语言:vs2022写一个一元二次方程(包含虚根)

求一元二次方程 的根&#xff0c;通过键盘输入a、b、c&#xff0c;根据△的值输出对应x1和x2的值(保留一位小数)(用if语句完成)。 //一元二次方程的实现 #include <stdio.h> #include <math.h> #include <stdlib.h> int main() {double a, b, c, delta, x1…

商品说明书的制作工具来啦,用这几个就够了!

商品说明书是用户了解产品特性、性能、使用方法的重要途径。一个明确、易懂的商品说明书&#xff0c;可以显著提升用户体验&#xff0c;进而提升产品的销量。但我们都知道&#xff0c;制作一份高质量的说明书并不容易&#xff0c;需要仔细设计、计划和撰写。幸运的是&#xff0…

Python模块与包管理使用pip与virtualenv【第151篇—模块与包管理】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python模块与包管理&#xff1a;使用pip与virtualenv 在Python开发中&#xff0c;模块和包…

【Linux系列】tree和find命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络性能提升10%,ZStack Edge 云原生超融合基于第四代英特尔®至强®可扩展处理器解决方案发布

随着业务模式的逐渐转变、业务架构逐渐变得复杂&#xff0c;同时容器技术的兴起和逐渐成熟&#xff0c;使得Kubernetes、微服务等新潮技术逐步应用于业务应用系统上。 为了充分释放性能、为业务系统提供更高效的运行环境&#xff0c;ZStack Edge 云原生超融合采用了第四代英特尔…

c语言例题,逐个打印数字

今天来分享个比较简单的程序例题&#xff0c;也是比较经典的一个新手例题&#xff0c;逐个打印输入的数字。我们直接从主函数看起&#xff0c;先定义一个num变量&#xff0c;同时变量的类型是unsigned int&#xff0c;这个类型的意思是无符号的整型变量&#xff0c;unsigned&am…

单链表求集合的交集

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

习题2-5 求平方根序列前N项和

本题要求编写程序&#xff0c;计算平方根序列 的前N项之和。可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后两位。题目保证计算结果不…

SD-WAN网络构建要点简述

近年来&#xff0c;SD-WAN已成为企业网络优化的热门选择。SD-WAN代表软件定义广域网&#xff0c;是一种基于软件的网络解决方案&#xff0c;旨在提高企业网络连接的可靠性、安全性和性能。相比传统网络架构&#xff0c;SD-WAN技术通过虚拟化网络通信&#xff0c;利用智能软件和…

ubuntu20.04安装截图工具flameshot

ubuntu20.04 自带的截图工具&#xff0c;可以使用快捷键“shift printScreen” ,但是它不能对截图进行编辑。 现在安装截图工具 flameshot&#xff0c;使用以下命令&#xff1a; sudo apt install flameshot 安装完成后&#xff0c;使用以下命令打开&#xff1a; flamesho…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 &#xff08;为 Jan16 公司创建部门 VLAN&#xff09; Jan16 公司现有财务部、技术部和业务部&#xff0c;出于数据安全的考虑&#xff0c;各部门的计算机需进 行隔离&#xff0c;仅允许部门内部相互通信。公司拓扑如图 1 所示&#xff0c; …

Android 12系统源码_多窗口模式(一)和多窗口模式相关方法的调用顺序

前言 从 Android 7.0 开始&#xff0c;Google 推出了一个名为“多窗口模式”的新功能&#xff0c;允许在设备屏幕上同时显示多个应用&#xff0c;多窗口模式允许多个应用同时共享同一屏幕&#xff0c;多窗口模式&#xff08;Multi Window Supports&#xff09;目前支持以下三种…

ubuntu2204配置zabbix6.4高可用

zabbix6.4-HA 配置keepalived配置haproxy数据库高可用配置zabbix-server配置proxy配置客户端agent 本实验VMware搭建zabbix6.4高可用集群&#xff0c;搭配haproxykeepalived。 master&#xff0c;node节点搭建haproxykeepalibed主备并配置vip地址 三台控制节点搭建数据库高可用…