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
1703868312
区块链随意封装数据的特性也有不好的地方,可能会被某些人恶意使用。在大多数国家,有些内容,尤其如儿童色情,它的制作和传播都是非法的,并且会伴随非常严厉的处罚。著作权法也严格规定了某些内容的传播。
1703868313
1703868314
当然,不少人已经尝试这样做去“危害”或者扰乱比特币社区。比如,有报道称有部分色情链接被公布在比特币的区块链上。这些害群之马的目的,就是让下载比特币区块链到个人硬盘并且运行完全有效节点的行为变得很危险,这也意味着你有可能存储和传播了这些非法的信息。
1703868315
1703868316
然而,截至目前,还没有好的办法来阻止这种写入任意数据到比特币区块链的行为,即使我们用P2SH(支付给脚本的哈希值)来防止恶意攻击行为,也只不过是使交易多花些费用而已,无法完全阻止这种行为。
1703868317
1703868318
好在法律不是计算机算法,尝试用技术的手段对法律进行“黑客攻击”虽然很诱人,但并不容易。法律是需要人类来解释的,并融合了其他因素,比如我们的意图。以美国联邦法案2252号为例,其中在描述有关拥有、分发传播和接收儿童色情制品的非法行为时,使用的措辞就用了“明知故犯”这样包含了意图的关键词。
1703868319
1703868320
另外一个值得注意的是,根据上面我们讨论过的字节大小的限制,图片数据(除非是非常小的图片)不能直接被写在区块链的数据块中,这些数据要么被存放在只在区块链中保存相应链接的外部数据库中,要么是用一种冗长的办法封装在多个交易之中。最终的结果就是,大多数比特币用户都没有能力在交易中直接解码并查看数据,更不用说解码并查看跨越多个交易的数据了。
1703868321
1703868322
依附在比特币上的附着币
1703868323
1703868324
从好的一方面来说,因为我们可以把任何数据都写进比特币的区块,从而在比特币的系统之上建立起一个全新的货币系统,而不需要开发一个新的共识机制。我们只需要简单地把比特币用作一个只能被添加的记录,然后把我们开发新币所需要的所有数据写进比特币的区块链。我们称这种方法为一个依附在比特币上的“附着币”(overlay currencies)。比特币成为一个底层基础架构,所有附着币的数据,通过以不可消费的交易支出的方式写进比特币的区块链。
1703868325
1703868326
当然,比特币的矿工不会验证你写进区块链的数据,因为他们不知道也并不关心这些数据在你所定义的新的货币体系里是否正当有效。只要你肯付交易费,任何人都可以写任何东西。不同的是,你必须自己开发更加复杂的逻辑来验证新货币体系里的交易,然后在每个收发这种新币的客户端(也就是钱包软件)都必须有这套逻辑。
1703868327
1703868328
举例来说,一个附着币的矿工不能再拒绝双重支付的交易。相反,每个附着币的用户必须检查区块链里的历史记录。如果有人尝试重复支付这个币(已经被用过一次了),那样第二次的交易就应该被直接忽略。因为这个缘故,在附着币里没有一个轻量级的SPV客户端。
1703868329
[
上一页 ]
[ :1.70386828e+09 ]
[
下一页 ]