前言

现在的主流公链项目不管是基于账户模型仍是 UTXO 模型,买卖转账地址与金额都是揭露信息,易于追踪。

Zcash, Monero 等完成了隐私Token,在主链完成隐私Token有几个痛点:

  • 算法晋级: 密码学算法开展较为敏捷,新的算法应用到主链而且与现有系统适配需求很漫长的进程

  • 缝隙修正: 主链的缝隙晋级需求和谐矿工或验证人来配合晋级,影响范围较广,周期较长

基于智能合约的隐私Token则能做到灵敏的算法计划,快速的缝隙修正,影响面较小,只影响到该隐私Token的用户,是完成隐私Token的杰出的渠道。

简介

隐私买卖基于 Alaya 的 WASM 智能合约渠道 PIP-13 提案构建的隐私Token项目。该项目意在处理日益剧增的买卖匿名化需求。经过零常识证明算法达到隐匿身份,算法插件化来满意多种隐私的需求;支撑隐私Token的独立发行以及 ARC20 财物的隐私化;运用插件机制,做到算法的在线晋级,做到对用户的无感晋级。

合约架构

合约架构的首要满意以下几个方针:

  • 可扩展,整个结构能够适配更多的算法,扩展隐私买卖的生态。

  • 可晋级,对于合约缝隙,如算法缝隙等,能够进行快速晋级,及时避免缝隙导致经济损失。

  • 易于发行,Token的发行方不需求具备对算法原理的了解,仅需求判别算法是否满意需求,就能发行隐私Token。

架构图

上述架构图中由如下模块组成

  • ConfidentialToken 隐私Token合约,由Token发行方进行布置。

  • Registry 注册表合约,ACL 合约地址会注册在 Registry, ConfidentialToken 每次买卖都是经过 Registry 获取 ACL 最新地址,这样 ACL 能够进行动态晋级。

  • ACL 拜访操控合约,担任办理隐私Token的注册信息,验证算法合约与存储合约版别。

  • TokenManager Token办理合约,ACL 关于 ARC20 合约存取操作都是经过 TokenManager 与 ARC20 合约进行交互。

  • Validator 验证合约,完成对各种算法的验证功能,每种验证合约能够依据算法自界说账户地址。

  • Storage 存储合约担任存储每笔转账的必要信息,用于验证是否存在双花操作。

  • ARC20 标准Token合约

从可扩展视点,开发者能够完成多种验证算法,注册到 ACL 合约中,就能供隐私Token发行方运用。

从可晋级的视点,ACL,Validator,Storage 都能够进行动态晋级,满意了功能扩展、缝隙修正等不同晋级的需求。

从易于发行视点,项目方仅需求布置 ConfidentialToken,即可完成隐私Token。

算法原理

算法概念和界说

  • 收据 note: 学习 Bitcoin 的 UTXO 模型,一个收据 "note" 便是一个 UTXO,其是对金额的加密后的表明,逻辑上包含金额 "value"、属主 "owner"。金额就是该收据的密文方式;属主信息是由该收据的 spending key 决议,在后续章节会进一步描绘;

  • JoinSplit 买卖(简称“买卖”):在本计划中,界说一个买卖为多个收据和其他信息的调集。其他信息是指为验证买卖逻辑包含的必要的数据,包含零常识证明等。

  • 付款人payer,收款人payee: 在一个买卖里,指花费了收据的人,和具有花费新创立的收据的权利的人。这儿付款人,需求与发送者 sender 进行区别,后者是发送了买卖给区块链网络的人;因而,sender 能够与 payer 是同一个实体,也能够是被实际 payee 授权的一个第三方。

计划介绍

密钥和收据

学习 DKSAP(Dual-Key Stealth Address Protocol) 协议,用户的钱包需求包含两个密钥对,spending key-pair 和 viewing key-pair:

  • a spending key-pair: , ; 用于授权一个买卖。用户揭露 。

  • a viewing key-pair: , ; 用于审计 / 查看一个或许多个收据。用户揭露 。

当 payer 需求创立一个新的收据 (output note) 时,首先生成一个暂时密钥 ephemeral key pair, ,用 payee 的 public viewing key 一同生成一个 shared secret (选用 Diffie-Hellman key agreement 原理)。随后,用 shared secret 和 payee 的 一同生成一个该新收据的 spending key-pair, 记为 。注:每个收据都有一个独立的 spending key-pair,该 spending key-pair 界说了该收据的 ownership, 谁知道该 spending key-pair 的私钥部分,谁就具有花费该收据的权利。

DKSAP 的详细协议流程

假定 Bob (payee) 的密钥为:spending key-pair: , viewing key-pair: ; 为椭圆曲线群的生成元。

