『学概念找员外』铸造零币

零币通过铸币过程而产生,而且任何人都可以铸造一个标准面值的零币。为简便起见,我们认为零币只有一种面值,每一个零币价值一个基础币。虽然任何人都可以铸造一个零币,但是产生的零币并不自动具备任何价值——你不可能获得免费的钱。只有把零币放到区块链网络上,并且通过消耗一个基础币的方式,它才能具备价值。

为了铸造一个零币,你需要使用加密学承诺。铸造零币的过程分为三步:

  1. 生成一个序列号S和一个随机密钥r;
  2. 计算一个函数Commit(S,r),这是序列号S的承诺;
  3. 在区块链上发布该承诺,这需要消耗一个基础币,此币不可再被花费,进而创建了一个零币。此时并S和r仍然是保密的。

为了将一个零币置于区块链中,需要创建一个铸币交易,其输出地址是零币序列号的一个密码承诺,而铸币交易的输入则是一个基础币,这个基础币也会在创建零币的过程被消耗掉,整个交易过程并不需要公示这个序列号。

为了消耗一个零币并赎回新的基础币,你需要证明你之前已经铸造了一个零币,你可以通过公开之前的承诺也就是说公示S和r的值来证明这一点,但是这样显然就建立了一个你的旧的基础币和新的基础币之间的关联,那么我们怎样才能打破这个关联呢?这个时候就用到零知识验证了,在任何时间节点,区块链网络上都有很多的承诺对象——我们将其命名为c1 ,c2 ,…,cn 。

消耗步骤

以下是消耗一个具有序列号S的零币以赎回一个新基础币的步骤:

  • 创建一个特殊的“花费”交易,这个交易包含序列号S和一个具备零知识验证的声明:“我知道在承诺对象(S,r)中的r在以下的集合里:{c1 ,c2 ,...,cn}”。

  • 矿工将会验证你的零知识验证,这将给予你打开区块链中一个零币承诺的能力,而你并不需要真的打开它。

  • 矿工也会查询序列号S,确认这个零币没有在之前的花费交易中被使用过(为了防止双重消费)。

  • 你的花费交易的输出将形成一个新的零币,你应使用你所拥有的一个地址来作为输出地址。

一旦你花费了一个零币,其序列号就变得公开了,那么你就不能再次赎回同一个序列号所对应的零币,由于每一个零币都仅有唯一的序列号,正如我们从安全角度所要求的那样,每一个零币只能被花费一次。

匿名性

在整个过程中,我们可以发现r一直是保持隐匿状态,不管是铸币交易还是花费交易都没有展示过r,这意味着没有人知道哪一个序列号对应哪一个具体的零币,这就是零币匿名性背后的核心概念。在区块链上,生成序列号S的铸币交易和稍后公示S以赎回一个零币的花费交易之间,并没有关联性。这种听起来像魔术般的特性是无法使用实体的封装系统来实现的,但在密码学中是可以做到的。好比我们在桌上放了一些装有不同序列号的密封过的信封,你可以证明某一个序列号是这些信封里面的一个,而不需要展示是哪一个,也不需要打开任何一个信封。

效率

回忆一下我们在花费交易中证明过的一个声明:

“我知道在承诺对象(S,r)中的r在以下的集合里:={c1 ,c2 ,…,cn }”。

其中,n代表的就是曾经被创建过的零币的数量。听起来这种零知识验证的实施会变得非常没有效率,因为证明中包含的集合大小会随着n的增加而线性增大。神奇的是,零币可以让这种验证的复杂度仅仅是n的对数。我们需要注意到这一点,即使需要被验证的声明的长度是线性的,声明本身并不需要被包括在证明里,而是隐含的。由于矿工们知道区块链上所有零币的集合,声明就可以被矿工们自行推断出来。这样证明本身就可以非常短。尽管如此,跟比特币相比较,零币还是增加了相当大的额外开销,大概50KB。

你可能感兴趣的:(『学概念找员外』铸造零币)