实际情况
理论上来讲,通过脚本,我们可以随意地为比特币支付设定条件。当然,从2015年的情况看,这些特性也并不太常用到。如果我们回顾比特币历史中曾经实际用到的脚本,绝大多数的比特币使用的脚本都非常基础,像之前的例子一样:指定一个公钥,然后通过验证签名来使用这个币。
当然,实际中也会使用一些其他指令,比如MULTISIG
,还有一种支付给脚本的哈希值(Pay-to-script-hash,简称P2SH)等,但除此之外,平时常用的指令真不多,因为每个节点都有一份标准脚本的白名单,它们会拒绝接受不在名单上的脚本。这倒不是说无法运行其他脚本,只是使用起来比较麻烦。
销毁证明
销毁证明(proof of burn)脚本,用于销毁比特币(即防止资金被赎回)。如果交易代码的运行结果是将比特币转到“销毁证明”脚本,那么这笔比特币将被销毁。实际应用中主要是用来引导客户使用其他数字货币系统,即将比特币销毁,以便获得另一个数字货币系统发行的新币。销毁证明脚本使用起来非常简便:使用OP_RETURN
脚本来抛出错误;不论之前指令的运行结果是什么,OP_RETURN
指令总会被执行,并相应抛出一个错误,脚本返回一个“错误”(false)值。
由于OP_RETURN
以抛出错误的形式结束脚本,其后的所有指令都不会执行。利用这个特性,我们可以往脚本中植入任意信息,这些信息也将被存储在区块链中。假如你想通过署名或者盖时间戳的方式来证明你在某个时候知道某件事情,就可以发起一笔极小额的比特币交易,在脚本中加入上述信息,并使用销毁证明脚本将币销毁,这样就可以将信息永久地存储在区块链上。
支付给脚本的哈希值
比特币的工作机制要求币的发送者必须在交易时明确指定脚本,这种机制有时候不太适用:假如你在网店看中了一件商品并打算下单,你会问卖家“请把付款地址告诉我,我可以付款了”,但如果卖家使用了多重签名地址(MULTISIG),那他会说“嘿,我们用了多重签名地址,你需要支付给一个脚本地址,而不是一个简单的地址”,但你会说“我不知道怎么弄,这太复杂了,我只会支付给简单的地址”。
比特币用了一种很聪明的办法来解决这个问题,不仅可以实现多重签名地址支付,而且还可以实现复杂的资金监管规则。比特币使用的办法是:收款方告诉付款方“请把比特币支付给某个脚本地址,脚本的哈希值是××,在取款的时候,我会提供上述哈希值对应的脚本,同时,提供数据通过脚本的验证”,而不是“请把比特币支付给某个公钥,公钥的哈希值是××”。付款方通过P2SH即可实现上述交易。
需要说明的是,P2SH脚本只是对堆栈最顶层的数据进行哈希运算,核验运算结果是否与给定的哈希值一致,核验通过后,再执行一步特殊的核验:将堆栈最顶层的数据重新解读为一系列指令,然后将其作为脚本运行一次,此时,堆栈中的其他数据作为脚本的输入值。
要做到P2SH还是有点复杂的,因为P2SH不是比特币的原始设计,是后来加上去的。它解决了两个重要的问题:让付款方的支付工作简单化,收款方只需告诉付款方一个哈希值即可。在我们上面的例子中,你不再需要去关心商家到底用哪种地址,是否用了多重签名,因为这只是商家在支取这笔款项时需要考虑的事情。
P2SH还实现了效率上的提升:矿工的工作是追踪那些还没有被消费掉的输出脚本。采用P2SH的输出脚本会变得很小——它们只不过是个哈希值而已。所有的复杂性都被放在输入脚本中了。
网友评论