Alice (payer) 先生成一个暂时密钥对 , 然后将公钥 部分与放入 Note 数据中进行揭露。

Alice 核算一个 shared secret: , 是一个满意密码安全的哈希函数。这儿因为选用了 ECDH 原理,另一方 Bob 也能够核算 。Alice 核算本次买卖中 Bob 的买卖地址为:。

Bob 动态地查看链上买卖,试图找到发送给他的 Note。他能够依据每个 Note 中的 ,核算出相应的 shared secret,然后核算对应的 Note 接纳地址 ,与每个 Note 的接纳地址 进行比对,假如比对成功,则用 背面的私钥部分 进行花费(签名),这儿 。

Transfer 买卖流程

假定 Alice 需求转账给 Bob 7 XATP,且 Alice 总共具有收据包含 :5 XATP, :3 XATP。在一个明文的 JoinSplit 买卖里,, 作为 input notes, Alice 会创立 :7 XATP, : 1 XATP, 且指定 、 属主信息分别为 Bob 和 Alice。

一、 payer Alice 创立一个买卖暂时密钥对,JoinSplit key-pair:https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg, }。

二、Alice 核算 input note commitments 如下:

  • , , 其间 是指收据 的 note spending key 的公钥部分。

  • Alice 核算每个 input note 的签名,以表明确实有权利花费。, 。其间 是收据 的 note spending key 的私钥部分。// 这儿把 也扔到单个收据的签名里,表明每个收据的属主都认可当前的 JoinSplit key-pair 的具有者。这样,不会形成进犯者伪造一个新的 JoinSplit key-pair, 在不改变买卖数据的情况下,重新签名买卖进行重放进犯。

三、Alice 核算 output note commitments 如下:

  • 其间 和 是 Alice 经过 DKSAP 协议以及 Bob 的公钥生成的 note spending key 的公钥部分。

  • Alice 会将 和 的暂时密钥的公钥部分也揭露,便利 payee 从链上找到归于自己的收据。即揭露 , .

四、Alice 核算 public value 。该变量是一个揭露的数值,表明与外部账户系统 (ARC20 财物)的转入转出关系,即该值为正数时,表明有 数量的Token转出到外部账户 (sender's address),假如该值为负数时,表明有 数量的Token从外部账户 (sender's address) 转入到隐私Token系统。例如一个典型的充值买卖中的金额配平关系可能是形如:inputNotes = [], outputNotes = [1 XATP,2 XATP], publicValue = -3 ATP ,表明 sender 的 ATP 账户中会冻住 3 个Token,一起会创立 2 个 output Notes,其金额总和为 3 (假定 ATP : XATP = 1: 1)。

五、Alice 对上述数据进行签名,核算 . 其间 为买卖的完好数据,即 。// 留意,本例中的 ,表明是一个隐私Token系统内部的纯粹转账。

六、Alice 创立一个零常识证明 , 需求证明以下逻辑:

  •  和 里躲藏的金额 之和 =  和 里躲藏的金额 之和 + ;

  • 所有收据许诺的躲藏金额都是在一个合理的正数区间内;// 避免越界进犯

  •  和 是正确的许诺代数结构。// 证明逻辑取决于详细的许诺计划。这儿不必查看 和 ,是因为一定会有一笔前续的买卖会查看,否则 , 不会被写入 Note registry。

七、Alice 将 ( , ) 一同发送给合约。

八、合约开始验证买卖,逻辑如下(可依据实际需求调整验证次序),假如有任一项校验失利,则拒绝履行买卖:

  • 验签 ;

  • 验签 , ;

  • 查看 , 是否存在 Note registry 上;

  • 查看 , 是否不存在 Note registry 上;

  • 验证 ,假如验证失利,则拒绝履行买卖;// 这儿我们省掉了 ZK proof 相关的 public inputs, 取决于详细的算法细节;

九、假如上述验证均经过,则合约更新 Note registry 状况,行将 毁掉,并创立 。每个收据要包含:收据许诺 ,该收据的 note spending key 的公钥部分 , 以及该收据的暂时密钥的公钥部分 。

十、假如上述验证均经过,还需求处理 对应数量的Token情况。假如 为正数,则合约将向 sender 的外部地址中解冻 数量的 ATP Token;否则合约将从 sender 的外部地址冻住 数量的 ATP Token。

模型界说

在UTXO模型的基础上, 隐私Token支撑 5 种首要的操作,铸币,毁掉, 转账,充值,提币。

铸币: 由Token的发行方建议的增发买卖(一种没有 input 的特别转账买卖)。

硬核科普:隐私交易使用手册

毁掉: 由Token发行方建议的毁掉一定数量的Token的买卖(一种没有 output 的特别转账买卖)。

硬核科普:隐私交易使用手册

转账: 由普通用户建议的input总和与output总和持平的买卖。

