1703867233
1703867234
为了解释零币,我们首先要介绍一下基础币(Basecoin)的概念,基础币是一种类似于比特币的另类币,而零币是这种数字货币的一种延伸,其所提供的匿名性的核心特点在于,你可以将基础币和零币进行来回转换,并且当你这么做的时候,就打破了旧的基础币和新的基础币之间的关联。在系统里,基础币是你需要进行交易的货币,零币只是提供了一种交易基础币的机制,这种机制可以确保新币和旧币之间毫无关联。
1703867235
1703867236
你可以把你所拥有的每一个零币当作一个令牌,用来证明你拥有这么一个零币并且使其不能再被消费。这种证明机制并不会显示你所拥有的是哪一个零币,而仅仅是证明你确实拥有一个零币,稍后你可以将这个证明给矿工看,以赎回这个证明并取得一个新的基础币。用一个比喻来说,就好比你去赌场用现金换了一些扑克筹码,这些筹码就是一种证明,证明你存了多少现金,等你离开赌场时,就可以拿着这些证明去换相同数量的但并不一样的现金。当然,不像扑克筹码,除了你可以稍后用来赎回一个基础币,你并不能拿零币做任何事情。
1703867237
1703867238
为了在加密数字货币中让这样的机制正常运转,我们要用密码学的方式来执行这些证明,我们需要确保每一个证明只能赎回一个基础币,否则你就可以通过把一个基础币转换成一个零币,然后多次赎回获取更多的免费基础币。
1703867239
1703867240
零知识验证
1703867241
1703867242
我们使用的核心加密学工具是零知识验证,这种方式可以证明一个声明(数学上的)是正确的,而不需要展示可推导该声明正确性的任何其他信息。例如,假设你已经做了很多工作解决了一个哈希谜题,并且你想要向其他人证明你做到了。换而言之,你想要证明“我做到了”这个声明。
1703867243
1703867244
I know x such that H(x‖〈other known inputs〉)<〈target〉
1703867245
1703867246
当然,你可以展示上述公式里的x值来证明你做到了,但是零知识验证可以让你向别人证明你做到了这一点,同时不需要透露x的值,即便在看过你的证明之后。
1703867247
1703867248
你也可以证明一个如“我知道一个x值,而公式H(x)的结果属于下面这一个集合{…}”这样的声明。该证明既没有展示x值是什么,也没有证明集合里面到底哪一个元素等于H(x)。至关重要的是,零币就是利用零知识验证来实现其功能的。事实上,零币中被这种方式证明的声明,与后面要提到的例子非常相似。本书中,我们把零知识验证当成一个黑匣子,只说明了零知识验证可以实现的属性以及在这个协议中的哪个部分是必需的,我们并没有深究如何实现这一功能的技术细节。零知识验证是现代密码学的一个基石,是很多相关技术协议的基础。再一次强调,我们建议有兴趣的读者可以参考延伸阅读中提到的文献,去了解更多更加详细的内容。
1703867249
1703867250
铸造零币
1703867251
1703867252
零币通过铸币过程而产生,而且任何人都可以铸造一个标准面值的零币。为简便起见,我们认为零币只有一种面值,每一个零币价值一个基础币。虽然任何人都可以铸造一个零币,但是产生的零币并不自动具备任何价值——你不可能获得免费的钱。只有把零币放到区块链网络上,并且通过消耗一个基础币的方式,它才能具备价值。
1703867253
1703867254
为了铸造一个零币,你需要使用加密学承诺。回顾一下我们在第1章讲过的内容,承诺方案类似于将一个值放入一个信封,并将信封置于所有人的视野中(见图6.11)。
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}”。
[
上一页 ]
[ :1.703867233e+09 ]
[
下一页 ]