1703867255
1703867256
1703867257
1703867258
1703867259
图6.11 一个序列号的承诺
1703867260
1703867261
注:密码学承诺好比把一个序列号封装到一个信封里。
1703867262
1703867263
铸造零币的过程分为三步:
1703867264
1703867265
1.生成一个序列号S和一个随机密钥r。
1703867266
1703867267
2.计算一个函数Commit(S,r),这是序列号S的承诺。
1703867268
1703867269
3.如图6.12所示,在区块链上发布该承诺,这需要消耗一个基础币,此币不可再被花费,进而创建了一个零币。此时并S和r仍然是保密的。
1703867270
1703867271
1703867272
1703867273
1703867274
图6.12 在区块链网络上设置一个零币
1703867275
1703867276
注:为了将一个零币置于区块链中,需要创建一个铸币交易,其输出地址是零币序列号的一个密码承诺,而铸币交易的输入则是一个基础币,这个基础币也会在创建零币的过程被消耗掉,整个交易过程并不需要公示这个序列号。
1703867277
1703867278
为了消耗一个零币并赎回新的基础币,你需要证明你之前已经铸造了一个零币,你可以通过公开之前的承诺也就是说公示S和r的值来证明这一点,但是这样显然就建立了一个你的旧的基础币和新的基础币之间的关联,那么我们怎样才能打破这个关联呢?这个时候就用到零知识验证了,在任何时间节点,区块链网络上都有很多的承诺对象——我们将其命名为c1,c2,…,cn。
1703867279
1703867280
以下是消耗一个具有序列号S的零币以赎回一个新基础币的步骤:
1703867281
1703867282
● 创建一个特殊的“花费”交易,这个交易包含序列号S和一个具备零知识验证的声明:“我知道在承诺对象(S,r)中的r在以下的集合里:{c1,c2,…,cn}”。
1703867283
1703867284
● 矿工将会验证你的零知识验证,这将给予你打开区块链中一个零币承诺的能力,而你并不需要真的打开它。
1703867285
1703867286
● 矿工也会查询序列号S,确认这个零币没有在之前的花费交易中被使用过(为了防止双重消费)。
1703867287
1703867288
● 你的花费交易的输出将形成一个新的零币,你应使用你所拥有的一个地址来作为输出地址。
1703867289
1703867290
1703867291
1703867292
1703867293
图6.13 花费一个零币
1703867294
1703867295
注:花费交易展示了之前铸币交易中所锁定的序列号S,以及S和之前的铸币交易的关联性的零知识验证。不像一个铸币交易(或者一个普通的比特币/基础币的交易),这个花费交易没有输入地址,因此也没有签名,只有一个零知识验证的证明来确立它的有效性。
1703867296
1703867297
一旦你花费了一个零币,其序列号就变得公开了,那么你就不能再次赎回同一个序列号所对应的零币,由于每一个零币都仅有唯一的序列号,正如我们从安全角度所要求的那样,每一个零币只能被花费一次。
1703867298
1703867299
匿名性。在整个过程中,我们可以发现r一直是保持隐匿状态,不管是铸币交易还是花费交易都没有展示过r,这意味着没有人知道哪一个序列号对应哪一个具体的零币,这就是零币匿名性背后的核心概念。在区块链上,生成序列号S的铸币交易和稍后公示S以赎回一个零币的花费交易之间,并没有关联性。这种听起来像魔术般的特性是无法使用实体的封装系统来实现的,但在密码学中是可以做到的。好比我们在桌上放了一些装有不同序列号的密封过的信封,你可以证明某一个序列号是这些信封里面的一个,而不需要展示是哪一个,也不需要打开任何一个信封。
1703867300
1703867301
效率。回忆一下我们在花费交易中证明过的一个声明:
1703867302
1703867303
“我知道在承诺对象(S,r)中的r在以下的集合里:={c1,c2,…,cn}”。
1703867304
[
上一页 ]
[ :1.703867255e+09 ]
[
下一页 ]