AZTEC 协议简介
我的木头人亮
发表于 2023-1-5 15:07:54
201
0
0
此系列分成以下四个部分:% A# V0 V3 @* i' B- a$ v5 E$ f# k
AZTEC 协定简介 (英文原文)发布 AZTEC 至 Ganache证明、签收、及检视密钥管理建立及使用加密资产) s7 p8 g) Z* c, g/ D/ S/ x
首先,让我们介绍为什么要使用 AZTEC。
现在大部分的区块链应用都跟有价资产有关,服务本身也许仍以网站或 App 的形式出现,但会额外使用智能合约来管理及保护使用者的资产。例如:一个投资管理公司将用户的债券转为等值货币纪录在以太坊上,并撰写智能合约在一定条件下由发行人直接转给投资人利息,中间并不透过该公司。所以即使公司倒闭,双方仍可以继续在区块链上履行彼此的权利义务。区块链的本质确保了在链上的数据不会被窜改,且用户数据不会完全被该公司所拥有。但这也衍生了另一个问题?—?隐私。
区块链上每笔交易的输入输出数据都是公开的。
以上面的例子来说,债券的价值及票面利率等,都必须公开于链上才能保障双方的交易。然而在真实世界中,这些资料都是被投资公司所保管的。, W( {3 U$ Z: q; X3 h" I
AZTEC 协定 就是用来确保在区块链上的数据仍能兼顾保密性。它运用一系列零知识证明 (zero-knowledge proofs) 及同态加密 (homomorphic encryption) 来处理数值,并可对这些加密数据做特定逻辑运算。于是我们可以存取这些加密讯息至区块链,对其做运算验证,而不会透露出它们真正的值。
运作原理+ \# A$ e n% E0 B
传统的零知识验证系统如果跑在区块链上将会花费相当可观的燃料费 (gas),且在链上的验证会很耗时,不同资产间也无法互相转换。当中最耗费的运算是范围证明 (range proof)。范围证明可以验证一个加密的值是否落在特定范围内,这对处理椭圆曲线上两点的相加特别重要。在椭圆曲线上,负值是极大的正值,于是需要范围证明来规范最大值。AZTEC 下的信赖建置系统 (trusted setup) 将以相对传统系统极小的花费来执行范围证明运算。& v4 S& {0 C% F% U2 D
一旦确保了加密数据在可接受范围内,我们即可用椭圆曲线的点相加定理来做逻辑验证。基于同态加密原则,当我们对两个密文做处理,得到的结果也会是密文。于是我们可以安心的在区块链上验证加密数据,而不会暴露真实的值。
综合以上两项基础,我们可以衍生出一系列可运用在区块链上的逻辑陈述。如果想知道 AZTEC 协议下详尽的证明,请参考这份白皮书。) R( X1 |% Z/ v/ S5 l( s; K
AZTEC 的核心概念8 ^6 Z8 s8 W5 Z: ]
AZTEC 遵照的 UTXO 模型类似于比特币的模型。AZTEC 票据 (note) 是协议里运算的基础单元。票据的值已被加密。每个票据的状态都纪录在票据登记所 (note registry) 里。3 Y6 B% }4 O3 q( {3 J8 b
用户的 AZTEC 资产是一个票据登记所里所有被该用户地址所拥有的有效票据的和。
# K6 a! r" m- m! E
- AZTEC 的 UTXO 模型-
公有链 (public blockchain) 有两个主要优势:独立不受任何单位控制的经济体系,以及资产的互操作性 (interoperability,从某个产品得到的收益可以用来支付另一个服务的费用)。然而当今大部分的零知识系统都缺乏互操作性。他们运作在孤立的圈子里,使得不同数字资产间难以流通。AZTEC 也解决了这项问题。& T3 E+ @- f' U
要达到互操作性,所有 AZTEC 资产将共享单一信赖建置系统,他们的状态也将由一个智能合约统一管理,此合约称为 ACE (AZTEC Cryptography Engine)。ACE 有两个主要功能:利用指派的合约来执行证明,并于验证通过后,更新票据登记所里相关票据的状态。, [; A& h9 L& |2 }# C' g0 s
3 R ~7 d6 v1 P( O+ l' X
AZTEC 协议设计了一套开发模块来帮助开发者打造兼顾信息保密的去中心化应用。目前 AZTEC 提供了七个工具组:
Join Split (转账)
Join Split 证明能将一个或多个票据结合或拆解成一个或多个不同的票据,并保证输入的票据实值总和等于输出的和。$ i* x0 l( T- r
这个证明也可用来与 ERC20 互动:把公开的 ERC20 值转换成 AZTEC 票据,或是将 AZTEC 票据转回 ERC20。4 O' _$ K( w% i0 E2 A
Bilateral Swap (交换)
Bilateral Swap 证明能让用户互换票据。例如用来交换代表两种资产的票据:法定货币换贷款/债券/抵押品。此证明验证甲方提供的票据等于乙方要求的票据,而乙方提供的票据等于甲方要求的票据。
Dividend2 }( F! Y9 q+ y" j/ ^5 y" [7 b
Dividend 能验证输入票据的值等于输出票据的值乘上一个公开值。此证明能用来验证收到的利息是否正确。; y3 o" F* d2 d/ C9 |! n/ W, T8 P; c
Mint+ W& ^# g. q' V @
Mint 证明让可信的用户能增加票据的供给。例如在收到转入账户的稳定货币后产生一个等值的 AZTEC 票据。1 u0 v7 e" X% `7 ^8 q6 k
Burn& v; q7 a0 O5 _1 A9 k
Burn 证明让可信的用户销毁票据。例如在转出稳定货币给他人后销毁一个等值的 AZTEC 票据。
Private Range2 p* q$ D9 L5 f
Private Range 能验证一个票据的值是否大于另一个票据的值。此证明可用来保证资产小于规范。
Public Range
Public Range 能验证一个票据的值是否大于另一个公开的整数。此证明可用来保证资产小于规范。7 g% M* e/ j5 `; V- Y
隐私、匿名、与保密
这些名词在零知识系统里很常被提到。接下来我们将解释他们之间的差异以及以 AZTEC 实作各项的可能性。- G4 R* g" L M, w" B% ~2 T
隐私 (privacy):交易的所有信息都不被第三方得知。- m/ Z* D0 n! t2 C0 ?3 u3 H$ Q% h
匿名 (anonymity):交易的输入与输出信息都是公开的,但保护交易的来源与去向以防透露出交易双方的身分。$ ~' o4 L$ v2 o5 N( b
保密 (confidentiality):隐藏交易的输入与输出信息,但交易双方的身分则是公开的。
AZTEC 提供交易的保密性。透过协议加密输入输出数据,将使得第三方无法解密公开于链上的信息。
如传递一般的以太坊地址至 AZTEC 工具组,产生的证明是无法自动达到匿名的。然而匿名仍是可以与 AZTEC 并行。协议里的验证并不要求票据的收送方为交易的发送方。于是我们可以透过第三方代为执行交易进而隐藏用户的身分。未来版本的 AZTEC 将实作去中心化的代转交易并隐藏燃料费用,届时使用协议将可以做到完全的隐私。7 d( r2 @) X5 @% \0 a9 e* g
建立保密资产
EIP 1724 旨在标准化一个接口,以与 UTXO 模型为底的保密资产互动。AZTEC 的 NPM 套件 @aztec/protocol 中参照了 EIP 1724 对资产型态的定义:: g! ~8 M. K! ?4 A, c
https://cdn-images-1.medium.com/max/800/1*kgUXqtqUwAkDpy57nlRGKg.png* }) i: g- T: Y, ~( s! Q
EIP 1724 ZkAsset 标准
接下来让我们看一个简单的例子:
假设一个 dApp 需要做逻辑检查来确保交易方的资产在交易后会少于规范的最大值。- M6 s* k6 h. ~9 R( u" W$ {! b
这个检查在一般的 dApp 里可以简单实作。合约将检查现有资产 assetBalance[buyer] 加上预计收到的款项 tradeNotional 小于规范的最大值 regulatoryMax。
if (tradeNotional + assetBalance[buyer]
在信息需被保密的情况下,同样的逻辑可以使用 AZTEC 协议达成。差别在于所有参数将被加密成 AZTEC 票据,并建构一个证明,此证明再交由 ACE 验证。) L5 h/ ^9 r) ?. J: M A% Q
这个例子将使用 Private Range 证明:
const {; @; R' r4 a7 j; \/ D
proofData,
} = await aztec.proof.privateRange.encodePrivateRangeTransaction({
originalNote: regulatoryMax,! M! L/ _4 H, A, n7 W4 x' q4 V4 k
comparisonNote: postTradeUserBalance,3 ?2 L8 Y% r4 D% Y7 j) U: \) X( y
senderAddress: accounts[0],% k" d* R) H7 K8 F9 j% z( r; a0 V* q
});, g6 }- P1 ^) ]) I
以上证明宣告 comparisonNote 的值少于 originalNote 。接下来再将产生的 proofData 送至合约上由 ACE 验证:. b" E; K; f) u) ^% V
(bytes memory _proofOutputs) = ACE.validateProof(+ }, ~4 r, u) A4 Z! A8 v
PRIVATE_RANGE_PROOF,9 a' W+ Q, b* ~9 J- c5 \# S+ R
address(this),
_proofData4 s. u! U+ @9 }, e8 w
);
// 交易可以进行
AZTEC 的设计让用户可以运用这些逻辑检查来打造一个复杂的去中心化加密金融应用。接下来的文章将进一步列举更复杂的例子。
成为第一个吐槽的人