打字猴:1.703868262e+09
1703868262 安全时间戳功能还有许多其他有意思的应用。有一种完全公钥签名方案,被称为盖伊·福克斯签名方案(Guy Fawkes signature scheme),相比较通常的公钥签名,只是利用了哈希函数和只能做增量记录的记录特性,而不需要任何重量级的加密算法。
1703868263
1703868264 对未来预测证明的攻击
1703868265
1703868266 我们目前无法仅仅用时间戳就证明对未来的准确预测,能对未来进行预测(clairooyance),当然非常好。而且从表面上看,这好像可以做到。在一个事件发生之前(比如一个体育比赛或是选举)发表一个对结果的预言,然后在事件发生之后,再证明在之前就已经预测到了。但这个方法是否真正可行?
1703868267
1703868268 在2014年下半年的世界杯决赛阶段,有人想用这个办法来“证明”世界杯的组织方国际足联(Federation Internationale de Football Association,简称FIFA)在搞腐败。当时有个推特账号,由于在一些重要比赛之前就可以准确地预测到这些比赛的结果,因而被广受关注。比如,该账号准确地预测到德国队会在加时赛取胜并且马里奥·格策(Mario Götze)会进球。这看起来可以证明,要么是微博主人有预知未来的能力,要么是比赛被操纵了。然而事实上,这个博主只是在比赛前发布了所有可能发生的事件,比如,对于所有的参赛球员,都有一条关于他会进球的微博,以及对于每一种可能的最终比分,都有一条相关的微博等(见图9.1),然后在比赛结束之前,博主删除了所有那些不准确的预测,只留下那些准确的“预测”。
1703868269
1703868270
1703868271
1703868272
1703868273 图9.1 试图对未来进行预测
1703868274
1703868275 注:这就是那个虚假的试图通过预测比赛结果来“证明”世界杯决赛圈的比赛被操控了的推特账号。其中第一个和第四个在赛后被证明是正确的,其他不准的预测就被删掉了。
1703868276
1703868277 可以用同样基础的攻击方法攻破任何安全时间戳系统。你只需要在事先预埋下所有的结果,然后最终只披露那个正确的结果。这就意味着如果你想证明你有预测能力,就必须去证明你做且只做了一个预测结果,而不是多个预测。但如果你想基于哈希函数揭示结果,是很难实现的,尤其是在比特币的区块链上,因为安全时间戳系统并不将承诺与任何个人身份识别相关联。如果你不揭示它们,就会很容易公布很多种承诺,而那些你从未揭示的承诺很难轻易追溯到你。
1703868278
1703868279 过时的安全时间戳
1703868280
1703868281 这里介绍一个简单的低科技含量的安全时间戳方案:通过刊登广告,你可以在一份报纸或者其他媒体上登出你预测结果的哈希函数值,相关的旧报纸杂志会被保存在图书馆里或者在线备份。这种方法可以提供较高程度的保证,证明你在报纸发出的当天就已经知道这个结果了。以后,当你想要披露你预测的结果时,你可以在同一个报纸上刊登第二份公告。
1703868282
1703868283 比特币里的安全时间戳
1703868284
1703868285 如果我们想用比特币而不是报纸来实现时间戳的功能,我们应该在哪里放置约定的哈希值?是在交易中的某个环节,还是直接在一个区块里?
1703868286
1703868287 人们想出来的第一个也是最简单的解决办法是,直接把钱打到数据的哈希函数值,而不是公共钥匙的函数值。由于你不知道对应地址的私钥,这样做会“消耗”这些币,让它们销毁掉,并且永不能被利用。为了降低成本,你可能需要发送微量的币值,比如1聪(satoshi,0.0000001个比特币,这是比特币的最小交易额)。
1703868288
1703868289 这个方法虽然很简单,但消耗比特币的做法不讨人喜欢(即使和交易费相比,这种被消耗的比特币量级可以忽略不计)。更大的问题是,因为比特币矿工不知道这些交易开支是永远不可用的,他们会永远地追踪下去。因此整个比特币社区对这个方法都不太感冒。
1703868290
1703868291 另一个较为先进的被称为承诺币(CommitCoin)的方法,是将你的数据编码进私钥里。第1章中曾经提到过:“使用ECDSA时,确保随机性良好来源至关重要,因为不良来源将可能导致密钥信息的泄露。这一点不难理解,如果你使用了不良随机源来生成密钥,那么该密钥就可能不安全。但是ECDSA的古怪就在于,即使你仅仅只是在生成签名时使用了不良随机源,而你使用的密钥完美无缺,你的个人密钥还是可能会被泄露。”
1703868292
1703868293 承诺币利用了这个特性。我们生成一个新的私钥把我们的数据约定进行编码,并对应地生成一个公钥。然后我们会发送一个微小金额的交易(比如2 000聪)到那个地址,随后再发送两笔每次1 000聪的交易回来。最重要的是,当发送回来的时候,我们会用同样的随机源来对两次交易进行签名。这样,任何人在区块链里计算包含被封装的数据约定的私钥时,必须使用两个签名。
1703868294
1703868295 比起把数据约定编码到公钥的方法,承诺币避免了消耗额外的比特币,而且矿工不再会一直追踪一个永久不能再被使用的支出。不过这个方法十分复杂。
1703868296
1703868297 不能被再次使用的输出
1703868298
1703868299 一直到2015年,比特币实行时间戳的办法是用一个OP_RETURN的交易,这个交易的输出可以被证明,但不能被二次使用(见图9.2)。这个OP_RETURN指令会立刻返回一个错误代码让这个脚本永远不能成功地执行,这样一来,所封装的数据就被忽略了。就像我们在第3章看到的,这既可以用做消耗证明,也可以用来编码任意数据。到2015年,OP_RETURN允许输出80个字节的数据,这对哈希函数来说是足够了(SHA-256需要32个字节)。
1703868300
1703868301
1703868302
1703868303
1703868304 图9.2 用OP_RETURN指令的时间戳
1703868305
1703868306 注:这是一个“不能被再次使用”的交易输出脚本,中间封装了一个数据约定。
1703868307
1703868308 这个方法“挤出了”在没有被使用过交易支出里的“水分”,因为矿工会精简OP_RETURN里的支出。这个数据约定的花费其实就是一个交易费。在整个2015年,一个典型的交易费通常小于1美分。这个交易费可以分摊在针对多个数据的一个约定上,从而使得成本更低。在2015年年末,已经有几个网站在做这些服务。它们收集不同用户的一组数据,把这些数据封装到一个梅克尔树中,然后发布一个包含了这个梅克尔树树根数据中不能被再次使用的交易支出。这种做法就好比,把当天需要实行时间戳的所有用户数据封装到了一个数据约定里。
1703868309
1703868310 非法内容
1703868311
[ 上一页 ]  [ :1.703868262e+09 ]  [ 下一页 ]