高效小额支付(efficient micro-payments)
我们再举一个比特币脚本应用的例子。假设天宇开了一家网吧,员外去上网当然是需要支付网费的,只是员外通过比特币来支付,天宇也正好接受比特币的支付。假设员外每次只充一小时的网费,一小时快到的时候,员外就得去支付下一个小时的网费。虽然员外每小时使用比特币支付一次网费是可行的,不过这也太麻烦了,最重要的是手续费会让员外吃不消。
所以我们希望可以把每小时的费用累积起来,最后一次性支付结清。为了实现这种想法,员外先发起一个 多重签名(MULTISIG)交易,把可能花费的最大金额转到多重签名(MULTISIG)地址,但这个交易需要员外与天宇两个人的签名才能生效。员外在上网的时候,每隔一小时就签名一次,向天宇支付这一小时所产生的网络费用,然后把剩余的钱转给自己,每小时重复一次,直到下机为止。请注意,这些交易只有员外的签名,还没有天宇的签名,因此,交易还没被放进区块链里。员外下机之后,会告诉天宇“我要走了,不玩了,你把我的机子下了吧”,此时,员外将不再支付费用,天宇也将切断服务,然后在员外发送的最后一个交易里签名,把它放入区块链里。
随着每个交易付给天宇的币越来越多,员外的币就会越来越少。最后一个交易会一次性向天宇支付所有的网费,然后把剩余的币还给员外。整个过程中,员外单独签名的交易不会进入区块链(上面没有天宇的签名),最后它们都会被丢弃掉。
从技术上讲,所有这些交易都是双重支付。在介绍绿色地址时,我们特别提到防止双重支付的重要性,但在本例中,我们却主动创造了大量的双重支付。实际上,如果双方都是正常运作的话,天宇只会在最后一个交易上签名,所以我们在区块链上看不到中间产生的那些双重支付交易。
还有一个微妙的细节:如果天宇没有在最后一个交易上签名呢?他可能会说,“就让那些币待在第三方托管地址里吧。”这样一来,员外就会失去他一开始转到MULTISIG地址的所有比特币。不过这些都没关系,只要有问题就一定有办法去解决,那就是我们前面看到的一个代码——锁定时间。
锁定时间
为了避免上面说的这个问题,在小额支付协议开始之前,员外与天宇要签订一个交易,约定向员外退还所有的比特币,但是这个“退款”行为被上了锁,直到锁定时间到了为止。员外发起MULTISIG交易把比特币转入第三方托管之后,在向网络宣布这笔交易之前,他会从天宇那里要求这个退款交易。这样,如果过了锁定时间天宇还没有在最后一个交易上签名的话,他可以通过这个退款交易收回所有的比特币。
退款交易被锁定时间是什么意思呢?其实就是之前提到过的代码中的一个参数,在此参数后面填上非零数值t, 这个值告诉矿工在记账的时候,要等待t时间之后才能把这笔交易记入区块链。这个交易在放入区块后,经过确定的区块数或者时间才生效。通过这个方式,人们可以发起一笔未来交易,当然,只有资金在未来时间点之前未被花费掉,这笔未来交易才会被执行。这在小额支付的例子里非常有效,它是员外的定心丸,能够确保在天宇最后没有签字的情况下他能拿回自己的比特币。
网友评论