《比特币一个虚幻而真实的金融世界全集.com》第22/37页
比特币交易全过程
首先,讲一个关于比特币交易的故事。从这个故事里,我们可以了解比特币交易的流程,以及流程中各个步骤存在的问题。
有一天,长人在网上闲逛的时候发现了一家网店,里面的商品新潮有趣,而最重要的是,它支持比特币支付。作为比特币的坚定信仰者,他与店主聊得非常投机,决定以10个比特币的价格购买一件商品。出于对店主的信任,长人与店主约定,由前者将10个比特币打到后者的地址上,而后者在收到比特币后再将商品发出。
店主打开自己的比特币钱包,创建了一个新的比特币地址,并告知长人。店主创建新地址的本质是生成了一个密钥对,这个密钥对由一个公钥和一个私钥组成,其中私钥只有店主自己知道,而公钥则是公开的,可以用来验证支付的真伪。
长人收到店主的地址信息后,打开了自己的比特币钱包客户端,并指示客户端将10个比特币发送到店主的收款地址。钱包客户端里储存着长人所有地址的私钥,为了简化问题,我们假设长人在其中一个地址里放了11个比特币,而本次支付只从该地址进行扣款。在发送比特币时,钱包客户端以该地址的私钥对本次交易进行签名,并向全网公布这次交易信息。
这个时候,网上所有的节点或者说每一个矿工都会验证这个交易是否有效。验证方法也很简单,拿出这个地址的公钥对照即可。在这个环节,名叫宋欢平和睡空空的两位矿工也接到了这个交易信息。在经过验证确认交易有效后,他们把这个交易放进内存里,等待进入数据块。过了一段时间,宋欢平的电脑算出了一个符合条件的随机值,系统宣布一个新的合格数据块诞生,并向整个网络公布了这一消息,其他节点(包括睡空空)收到后就开始在这个数据块之后开始新的挖矿工作。而长人和店主的交易信息就被打包放进了宋欢平挖出的数据块里,并且得到了初步确认。当下一个区块链接到这个区块时,交易就会得到进一步的确认。在连续得到6个区块的确认之后,长人和店主的这笔交易基本上就不可逆转地得到了确认。
店主发现10个比特币已经到达他的地址,经过一段时间的等待确认后,他把商品发给了长人,本次交易宣告完成。
确认时间的问题
在这个故事里,最引人注目的问题在于比特币的确认时间。宋欢平和其他矿工不断地测试以得到符合条件的随机值,而求得随机值所需的时间已被系统预先限定,平均耗时10分钟。也就是说,无论矿工们多么努力,挖出一个数据块所需要的时间总是在10分钟左右。如果要保证交易的不可逆转,则要等待6个数据块完全确认,这至少需要1个小时的确认时间。
为什么比特币交易需要确认呢?这涉及双重支付的问题。如果长人给店主支付10个比特币的同时,未等系统确认,又用同一个地址(内有11个比特币)向其他地址支付了10个比特币,并且采取了一些技术手段(比如将10个比特币分散成极小份发送到若干地址里,使得系统优先确认该项交易),使得后一笔交易优先于前一笔得到确认,那么店主最终将得不到那10个比特币。简单来说,一笔比特币交易的等待时间越久,得到的确认越多,它就越安全。
如果这种交易发生在网络上,且销售对象不是时效性非常强的商品,那么等待1个小时的确认时间也无所谓。但如果是在日常生活中,比如在商店里,那确认时间就成问题了。我们很难想象,上班前在7–11里用比特币付款买了糯米鸡当早餐的白领,要在店里等上60分钟才能离开——在迟到5分钟就要扣奖金的今天,这有点儿不切实际。
这个问题的本质其实是信任。你是否信任与你交易的人,这是解决问题的关键。为了便于分析,我们拆分成以下几种情况进行讨论。
/熟人交易/
这里的熟人不一定是朋友,可能是楼下商店的老板。他每天都能看到你上下班,见面了还会打招呼,你也经常去他店里买东西。在这种情况下,他不会太在意确认时间,因为你已经是熟客了,不太可能为了贪小便宜而把自己的信誉丢掉。
/陌生人的大宗商品交易/
在陌生人进行初次交易时,彼此的信任难以马上建立。在这种情况下,确认时间是必要的,但不一定是不可接受的。想象你去4S(以“四位一体”为核心的汽车特许经营模式)店买汽车,当你用比特币支付完毕后,店员同时为你的新车办理各种手续。这种大宗商品交易所需的手续时间通常比比特币的确认时间长得多。那么,交易双方通常都不会太介意交易的时间确认问题。
/陌生人的小额交易/
这是比特币目前遇到的最大的技术难题。在一个大城市里,很多小额交易是发生在陌生人之间的。比如你走进街边的星巴克,点一杯咖啡带走。在这种情况下,服务员不认识你,而你也不可能为了一杯咖啡等上10分钟甚至30分钟。如果比特币的确认时间一直停留在目前阶段,那么这确实是一个问题。
2013年,在美国圣何塞召开的比特币大会上,与会者提出了很多解决理念。其中最重要的一个叫作链外交易,即不在区块链内进行交易确认。假如有一家公司能以其一贯良好的信誉赢得用户的信任,从而推出自己的在线钱包软件,那么只要星巴克及其顾客都注册了该公司的账户,顾客们便可以把自己的部分比特币存入该公司账户,并通过在线钱包购买星巴克等企业的商品,将比特币从自己的账户汇入星巴克的账户。由于这种交易实际上只是在该公司的系统内部进行账内金额转移,不涉及区块链的确认,所以交易几乎是在瞬间完成的。这种方法能够解决陌生人之间小额交易的确认问题。
钱包的安全问题
在长人和店主的交易中,两人都使用了比特币钱包客户端。大部分用户都会选择Bitcoin-QT等客户端作为自己的比特币钱包,储存私钥。钱包在比特币使用过程中的作用至关重要。但事实上,比特币的使用风险大多集中在钱包上:
误把钱包文件删除以至于丢失价值数万美元的比特币;
没有正确备份钱包文件,导致一段时间内交易的比特币全部丢失;
电脑中了木马病毒,钱包文件被盗,所有比特币荡然无存。
以上种种问题都是钱包客户端的特性造成的。
/官方钱包客户端的风险/
首先要说明的是,所有的钱包客户端里面都没有比特币。从比特币的特性可知,它其实是流动在网上的一本大账本里面的数字。而比特币钱包里面存放的是用户的私钥,主要用来证明该用户对账本里的某个数字拥有所有权。每当用户要动用自己的比特币财产时,便动用钱包里某个地址的私钥进行签名,以向全网广播,证明地址里的比特币归他所有。
以官方钱包客户端Bitcoin-QT为例。该客户端存放比特币私钥的文件是Wallet.dat,一般Win8系统下的存放路径是C:\Users\电脑的用户名\Appdata\Roaming\BitCoin(需要注意的是,一般Appdata是隐藏文件夹,需要修改系统设置使隐藏文件可见才能找到)。Wallet.dat的本质是一个私钥池,存放的是这个钱包的所有地址的私钥。有了这个文件,用户才能证明自己对钱包地址里的比特币的所有权。钱包风险其实可以分为以下几种情况。
一是,Wallet.dat文件被偷。这是最常见的钱包风险。如果用户的电脑被黑客入侵,Wallet.dat文件被黑客获取,那么黑客也同样对钱包里的地址拥有支配权。在用户尚未察觉之前,黑客就会把该地址所能支配的比特币统统转移。
二是,Wallet.dat文件丢失。这种情况并不少见。在未做好备份的情况下,误删了Wallet.dat文件,则用户所有的比特币都会丢失。与Wallet.dat被盗不同的是,在这种情况下,这些比特币从此只会在网络上如孤魂野鬼般游荡,不归任何人所有,因为唯一证明所有权的私钥已经永远消失。这些丢失的比特币会使现有的比特币总量变少。
三是,Walllet.dat备份出错。比特币钱包客户端的设置使得Wallet.dat文件的备份成为一个技术活,稍有不慎就会造成严重损失。
在初始状态下,Wallet.dat的私钥池里存有100个私钥。当“生成”一个新地址时,客户端其实并没有真的产生一个新地址和对应的私钥,而只是从私钥池里取出一个使用,同时再生成一个(真正意义上的)新的私钥和地址并放进私钥池里,使未使用的私钥数量保持在100个。
而使问题变得更复杂的是客户端本身的找零机制设置。依照比特币本身的规则,一个地址上的比特币在支付的时候必须全部支出,除向另一个地址支付比特币外,剩余金额再重新支付给原地址(见图3)。
图3 交易示意图
17C的地址里之前有0.189 006 7个比特币,当17C的拥有者发出向18y的地址支付0.1个比特币的指令后,系统会将17C地址里的0.189 006 7个比特币全部取出,并将其中的0.1个比特币转入18y的地址里,剩余的0.089 006 7个比特币重新打回17C。