比特币交易
简单来说,交易告知全网:比特币的持有者已授权把比特币转帐给其他人。而新持有者能够再次授权,转移给该比特币所有权链中的其他人,产生另一笔交易来花掉这些比特币,后面的持有者在花费比特币也是用类似的方式。

2.2.1 交易输入输出
交易就像复式记账法账簿中的行。简单来说,每一笔交易包含一个或多个“输入”,输入是针对一个比特币账号的负债。 这笔交易的另一面,有一个或多个“输出”,被当成信用积分记入到比特币账户中。这些输入和输出的总额(负债和信用)不需要相等。相反,当输出累加略少于输入量时,两者的差额就代表了一笔隐含的“矿工费”,这也是将交易放进账簿的矿工所收集到的一笔小额支付。如图2-3描述的是一笔作为记账簿记录的比特币交易。
交易也包含了每一笔被转移的比特币(输入)的所有权证明,它以所有者的数字签名形式存在,并可以被任何人独立验证。在比特币术语中,“消费”指的是签署一笔交易:转移一笔以前交易的比特币给以比特币地址所标识的新所有者。
2.2.2 交易链
Alice支付Bob咖啡时使用一笔之前的交易作为输入。在以前的章节中,Alice从她朋友Joe那里用现金换了点比特币。那笔交易创建了一些被Alice的密钥锁定的比特币。在她支付Bob咖啡店的新交易中使用了之前的交易作为输入,并以支付咖啡和找零作为新的输出。交易形成了一条链,最近交易的输入对应以前交易的输出。
Alice的密钥提供了解锁之前交易输出的签名,因此向比特币网络证明她拥有这笔钱。她将买咖啡的这笔支付附加到Bob的地址上,实现“阻止”那笔输出,明确指明要求是Bob签名才能消费这笔钱。这就描述了在Alice和Bob之间钱的转移。下图展示了从Joe到Alice再到Bob的交易链。

2.2.3 找零
许多比特币交易都会包括新所有者的地址(买方地址)和当前所有者的地址(称为找零地址)的输出。这是因为交易输入,就像纸币那样能够,不能再分割。如果您在商店购买了5美元的商品,但是使用20美元的美金来支付商品,您预计会收到15美元的找零。相同的概念适用于比特币交易输入。
如果您购买了一个价格为5比特币但只能使用20比特币输入的商品,那么您可以将5个比特币的一个输出发送给商店所有者,并将一个15比特币的输出返回给您自己作为找零(减去任何适用的交易费用)。重要的是,找零地址不必与输入时提供的地址相同,出于隐私的原因,通常是所有者钱包中的新地址。
不同的钱包可以在汇总输入以进行用户请求的付款时使用不同的策略。它们可能会聚合许多小输入,或者使用等于或大于所需付款的输入。除非钱包可以以这样的方式汇总输入,以便将所需付款与交易费用完全匹配,否则钱包将需要产生一些找零。这与人们如何处理现金非常相似。
如果你总是在你的钱包支付时使用最大的面额,你会最终得到一个充满零钱的钱包。如果你只使用零钱,你最终会换来整钱。人们总是在潜意识中在这两个极端之间找到平衡,而比特币钱包开发商也力图实现这种平衡。总的来讲,交易是将钱从交易输入移至输
出。输入是指钱币的来源,通常是之前一笔交易的输出。交易输出将约定金额发送到新的所

有者的比特币地址,并将找零输出返回原来原来所有者。 一笔交易的输出可以被当做另一笔新交易的输入,这样随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链(如图2-4)。
2.2.4 常见的交易形式
最常见的交易形式是从一个地址到另一个地址的简单支付,这种交易也常常包含给支付者的“找零”。一般交易有一个输入和两个输出,如图2-5所示:

图2-5最普通的交易
另一种常见的交易形式是集合多个输入到一个输出(如图2-6)的模式。这相当于现实生活中将很多硬币和纸币零钱兑换为一个大额面钞。像这样的交易有时由钱包应用产生来清理许多在支付过程收到的小数额的找零。

图2-6打包资金的交易
最后,另一种在比特币账簿中常见的交易形式是将一个输入分配给多个输出,即多个接收者(如图2-7)的交易。这类交易有时被商业实体用作分配资金,例如给多个雇员发工资的情形。

图2-7分散资金的交易
2.3 交易的构建
Alice的钱包应用知道如何选取合适的输入和输出以建立Alice所希望的交易。Alice只需要指定目标地址和金额,其余的细节钱包应用会在后台自动完成。很重要的一点是,钱包应用甚至
可以在完全离线时建立交易。就像在家里写张支票, 之后放到信封发给银行一样,比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。
2.3.1 获取正确的输入
Alice的钱包应用首先要找到一些足够支付给Bob所需金额的输入。大多数钱包应用跟踪着钱包中某个地址的所有可用输出。因此Alice的钱包会包含她用现金从Joe那里购买的比特币的交易输出副本(参见 在“获取你的第一枚比特币 ”一节)。完整客户端含有整个区块链中所有交易的所有未消费输出副本。
这使得钱包既能拿这些输出构建交易,又能在收到新交易时很快地验证其输入是否正确。然而,完整客户端占太大的硬盘空间,所以大多数钱包使用轻量级的客户端,只保存用户自己的未消费输出。
如果钱包客户端没有某一未消费交易输出,它可以通过不同的服务者提供的各种API或完整索引节点的JSON PRC API从比特币网络中拿到这一交易信息。例子2-1展示了用HTTP GET命令对一个特定URL建立了一个API的请求。这 个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的钱包应用就不得不搜寻一些小的未消费输出,像是从一个存钱罐里找硬币一样,直到找到足够支付咖啡的数量。
在两种情境下,可能都需要找回零钱,而这些找零也会是钱包所创建的交易的输出组成部分。我们会在下一节会有所描述。
