2014世界杯决赛诬蔑国际足联腐败事件以推特账号伪造时间戳来袭击比特币网发生过吗?

。比如,该账号准确地预测到德国队会在加时赛取胜并且马里奥·格策(Mario Götze)会进球。这看起来可以证明,要么是微博主人有预知未来的能力,要么是比赛被操纵了。然而事实上,这个博主只是在比赛前发布了所有可能发生的事件,比如,对于所有的参赛球员,都有一条关于他会进球的微博,以及对于每一种可能的最终比分,都有一条相关的微博等(见图9.1),然后在比赛结束之前,博主删除了所有那些不准确的预测,只留下那些准确的“预测”。

图9.1 试图对未来进行预测

注:这就是那个虚假的试图通过预测比赛结果来“证明”世界杯决赛圈的比赛被操控了的推特账号。其中第一个和第四个在赛后被证明是正确的,其他不准的预测就被删掉了。

可以用同样基础的攻击方法攻破任何安全时间戳系统。你只需要在事先预埋下所有的结果,然后最终只披露那个正确的结果。这就意味着如果你想证明你有预测能力,就必须去证明你做且只做了一个预测结果,而不是多个预测。但如果你想基于哈希函数揭示结果,是很难实现的,尤其是在比特币的区块链上,因为安全时间戳系统并不将承诺与任何个人身份识别相关联。如果你不揭示它们,就会很容易公布很多种承诺,而那些你从未揭示的承诺很难轻易追溯到你。

过时的安全时间戳

这里介绍一个简单的低科技含量的安全时间戳方案:通过刊登广告,你可以在一份报纸或者其他媒体上登出你预测结果的哈希函数值,相关的旧报纸杂志会被保存在图书馆里或者在线备份。这种方法可以提供较高程度的保证,证明你在报纸发出的当天就已经知道这个结果了。以后,当你想要披露你预测的结果时,你可以在同一个报纸上刊登第二份公告。

比特币里的安全时间戳

如果我们想用比特币而不是报纸来实现时间戳的功能,我们应该在哪里放置约定的哈希值?是在交易中的某个环节,还是直接在一个区块里?

人们想出来的第一个也是最简单的解决办法是,直接把钱打到数据的哈希函数值,而不是公共钥匙的函数值。由于你不知道对应地址的私钥,这样做会“消耗”这些币,让它们销毁掉,并且永不能被利用。为了降低成本,你可能需要发送微量的币值,比如1聪(satoshi,0.0000001个比特币,这是比特币的最小交易额)。

这个方法虽然很简单,但消耗比特币的做法不讨人喜欢(即使和交易费相比,这种被消耗的比特币量级可以忽略不计)。更大的问题是,因为比特币矿工不知道这些交易开支是永远不可用的,他们会永远地追踪下去。因此整个比特币社区对这个方法都不太感冒。

另一个较为先进的被称为承诺币(CommitCoin)的方法,是将你的数据编码进私钥里。第1章中曾经提到过:“使用ECDSA时,确保随机性良好来源至关重要,因为不良来源将可能导致密钥信息的泄露。这一点不难理解,如果你使用了不良随机源来生成密钥,那么该密钥就可能不安全。但是ECDSA的古怪就在于,即使你仅仅只是在生成签名时使用了不良随机源,而你使用的密钥完美无缺,你的个人密钥还是可能会被泄露。”

承诺币利用了这个特性。我们生成一个新的私钥把我们的数据约定进行编码,并对应地生成一个公钥。然后我们会发送一个微小金额的交易(比如2 000聪)到那个地址,随后再发送两笔每次1 000聪的交易回来。最重要的是,当发送回来的时候,我们会用同样的随机源来对两次交易进行签名。这样,任何人在区块链里计算包含被封装的数据约定的私钥时,必须使用两个签名。

比起把数据约定编码到公钥的方法,承诺币避免了消耗额外的比特币,而且矿工不再会一直追踪一个永久不能再被使用的支出。不过这个方法十分复杂。

不能被再次使用的输出

一直到2015年,比特币实行时间戳的办法是用一个OP_RETURN的交易,这个交易的输出可以被证明,但不能被二次使用(见图9.2)。这个OP_RETURN指令会立刻返回一个错误代码让这个脚本永远不能成功地执行,这样一来,所封装的数据就被忽略了。就像我们在第3章看到的,这既可以用做消耗证明,也可以用来编码任意数据。到2015年,OP_RETURN允许输出80个字节的数据,这对哈希函数来说是足够了(SHA-256需要32个字节)。

图9.2 用OP_RETURN指令的时间戳

注:这是一个“不能被再次使用”的交易输出脚本,中间封装了一个数据约定。

这个方法“挤出了”在没有被使用过交易支出里的“水分”,因为矿工会精简OP_RETURN里的支出。这个数据约定的花费其实就是一个交易费。在整个2015年,一个典型的交易费通常小于1美分。这个交易费可以分摊在针对多个数据的一个约定上,从而使得成本更低。在2015年年末,已经有几个网站在做这些服务。它们收集不同用户的一组数据,把这些数据封装到一个梅克尔树中,然后发布一个包含了这个梅克尔树树根数据中不能被再次使用的交易支出。这种做法就好比,把当天需要实行时间戳的所有用户数据封装到了一个数据约定里。

非法内容

区块链随意封装数据的特性也有不好的地方,可能会被某些人恶意使用。在大多数国家,有些内容,尤其如儿童色情,它的制作和传播都是非法的,并且会伴随非常严厉的处罚。著作权法也严格规定了某些内容的传播。

当然,不少人已经尝试这样做去“危害”或者扰乱比特币社区。比如,有报道称有部分色情链接被公布在比特币的区块链上。这些害群之马的目的,就是让下载比特币区块链到个人硬盘并且运行完全有效节点的行为变得很危险,这也意味着你有可能存储和传播了这些非法的信息。

然而,截至目前,还没有好的办法来阻止这种写入任意数据到比特币区块链的行为,即使我们用P2SH(支付给脚本的哈希值)来防止恶意攻击行为,也只不过是使交易多花些费用而已,无法完全阻止这种行为。

好在法律不是计算机算法,尝试用技术的手段对法律进行“黑客攻击”虽然很诱人,但并不容易。法律是需要人类来解释的,并融合了其他因素,比如我们的意图。以美国联邦法案2252号为例,其中在描述有关拥有、分发传播和接收儿童色情制品的非法行为时,使用的措辞就用了“明知故犯”这样包含了意图的关键词。

另外一个值得注意的是,根据上面我们讨论过的字节大小的限制,图片数据(除非是非常小的图片)不能直接被写在区块链的数据块中,这些数据要么被存放在只在区块链中保存相应链接的外部数据库中,要么是用一种冗长的办法封装在多个交易之中。最终的结果就是,大多数比特币用户都没有能力在交易中直接解码并查看数据,更不用说解码并查看跨越多个交易的数据了。