硬核科普:隐私交易使用手册

充值: 充值,由普通用户建议的 input 总和小于 output 总和的特别转账买卖。差值经Token缩放因子处理后为实际从 ARC20 转入到隐私账户的Token数量,充值买卖内部会从买卖指定揭露账户转账 ARC20 token 到 TokenManager 合约账户。

硬核科普:隐私交易使用手册

提款: 由普通用户建议的 input 总和大于 output 总和的特别转账买卖。差值经Token缩放因子处理后为实际从隐私账户 转出到 ARC20 Token数量,提款买卖内部会从 TokenManager 合约账户转账 ARC20 token 到买卖指定的揭露账户。

硬核科普:隐私交易使用手册

合约买卖

买卖结构

买卖分为 Proof, ExtraData, Signature 三部分,Proof 中保护有对 UTXO 证明与本次授权买卖地址,ExtraData 为明文数据,Signature 为授权地址私钥进行签名,确保买卖信息的完好性。

硬核科普:隐私交易使用手册

合约买卖证明结构进程

一、结构证明数据,证明数据交给零常识证明处理。数据结构如下:

硬核科普:隐私交易使用手册

依据证明入参,生成如下证明结果作为买卖证明入参:

硬核科普:隐私交易使用手册

二、不同类型的买卖对应不同的附加数据,添加相应的附加数据,附加数据经过 RLP 编码后得到附加数据字节流。

TransferExtra 对应转账、充值、提款三种类型买卖。着重说下 depositSignature ,其是避免买卖发送者不具有 publicOwner 私钥,就将其 ARC20 Token转走。

三、结构完好的秘要买卖信息,RLP 编码,授权地址对 RLP 编码后数据签名,从而得到完好的证明。

合约履行流程

用户发送上述几种类型买卖

  • ConfidentialToken 合约从注册表中找到 ACL 的地址

  • ConfidentialToken 向 ACL 发送买卖信息

  • ACL 依据 ConfidentialToken 注册的信息找到验证合约进行证明验证

  • Validator 进行 ZK 验证

  • Validator 校验授权签名

  • 假如是 Deposit 买卖,Validator 查看 deposit signature

  • Validator 依据详细的算法发生 CreateNoteDetailEvent 事情

  • ACL 依据注册的存储合约进行更新数据

  • Storage 更新 input, 将 input note 进行删去

  • Storage 更新 output, 创立 output note

  • 假如是 Deposit/Withdraw 买卖,调用 TokenManager 进行存取操作

  • TokenManager 调用 ARC20 进行转账操作

  • ConfidentialToken 对 output note 创立 CreateNoteEvent 事情

  • ConfidentialToken 对 input note 创立 DestroyNoteEvent 事情

  • 假如是 Mint 买卖,创立 MintEvent 事情

  • 假如是 Burn 买卖,创立 BurnEvent 事情

合约事情

上一次 mint 数据的 hash;上一次 burn 数据的 hash;完好的 note 信息;note 的发生;note 的毁掉;更改 note 补白;这些信息都需求经过事情获取。

MintEvent

特点类型索引描绘mintHashh256否铸币买卖的 hashvalueu128否铸币金额

描绘:发行方需求记载每次铸币的 hash,下一次发行方铸币时需求前一次铸币的 hash。第一次铸币时上一次铸币的 hash 为空。

BurnEvent

特点类型索引描绘burnHashh256否毁掉买卖的 hashvalueu128否铸币金额

描绘:发行方需求记载每次毁掉的 hash,下一次发行方毁掉时需求前一次毁掉的 hash。第一次毁掉时上一次毁掉的 hash 为空。

CreateNoteDetailEvent

特点类型索引描绘noteHashh256是note hash 值noteOwnerbytes否note 属主noteCipherbytes否note 的金额和绑定数据用 viewing pk 加密之后的数据noteMetabytes否note 的补白信息

描绘:属主信息是 ephemeralPk 和 signPk 组成结构体的 RLP 值,用户用私有的 viewingSk 和 spendingSk 判别自己是否为属主。判别成功之后,用私有的 viewingSk 从 noteCipher 中解密出 note 的 blinding 和 quantity。

CreateNoteEvent

特点类型索引描绘noteOwnerbytes是note 属主的 hashnoteHashh256是note 的 hash 值ownerbytes否note 属主

描绘:和 CreateNoteDetailEvent 是一一对应发生的。

DestroyNoteEvent

特点类型索引描绘noteOwnerbytes是note 属主的 hashnoteHashh256是note 的 hash 值ownerbytes否note 属主

描绘:每花费一个 note 就会触发一个 DestroyNoteEvent,用户需求监听此事情删去现已花费的 note。

MetaDataEvent

