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


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

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

文章插图
图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指令的时间戳

推荐阅读