QURAS使用名为“zk-SNARK”的零知识证明 。使用zk-SNARK可以实现交易和智能 合约的完全隐私(匿名)。 zk-SNARK是“Zero-Knowledge Succinct Non-Interactive Argument of Knowledge”的缩写。 Succinct简洁意味着消息大小远小于实际执行的 计算量。 Non-Interactive 非交互式意味着可以在不需要验证者和证明者之间实时通 信的情况下进行验证。Argument of Knowledge知识论证是指通过计算进行知识验 证。即使zk-SNARK技术可用于隐藏发送人、汇款和金额信息,包括三种主要算法可 以检查交易:
G: 密钥生成算法,从特定秘密值R和函数C生成证明密钥(pk)和 验证密钥(vk),其 中(pk,vk)= G(R,C))
P: 证明者生成证明的算法,从证明密钥(pk),需要验证的信息(x)和函数C的输入(h) 生成证明prf,其中prf = P(pk,X,h))
V: 验证者进行证明验证的算法,通过验证密钥(vk),函数C的输入(h)和证明prf来验 证证明者提供的信息是否正确,V(vk,h,prf)=true或false。目的是验证者在不必 询问证明者的情 况下,以较少的计算在短时间内执行验证工作。
zk-SNARK的执行需要以下步骤:
计算 算术电路 R1CS QAP zk-SNARK
算术电路
为了将交易有效函数转换为数学表达式,逻辑步骤首先被分解为尽可能少的操作, 以创建“算术电路”。假定A需要向B证明他知道c1,c2,c3,使(c1·c2)·(c1+c3)=7,按 照惯例,c1,c2,c3需要对B保密,证明A知道c1,c2,c3,第一步是将数学公式转 换为算术电路。
算术电路以门计算运算符表示,看起来像连接闸门、加法和乘法的导线。该电路看 起来像下面的数学公式:
R1CS:
接下来,运算电路将被转换为一阶约束系统(R1CS)。R1CS是一组包含三个向量 (a,b,c) 的序列。R1CS的解决方案需要满足向量s,其中s需要满足方程s.a * s.b - s.c = 0。 s表示所有输入向量,或换句话说,[C1,C2,C3,S1 ,S2,S3]。由于这 可以用相同的方式表示加法门,通过添加虚拟变量“1”,s向量 将转换为[1,C1,C2 ,C3,S1,S2,S3]。这三个闸门如下:
a=[0,1,0,0,0,0,0]
b=[0,0,1,0,0,0,0]
c=[0,0,0,0,1,0,0]
a=[1,0,0,0,0,0,0]
b=[0,1,0,1,0,0,0]
c=[0,0,0,0,0,1,0]
a=[0,0,0,0,1,0,0]
b=[0,0,0,0,0,1,0]
c=[0,0,0,0,0,0,1]
QAP:
下一步是将此R1CS转换为QAP(二次运算程序)格式。上述三个向量组可以表示为数
组:a(x),b(x),c(x),由x表示。存在多项式表达式,其中P(x)= sa(x)* sb(x) - sc(x)
, P(x)= T(x)* H(x),意味着P(x)= T( x)* H(x)可被证明,可以验证上述数学公式。通
过 将sa(x)定义为L(x),将sb(x)定义为R(x),将sc(x)定义为O(x),需要证明的数学公
式 可以重写为L(x)* R(x)-O(x)= T(x)的* H(x)。
1. A根据上述方法选择多项式L,R,O,H。
2. B选择随机点s并计算E(T(s))。
3 .A基于B发送的(E(s),E(s2),...)计算E(L(s)),E(R(s)),E(O(s)),E(H(s))
sent from B.
4. B验证E(L(s)* R(s)-O(s))= E(H(s)* T(s)).。
此处应用了称为同态加密的理论。同态加密是定义为x或E(x)的数满足以下性质的函 数:
对于几乎所有的x,一旦找到E(x)就很难找到它。如果输入不同,其输出也将不同。 这意味着,在x ≠y的情况下,E(x)≠ E(y)。如果有人知道E(x)和E(y),就能够使用 E(x)和E(y)E来计算(x + y)。这意味着,虽然隐藏了x和y,但可以证明其他人可能知 道x + y的结果。
zk-SNARK技术可用于QURAS平台上的匿名交易。在发送/接收资金期间,zk-SNARK
技术可以实现三种类型的交易:1)隐私(隐身地址到隐身地址),2)去屏蔽(隐身地址 到
公开地址)和3)屏蔽(公开地址到隐身地址)。
屏蔽(从公开地址到隐身地址)
这意味着可以使用ZK-SNARKS加密交易详细信息,包括发送人、接收人和交易金
额。使用它可以在不知道共识节点中的用户私钥的情况下验证加密交易是否正确。
zk-SNARK交易
也就是说,使用ZK-SNARKS有两个新概念 - Commitment(承诺)和Nullifier(废弃
值) 。假设在QURAS区块链中 加密的剩余余额显示为Note,从比特币来看,Note
的概念可以看作是UTXO的类似 概念。不同之处在于Note是加密的,并且不像UTXO
那样具有透明度。以下将说明验证者如何验证Note。Commitment可以被视为
Unspent Note,而对于比特币,它与Unspent UTXO相同:
Nullifier可用于防止重复付款,但它们是Spent Note。作为交易输入的引用发布,将
其哈希设置为废弃值。
交易输出是它们的哈希值,它们的Commitment将在区块链中公布。在QURAS区块
链中,首 先生成以下密钥以使用zk-SNARKS:
- ZK.ProvingKey: 这是用于生成验证证明(证明)的密钥,在匿名交易的创建者生成 加密交易之后,验证者将使用它进行验证。
- ZK.VerifyingKey: 这是用于验证通过绑定加密交易的验证证明(proof)而加密的交 易是否正确的密钥。
- ZK.SecretKey: 这是用于生成ZK-SNARKS的ProvingKey和VerifyingKey的密钥。
- ZK.PrimaryInput: 这是一个共享的值,与废弃值一起用作废弃值的输入值,以生 成ZK.Proof。
- ZK.AuxiliaryInput: 这也是用于生成ZK.Proof的值。.
- ZK.Proof: 此数据用于证明者作为证据发送给验证者,不包括证明者的信息。ZK. Proof由基于ZK.ProvingKey,ZK.PrimaryInput和ZK.AuxiliaryInput的证明者创 建。验证者将使用数据和此ZK.Verifying密钥进行验证。
加密交易包括多个JoinSplit、JoinSplitSig和JoinSplitPubKey项。验证者通过 JoinSplitSig、JoinSplitPubKey和JoinSplit验证JoinSplit的正确性。
以下说明JoinSplit中存在的项目类型。
- VAmount_Old: 这表示从T(透明帐户) - > A(匿名帐户)发送资金时透明帐户中的 余额
- VAmount_New: 这表示对于T-> A或A-> T的情况,T的剩余余额。
- MerkleRoot: 这是前一个区块的commitment的Merkle树的根哈希值。
- Nullifier(1, 2): 这表示输入的2个Notes的废弃值。
- 承诺(1,2): 这表示记录在输出中的记录的承诺值。
- Epk: 这是KA密钥对的公钥,用于加密输出的Note。加密是通过粘结ESK和 RECEIPIENT的 PKenc 完成。换句话说,接收者可以使用自己的Skenc和EPK来读 取加密的Cenc。
- RandomSeed: 这意味着Random的字节行用于计算JoinSplit的证明值。
- 证明: 这表明ZK-SNARKS为JoinSplit提供零知识证明。
- Cenc: 显示加密的Note数据。
VAmount_Old和VAmount_New的值不能为1或更高。
如果这两个值均为1或更高,则该交易被视为失败。
此外,ZK-SNARKS验证、通过JoinSplit证明和ZK-SNARK验证密钥完成。如果为
True,则认为交易成功。如果不是True,则该交易被视为失败。
加密交易应包括至少一个JoinSplit项。当JoinSplit构建时,密钥对需要在第 一阶段产生,为签名密钥(JoinSplitSig)来验证JoinSplit。JoinSplit生成完成 后,JoinSplitPrivKey用于签名JoinSplit的主体。在此之后,在交易中输入 JoinSplitSig,以生成区块链广播的交易。
( 假设Note承诺树的深度是MerkleDepth。)
在Quras区块链中,可以根据Merkle树的Auth Path理论验证Markle树的根值和正确
性。
余额如前所述,匿名交易中存在JoinSplit项。JoinSplit项目中的VAmount_old表示从透明 余额池中拉出代币。VAmount_new表示将代币放入透明余额池的行为。用户只需通 过JoinSplit的VAmount_old和VAmount_new 查看QURAS区块链整个透明余额池的剩 余余额 。无法查看其他适用帐户的余额。
JoinSplit项不止一个,当一个交易被放入区块链时,其JoinSplit的承诺被添加到区块
链的Note Commitment Merkle Tree中。
此外,JoinSplit的废弃值将在区块链中注册。注册匿名交易时,如果Tx的废弃值已
经在区块链中注册,则交易将被识别为双花,并返回到区块链而不会被注册两 次。
在废弃值计算中,即使在Note中输入了随机字符串,其废弃值也会不同。这样,废
弃值可以防止双花。
智能合约意味着可以验证自发计算。除了使用zk-SNARK技术来保护代币交易隐私之 外,还可以执行可验证和匿名的计算。