特点类型索引描绘noteHashh256是note 的 hash 值noteMetabytes否note 的补白信息

描绘:发生新的 note 补白和 更改 note 补白时会触发此事情。

布置晋级

合约概念和界说

委员会: 有权同意多签买卖的地址,在多签买卖规定的时间内,只有收集到不少于阈值的委员会签名,多签买卖才算被同意,才能被发送到区块链网络。

提案买卖: 需求委员会同意的多签买卖,规定时间内,委员会同意经过,发送到区块链网络履行买卖,未同意经过,买卖超时被删去。

模板合约: 因为布置买卖内容包含合约代码,代码量较大形成买卖过大,所以选用模板合约,区块链底层直接仿制模板合约代码。

Clone 创立合约: Clone 创立时仿制模板合约代码,用新的初始化参数初始化合约,创立成功之后获取新创立的合约的地址。

合约晋级: 仿制模板合约代码,发生新的合约地址,旧合约的数据迁到新合约地址,旧合约毁掉。

官方合约布置

一、布置 Registry 注册表合约,用来办理 ACL 地址,每次 ACL 晋级的一起向 Registry 注册新地址。

注册表合约选用无私钥地址布置,确保后续没有人能够更改此合约。注册表合约不支撑合约晋级。

硬核科普:隐私交易使用手册

二、布置 MultiSign 多签合约,此合约用来办理 ACL 合约,后续晋级都将经过多签合约进行。

承认多签委员会名单和提案收效人数阈值,布置合约初始化时传入确认好的值。

三、布置 ACL 操控办理合约,布置进程中会 clone 出 TokenManager 合约。TokenManager 合约和 ARC20 合约交互,转入转出 token 到 TokenManager 合约。

硬核科普:隐私交易使用手册

四、布置 Validator 验证合约或许 Storage 存储合约,这两个合约的布置流程是相同的,布置后都需求在 ACL 进行版别注册。

硬核科普:隐私交易使用手册

官方合约晋级

ACL 合约晋级

硬核科普:隐私交易使用手册

委员会经过 MultiSign 合约进行晋级的布置,布置经过先布置模板合约以 Clone 方式进行合约的晋级,晋级的 ACL 合约数据也同时搬迁曩昔。晋级后 ACL 会更新在 Registry 的注册信息,晋级的进程是一笔买卖,所以晋级进程不会影响买卖到调用方的运用。

硬核科普:隐私交易使用手册

Validator / Storage 合约晋级

ACL 合约对 Validator 和 Storage 合约进行版别操控,针对新特性、缝隙晋级都会向 ACL 注册新版别,运用方能够依据自行需求,进行晋级。一个新版别注册进程如图:

硬核科普:隐私交易使用手册

委员会确认新版别,经过 MultiSign 对 Validator/Storage 合约进行注册,注册信息存储 ACL,供运用方查找。后边章节会讲用户怎么晋级。

注册版别信息

注册信息包含 Verion, Address, Description 三部分

  • Verion 由 3 个字段表明 类型 + 主版别 + 子版别组成

  • Address 模板合约地址

  • Description 版别信息描绘

隐私Token合约布置

隐私Token合约是由用户或项目发行方来建议布置的。

硬核科普:隐私交易使用手册

  • 发布者向注册合约恳求获取 ACL 最新地址

  • 发布者从 ACL 获取验证合约与存储合约版别,选择相应版别

  • 发布者将验证合约与存储合约版别及其它信息作为初始化信息布置隐私Token合约

  • 隐私Token合约向 ACL 合约进行注册

  • ACL 依据隐私Token合约指定的版别号进行验证合约布置

  • ACL 依据隐私Token合约指定的版别号进行存储合约布置

隐私Token合约晋级

硬核科普:隐私交易使用手册

  • 晋级方向注册合约恳求获取 ACL 最新地址

  • 晋级方向 ACL 获取晋级合约版别

  • 晋级方调用隐私Token合约的晋级接口

  • 隐私Token合约会调用 ACL 的晋级接口

  • ACL 找到隐私Token合约对应的验证合约,调用验证合约的搬迁接口

  • 验证合约依据晋级模板合约进行合约晋级

  • ACL 将晋级后的验证合约地址更新注册信息

底层:

https://github.com/PlatONnetwork/PlatON-Go/tree/alaya-dev/feature-confidential-token

隐私合约开源仓库:

https://github.com/PlatONnetwork/confidential-transaction

视野开拓

如果你希望一个人形成对某个事物的积极态度,那么就引导他,使他致力于得到这个事物。如果你希望一个人对某种错误行为的道德判断变得温和一些,那么就引诱他做出这种行为。相反,如果你希望一个人对某种错误行为的道德判断更加强硬,那么就引诱他,但不足以使他做出这一行为。-《决策与判断》

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注