今天继续聊百分百准备金证明,前面是《基础篇》,这里聊聊具体的两个细节,针对具体的问题,解答一下咱们可能会存在的疑虑。
第一个问题,《基础篇》中提到的“只公开部分 Merkle Tree”的这种方式,是否在逻辑上是严谨的?也可以这样说,平台给我提供的那些”辅助节点“有没有可能造假?
逻辑完整性讨论
我们先来考虑这样一种情况。比如,平台从用户那里总共吸储 10000 个币,现在他想挪用 2000,那么在公布资产总额的时候自然只能公布 8000 个币了。 这样,邪恶平台在公布这些辅助节点的时候,就必然需要把某些节点的余额调低(假设这里公开所有节点的哈希值都没有变)。这时,虽然我们没有办法去验证这个辅助节点本身是不是有问题,但是,如果我们向上运算,就会马上发现问题,因为父节点的哈希和每个子节点的余额相关,字节点余额的变化了,就算不出原来那个父哈希了,进而也不可能推导出原来那个 Merkle root 的值了。
另一种情况。平台可以考虑更为彪悍的做法。直接就在最底层,删除掉一部分用户节点,这样一路算上去,得到一个全新的同时也是完全合法的 Merkle Tree,同时 Merkle root 对应的余额就是 8000。这时,作为单个用户的我,没有办法直接通过运算去验证平台造假。但是实际中,这种骗人的方式也是行不通的。试想,邪恶平台如何去给那些”被删掉“的用户公开 Merkle Tree 呢?没有别的办法,只能另外制作不同的 Merkle Tree,而 Merkle Tree,或者说哈希算法的本身特点就是,如果你的输入不同,那么输出肯定也会不同,所以邪恶平台就不得不恬不知耻,掩耳盗铃的去发布一个 Merkle root 不相同的 Tree,所以这时只要用户发现同一时刻,平台给不同的用户公布的 Merkle root 不一样,就可以基本认定平台造假了。
证明钱包的主人
好,第一个问题我们就讨论到这里,现在讨论第二个问题:平台如何来证明他公布的钱包地址是真正属于它的呢? 我们来到币付宝这篇博客的页面 http://blog.bifubao.com/2014/03/16/proof-of-reserves/ ,这里我们可以看到,币付宝给出以一段纯文本信息,把这段文字和钱包地址放在一起,用钱包私钥进行了签名。具体的原理可以参考前面我的《有意思的数字签名》那个视频。这样,我可以找有经验的朋友在我自己的机器上,安装相应的软件,就可以验证这个签名是不是真的是由这个钱包的私钥签署的,如果验证通过,那就自然可以证明币付宝拥有这个地址了。
随机数的引入
上面两个问题我们理解了,就可以知道准备金证明机制是合理的,那我们本文的讨论基本上到此也就结束了。但是实际中确实还会有一些边边角角的小问题存在,举个例子,如果平台每次公布的用户哈希值都一样(当用户账号余额都没有变的时候),就会造成两个小麻烦:第一,有心人可以试图去推断这个哈希到底对应谁的账号;第二,邪恶平台可以取巧,如果恰好有两个用户余额相等,他就可以想办法用一份钱去应付两个用户,同时不会被发现。所以,实际中平台会在运算每一个用户的哈希时引入一个随机数,每次运算 Merkle Tree 的时候随机数都不同,得到的节点哈希值自然也不同。这部分的详细讨论大家可以参考 https://iwilcox.me.uk/2014/proving-bitcoin-reserves 中 nonce 的部分。
就写到这里,回头见!