打字猴:1.70386727e+09
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
1703867305 其中,n代表的就是曾经被创建过的零币的数量。听起来这种零知识验证的实施会变得非常没有效率,因为证明中包含的集合大小会随着n的增加而线性增大。神奇的是,零币可以让这种验证的复杂度仅仅是n的对数。我们需要注意到这一点,即使需要被验证的声明的长度是线性的,声明本身并不需要被包括在证明里,而是隐含的。由于矿工们知道区块链上所有零币的集合,声明就可以被矿工们自行推断出来。这样证明本身就可以非常短。尽管如此,跟比特币相比较,零币还是增加了相当大的额外开销,大概50KB。
1703867306
1703867307 建立信任
1703867308
1703867309 用于搭建零币的工具之一(RSA累加器)需要进行一次性信任设置。特别的是,一个被信任方需要选择两个大的质数p和q,并且公示N=p×q作为所有人在系统的整个生命周期中使用的参数。我们可以把N看作一个公钥,只不过它被用于所有的零币而不是仅仅对应于某一个体。只要这个被信任方,销毁任何关于p和q的记录,系统就可以被认为是安全的。需要强调的是,这一做法是基于对两个大质数的积进行因子分解是不可行的这一假设的普遍认可。但是,如果任何人知道了秘密的因数p和q(也被称为“陷阱门”),他们就可以在不被监测到的情形下,为自己创建新的零币。所以,这些秘密的输入只能被使用一次,在用于产生相对应的公钥后就被销毁。
1703867310
1703867311 这里有一个有趣的社会学问题,一个个体怎么选择这个N并能够让每个人相信,在设置时使用的相对应的质数p和q,已经被安全地销毁了,这一过程还不是很清楚。如何实现这个目标,会有很多不同的方案,其中就包括“阀值加密”技术,该技术可使用多个代理协同计算出N,而只要其中一个代理将自己的秘密输入销毁,这个系统就可以被认为是安全的。
1703867312
1703867313 我们还可以使用其他略有不同的加密构造来避免设置这样一个被信任方。特别是,有实践表明,随机生成一个大数就具有很高的安全性,因为这样一个数字很有可能不能被完全分解。但遗憾的是,这样做会带来很大的效率冲击,因此这种方法并不实用。
1703867314
1703867315 零钞
1703867316
1703867317 零钞是一种不同的匿名性加密数字货币,它建立在零币的概念之上,但将加密技术提高到了更高的层次。零钞使用的是一种被称为zk-SNARKS[2]的密码学技术,这种技术可以使得零知识验证更加简洁、更加有效率,要点就在于,系统的整体效率可以达到某一定程度,使得整个网络可以不需要依赖一种基础币而运行,所有的交易都可以以零知识验证的方式进行。如我们所看到的,零币也支持那些本不需要无关联性的普通交易,只不过在其上做了计算量昂贵的混币交易进行补充。这种混币交易由固定面值的数字币组成,交易价值的拆分与合并只能在基础币系统里实现。在零钞系统中,这种差异就不存在了,交易金额的大小被封装在一个承诺中,在区块链上不再可见,密码学证据确保了拆分与合并的正确性,用户并不能凭空创造出零钞。
1703867318
1703867319 账本公开记录的唯一内容就是交易的存在性,以及矿工们用来验证系统正常运行所需要的关键属性的证明。区块链网络上既不显示交易地址,也不显示交易价值。唯一需要知道交易金额的用户,是本次交易的发送方和接收方,矿工们是不需要知道的。当然,如果其中存在交易费用,矿工们则需要知道的仅仅是手续费,这点也不会影响匿名保护。
[ 上一页 ]  [ :1.70386727e+09 ]  [ 下一页 ]