2.3 交易的构建
Alice的钱包应用知道如何选取合适的输入匹配Alice所创建的交易金额。Alice只需要指定目标地址和金额,其余的细节钱包应用会在后台自动完成。很重要的一点是,钱包应用甚至可以在完全离线时建立交易。就像在家里写张支票, 之后放到信封发给银行一样,比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。
2.3.1 获取正确的输入
Alice的钱包应用首先会找到一些足够支付给Bob所需金额的输入。大多数钱包应用都会跟踪着的属于钱包的地址的所有可用输出。因此Alice的钱包会包含她用现金从Joe那里购买的比特币的交易输出副本(参见 在“获取你的第一枚比特币 ”一节)。全节点客户端含有整个区块链中所有交易的所有未消费输出副本。这使得钱包既能拿这些输出构建交易,又能在收到新交易时很快地验证其输入是否正确。但是,全节点客户端占太大的硬盘空间,所以大多数钱包使用轻量级客户端,只保存用户自己的未消费输出。
如果钱包客户端没有未花费交易输出的副本,它可以使用不同的服务商提供的各种API从比特币网络中拿到这一交易信息,或者通过全节点的API调用查询这些信息。例2-1展示了一个API的请求,对特定URL发起HTTP GET命令。这个URL会返回一个地址的所有未花费交易输出,提供给需要这些信息的任何应用。 我们用简单的HTTP命令行客户端 cURL来获得这个响应数据。
例2-1 查找Alice的比特币地址所有的未消费的输出
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
{
"unspent_outputs":[
{
"tx_hash":"186f9f998a5...2836dd734d2804fe65fa35779",
"tx_index":104810202,
"tx_output_n": 0,
"script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
"value": 10000000,
"value_hex": "00989680",
"confirmations":0
}
]
}
例2-2的响应数据显示了Alice的地址 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK 上面有一个未花费输出(还未被消费)。这个响应包含对这笔交易的引用,从Joe那里转过来的未消费输出就包含在这个交易里面,它的价值是一千万聪 (satoshi),即 0.10比特币。有了这个信息,Alice的钱包应用就可以创建新的交易将钱转账到新地址。
如你所见,Alice的钱包中的未花费交易输出中有足够的比特币支付一杯咖啡。假如不够的话,Alice的钱包应用就不得不搜寻一些小的未花费输出,像是从一个存钱罐里找硬币一样,直到找到足够支付咖啡的金额。在两种情境下,可能都需要找回零钱,而这些找零也会是钱包所创建的交易的输出的组成部分。会在下一节有所描述。
2.3.2 创建交易输出
交易的输出是以脚本的形式创建的,这个脚本设置了对兑换金额的“产权限制”,只能引入这个脚本的一个解后才能解除预置实现提款。简单点说就是,Alice的交易输出会包含一个脚本,这个脚本说 “谁能出示一个输出中的对应的公开地址对应的私钥签名,就支付给谁”。因为只有Bob的钱包的私钥可以匹配这个地址,所以只有Bob的钱包可以提供这个签名以兑换这笔输出。因此Alice 会需要Bob的签名来限制输出的使用。
这个交易还会包含第二个输出。因为Alice的未花费交易输出金额是0.10比特币,对0.015 比特币一杯的咖啡来说太多了,需要找零给Alice 0.085比特币。Alice钱包创建给她的找零与付给Bob的支付在同一个交易里面。可以说,Alice的钱包将她的金额分成了两个支付:一个给Bob,一个给自己。她可以在以后的交易里继续消费这笔找零输出。
最后,为了让这笔交易尽快地被网络处理,Alice的钱包会多付一小笔费用。这个不是明显地包含在交易中的;而是通过输入和输出的差值所隐含的。如果Alice创建找零时只找 0.0845比特币,而不是 0.085比特币的话,就会有 0.0005比特币(50万聪) 。两笔输出加起来小于 0.10,所以这个 0.10 比特币的输入就没有被完整的消费了。这个差值会就被矿工收取当作交易费,作为矿工将交易放到区块里,最终打包到区块链帐薄中的费用。
这个交易的结果信息可以用区块链数据查询站点看到,如图2-8所示。
图2-8 Alice和Bob咖啡店的交易
2.3.3 将交易加入到总账簿
这个被Alice钱包应用创建的交易大小为258字节,包含了确认资金所有权和分配给新所有者所需要的全部信息。现在,这个交易必须要被传送到比特币网络中,最终成为分布式账簿(区块链)的一部分。在下一节里,我们来看下一个交易如何成为新区块的一部分, 以及区块是如何被挖矿构建的。最后,我们会看看新区块被加进区块链后,随着更多区块的添加,信任度如何也随之增加的。
2.3.3.1 交易的传送
因为这个交易包含处理所需的所有信息,所以这个交易传送到比特币网络的位置和方式就无关紧要了。比特币网络是由参与的比特币客户端联接其他更多比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播给所有参与者。
2.3.3.2 如何传播
任何遵守比特币协议,参与比特币网络的任何系统(例如服务器,桌面应用程序或钱包)都称为比特币节点。Alice的钱包应用可以发送新的交易给任意一个已联接到互联网的比特币客户端,不论其是由有线网络、WiFi、还是通过手机联接的。她的钱包不必直接连着Bob的比特币钱包,她也不必使用咖啡厅提供的网络,虽然这两者都是可能的。任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给它连接的其它节点。 因此,这个交易迅速地从P2P网络中传播开来,几秒内就能到达大多数节点。
2.3.3.3 Bob的视角
如果Bob的比特币钱包应用是直接连接Alice的钱包应用的话,Bob的钱包应用也许就是第一个收到这个交易的节点。然而,即使Alice的交易是从通过其它节点发过来的,一样可以在几秒钟内到达Bob钱包应用。Bob的钱包会立即确认 Alice的交易是一笔收入,因为它包含能用Bob的私钥兑换的输出。Bob的钱包应用也能够独立地用之前未消费输入来确认这个交易是正确构建的,并且由于包含足够交易费,因此会被下一个区块包含进去。这时Bob风险非常小,因为这个交易会很快被加到区块且被确认。
提示 一个对比特币交易的常见误解是它们必须要等10分钟后新区块产生才被确认,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个网络接受,但对于像一杯咖啡这样的小额商品来说就没有必要等待那么长时间了。一个商家可以免确认来接受比特币小额支付。这样做的风险不比没有身份证或签名的信用卡付款的风险更大,而后者是现在商家常做的事情。