比特币系统与传统的银行和支付系统不同,是基于去中心化的信任。在比特币中,信任不是通过中央权威机构授权而来,而是通过比特币系统中不同用户相互交互自发达成,这是比特币的一个显著特性。 在本章中,我们将通过较高层面跟踪比特币系统中的一笔交易,观察交易如何通过比特币分布式共识机制变得“可信”,被接受,并且最终记录在区块链,这个区块链就是所有交易的分布式账簿。
随后的章节将深入探讨交易,网络和挖矿背后的技术。
如图2-1所示的概览图中,我们可以看到比特币系统由用户、交易和矿工组成,其中用户主要使用密钥控制钱包,交易会被广播到整个比特币网络,矿工通过算力竞争生产出具备所有节点共识的区块链,这个区块链是一个分布式的公开权威账簿, 包含了比特币网络发生的所有的交易。
本章中的每个示例都基于在比特币网络上进行的实际交易,通过将资金从一个钱包发送到另一个钱包来模拟用户(Joe,Alice,Bob和Gopesh)之间的交互。 我们将使用一个区块链浏览器来显示比特币网络中交易进入区块链的每个步骤。 区块链浏览器是一个类似比特币搜索引擎的Web应用程序,它允许您搜索地址,交易和区块,并查看它们之间的关系和流程。
图2-1 比特币网络概览
常见的区块链数据查询网站包括:
以上每一个查询网站都有搜索功能,可以在比特币网络和区块链中通过地址,交易哈希值或区块号,搜索到对应的数据。针对每个交易和区块都会提供一个URL链接,方便做深入研究。
在之前章节里,Alice是一名刚刚获得第一枚比特币的新用户。在【1.4.3 得到你的第一个比特币】中,Alice和她的朋友Joe会面时,用现金换取了比特币。由Joe产生的这笔交易使得Alice的钱包拥有了0.10比特币。现在Alice将第一次使用比特币在加利福尼亚州帕罗奥图的Bob咖啡店买一杯咖啡。
Bob咖啡店刚开始接受比特币支付,销售系统新增加了一个比特币支付选项,价格单上列的是当地货币(美元)的售价,在收银台,顾客可以选择用美元或比特币支付。此时,Alice点了杯咖啡,然后Bob将交易输入到收银机,销售系统按照当前市场汇率把美元总价转换为比特币,然后同时显示两种货币的价格:
总价:
$1.50 USD
0.015 BTC
Bob说,“总共1.50美元,或0.015 BTC比特币”
Bob的销售系统还自动创建一个包含付款请求的二维码。
与简单包含目的比特币地址的二维码不同,当前支付请求是一个包含URL的二维码,它包含有收款地址,付款金额,和像“Bob咖啡”这样的交易描述。这使比特币钱包应用可以预先填好一些特定信息,方便用户识别。你可以用比特币钱包扫描这个二维码来看Alice看到的信息。
图2-2支付请求二维码
提示 尝试用你的钱包扫描这个,看看地址和金额,但不要发送货币。
根据BIP-21的定义,这个付款二维码包括的URL的意思是:
bitcoin:1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA?
amount=0.015&
label=Bob%27s%20Cafe&
message=Purchase%20at%20Bob%27s%20Cafe
Components of the URL
A bitcoin address: "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA"
The payment amount: "0.015"
A label for the recipient address: "Bob's Cafe"
A description for the payment: "Purchase at Bob's Cafe"
Alice用她的智能手机扫描了这个二维码,显示有一笔给Bob咖啡店的0.0150比特币的支付请求,然后她按下发送键授权了这笔支付。在几秒钟时间内(大约与信用卡授权所需时间相同)Bob将会在收银台看到这笔交易,并完成交易。在接下来的章节中,我们将更详细地观察这笔交易,观察Alice的钱包是怎样构建交易,交易又是怎样在网络中广播、怎样被验证,以及Bob在后续交易中怎样消费那笔钱。
注意 从千分之一比特币(1毫比特币)到一亿分之一比特币(1聪比特币),比特币网络可以处理任意小额交易。在本书中,我们将用“比特币”这个术语来表示任意数量的比特币货币,从最小单元(1聪)到可被挖出的所有比特币总数 (21,000,000)。
你可以像下面例1那样使用区块链浏览器站点来检查Alice与Bob's Cafe的交易:
例1-1 查看Alice的交易
简单来说,一笔交易就是告知全网:比特币的持有者已授权把它转帐给其他人。而新持有者可以通过产生另一笔交易,转账给另外的人,依此类推形成一条所有权的链。
交易就像复式记账法账簿中的行。简单来说,每一笔交易包含一个或多个“输入”,就像比特币账户的借方。这笔交易的另一面,有一个或多个“输出”,就像比特币账户的贷方。这些输入和输出的总额(借方和贷方)不需要相等。相反,当输出加起来略少于输入数量时,两者的差额就代表了一笔隐含的“矿工费”,这笔矿工费由成功打包交易到区块链账簿的矿工收取。如图2-3描述的是一笔比特币交易作为账簿中的一个条目。
交易也包含了每一笔被转账的比特币(输入)的所有权证明,它以所有者的数字签名形式存在,并可以被任何人独立验证。在比特币术语中,“消费”指的是签名一笔交易:将以前交易的比特币转账给比特币地址所标识的新所有者。
图2-3交易就像复式记账
Alice支付Bob咖啡时使用一笔之前的交易作为输入。在以前的章节中,Alice从她朋友Joe那里用现金换了点比特币。那笔交易创建了被Alice的密钥锁定的比特币。在她支付Bob咖啡店的新交易中使用了之前的交易作为输入,输出是支付咖啡的金额和多余部分的找零。交易形成了一条链,最近交易的输入对应以前交易的输出。Alice用密钥签名解锁了之前交易的输出,从而向比特币网络证明她拥有这笔钱。她将买咖啡的这笔支付到Bob的地址上,明确指明要求是Bob签名才能消费这笔钱,否则就“阻止”那笔输出。这就实现了在Alice和Bob之间价值转移。下图展示了从Joe到Alice再到Bob的交易链。
图2-4 交易链中一笔交易输出就是另一笔交易的输入
许多比特币交易都会包括新所有者的地址(买方地址)和当前所有者的地址(称为找零地址)的输出。这是因为交易输入,就像纸币那样能够不能被再分割。如果您在商店购买了5美元的商品,但是使用20美元的美金来支付商品,会收到15美元的找零。相同的概念适用于比特币交易输入。如果您购买了一个价格为5比特币的商品,但是你的输入中只有20比特币这一项,那么您需要产生两个输出:一个5个比特币的输出发送给店主,另一个15比特币的输出返回自己作为找零(减去任何适用的交易费用)。重要的是,出于隐私的原因,找零地址不必与输入时提供的地址相同,通常是所有者钱包中的新地址。
不同的钱包可以在合并所有输入,用来匹配自己的付款金额时使用不同的策略。它们可能会聚合许多小输入,或者使用等于或大于所需付款的输入。除非钱包中的输入,刚好汇总起来与所需付款(加上交易费用)完全相等,否则钱包一定会产生一些找零。这与人们如何处理现金非常相似。如果你总是用钱包中的最大面额支付时,那么钱包中的零钱就会越来越多。如果你只使用零钱,整钱就会越来越多。人们总是无意识地在这两个极端之间找到平衡,而比特币钱包开发商也力图实现这种平衡。
总的来讲,交易是将钱从交易输入移至输出。输入通常是前一笔交易的输出的引用,表示价值从何而来。交易输出将约定金额发送到新的所有者的比特币地址,并将找零输出返回原来所有者的地址。 一笔交易的输出可以被当做另一笔新交易的输入,这样随着钱从一个地址被移动到另一个地址,就形成了一条所有权链(如图2-4)。
最常见的交易形式是从一个地址到另一个地址的简单支付,还包含给支付者的“找零”。这类交易有一个输入和两个输出,如图2-5所示:
图2-5 最常见的交易
另一种常见的交易形式是归集多个输入到一个输出(如图2-6)的模式。这相当于现实生活中将很多硬币和纸币零钱兑换为一个大额面钞。像这样的交易由钱包应用产生,来整理在支付过程收到的许多小额的找零。
图2-6 归集资金的交易
最后,另一种在比特币账簿中常见的交易形式是将一个输入分配给多个输出,即多个接收者(如图2-7)的交易。这类交易有时被商业机构用作分配资金,例如给多个雇员发工资的情形。
图2-7 分散资金的交易
Alice的钱包应用知道如何选取合适的输入匹配Alice所创建的交易金额。Alice只需要指定目标地址和金额,其余的细节钱包应用会在后台自动完成。很重要的一点是,钱包应用甚至可以在完全离线时建立交易。就像在家里写张支票, 之后放到信封发给银行一样,比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。
Alice的钱包应用首先会找到一些足够支付给Bob所需金额的输入。大多数钱包应用都会跟踪着的属于钱包的地址的所有可用输出。因此Alice的钱包会包含她用现金从Joe那里购买的比特币的交易输出副本(参见【1.4.3 得到你的第一个比特币】)。全节点客户端含有整个区块链中所有交易的所有未消费输出副本。这使得钱包既能拿这些输出构建交易,又能在收到新交易时很快地验证其输入是否正确。但是,全节点客户端占太大的硬盘空间,所以大多数钱包使用轻量级客户端,只保存用户自己的未消费输出。
如果钱包客户端没有未花费交易输出的副本,它可以使用不同的服务商提供的各种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的钱包应用就不得不搜寻一些小的未花费输出,像是从一个存钱罐里找硬币一样,直到找到足够支付咖啡的金额。在两种情境下,可能都需要找回零钱,而这些找零也会是钱包所创建的交易的输出的组成部分。会在下一节有所描述。
交易的输出是以脚本的形式创建的,这个脚本设置了对兑换金额的“产权限制”,只能引入这个脚本的一个解后才能解除预置实现提款。简单点说就是,Alice的交易输出会包含一个脚本,这个脚本说 “谁能出示一个对应Bob地址对应密钥的签名,这个输出就支付给谁”。因为只有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咖啡店的交易
这个被Alice钱包应用创建的交易大小为258字节,包含了确认资金所有权和分配给新所有者所需要的全部信息。现在,这个交易必须要被传送到比特币网络中,最终成为分布式账簿(区块链)的一部分。在下一节里,我们来看下一个交易如何成为新区块的一部分, 以及区块是如何被挖矿构建的。最后,我们会看看新区块被加进区块链后,随着更多区块的添加,信任度如何也随之增加的。
因为这个交易包含处理所需的所有信息,所以这个交易传送到比特币网络的位置和方式就无关紧要了。比特币网络是由参与的比特币客户端联接其他更多比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播给所有参与者。
任何遵守比特币协议,参与比特币网络的任何系统(例如服务器,桌面应用程序或钱包)都称为比特币节点。Alice的钱包应用可以发送新的交易给任意一个已联接到互联网的比特币客户端,不论其是由有线网络、WiFi、还是通过手机联接的。她的钱包不必直接连着Bob的比特币钱包,她也不必使用咖啡厅提供的网络,虽然这两者都是可能的。任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给它连接的其它节点。 因此,这个交易迅速地从P2P网络中传播开来,几秒内就能到达大多数节点。
如果Bob的比特币钱包应用是直接连接Alice的钱包应用的话,Bob的钱包应用也许就是第一个收到这个交易的节点。然而,即使Alice的交易是从通过其它节点发过来的,一样可以在几秒钟内到达Bob钱包应用。Bob的钱包会立即确认 Alice的交易是一笔收入,因为它包含能用Bob的私钥兑换的输出。Bob的钱包应用也能够独立地用之前未消费输入来确认这个交易是正确构建的,并且由于包含足够交易费,因此会被下一个区块包含进去。这时Bob风险非常小,因为这个交易会很快被加到区块且被确认。
提示 一个对比特币交易的常见误解是它们必须要等10分钟后新区块产生才被确认,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个网络接受,但对于像一杯咖啡这样的小额商品来说就没有必要等待那么长时间了。一个商家可以免确认来接受比特币小额支付。这样做的风险不比没有身份证或签名的信用卡付款的风险更大,而后者是现在商家常做的事情。
Alice的这笔交易现在已经在比特币网络上传播开来。但只有被挖矿节点验证且加到一个区块中之后,这个交易才会成为这个共享账簿(区块链)的一部分。关于挖矿的详细描述请见第10章。比特币系统的信任是建立在计算的基础上的。交易被打包在一起放进区块中时需要极大的计算量来证明,但是验证这个证明只需少量计算就可以。
挖矿在比特币系统中有两个重要作用:
▷ 挖矿节点依据比特币的共识规则验证所有交易。 因此,挖矿过程会拒绝无效或不合规交易,以此保障比特币交易的安全性。
▷ 挖矿在构建区块时会创造新的比特币,就像中央银行发行新的纸币一样。每个区块创造的比特币数量是固定的,并且会逐渐减少。
挖矿在成本和报酬之间取得了良好的平衡。 挖矿耗费电力来解决数学问题。 矿工挖矿成功将会获得新的比特币和交易费作为奖励。 但是,只有其他矿工正确验证了所有的交易,符合共识规则的要求,才能拿到奖励。 这种微妙的平衡为没有中央权威机构的比特币提供安全保障。
描述挖矿最好将其类比为一个巨大的多人数独游戏。一旦有人发现正解之后,这个数独游戏会自动重置,并调整难度,使得游戏每次都需要大约10分钟才能解决。想象一个有好几千行和列的大型数独游戏。如果给你一个已经完成的数独谜底,你可以很快地验证它。然而,如果这个数独只有几个方格里有数字其余方格都为空,就会花费非常长的时间才能解决。这个数独游戏的困难度可以通过改变其大小(更多或更少行列)来调整,但即使非常大时验证结果也是相当容易的。比特币中的 "谜题" 是基于哈希算法的,有类似的特点:不对称,解起来困难而验证很容易,而且它的困难度可以调整。
在【1.3 比特币使用,用户和他们的故事】中,我们提到了一个叫Jing的上海创业者。Jing在比特币网络中扮演了一个矿工的角色。大概每10分钟,Jing和其他上千个矿工一起开始一场全球竞赛,目的就是对一个区块的交易寻找正解。寻找这个解,也被称为工作量证明,整个网络需要进行每秒亿万次哈希计算。这个工作量证明算法指的用SHA256算法重复不断对区块头和一个随机数字进行哈希计算,直到出现一个和预设目标值相匹配的解。第一个找到这个解的矿工就是赢得这局竞赛,并会将此区块发布到区块链中。
Jing从2010年开始挖矿,当时他使用一个非常快的桌面电脑来为新区块寻找正解。随着更多的矿工加入比特币网络中, 寻找谜题正解的难度迅速增大。不久,Jing和其他矿工升级成更专业的硬件,比如游戏桌面电脑或更专业的高端独立图像处理单元芯片(即显卡GPU)。在写这本书的时候,解题已经变得极其困难,只有使用专用集成电路(ASIC),就是几百种挖矿算法集成在一个单硅芯片上并行计算进行挖矿才会盈利。Jing的公司同时加入了一个矿池,这类似彩票奖池,能够让多个矿工共享算力和回报。Jing现在运行一个矿场,有几千个ASIC矿机每天24小时不间断地挖矿。他卖掉一些挖矿得到的比特币来支付电费,赚取利润获得收益。
新交易不断地从用户钱包和其他应用流入比特币网络。当比特币网络上的节点看到这些交易时,会先将它们放到节点自行维护的一个临时的未经验证的交易池中。当矿工构建一个新区块时, 会将这些交易从这个交易池中拿出来放到一个新区块中,然后通过尝试解决一个难题(也叫工作量证明)以证明这个新区块的有效性。挖矿过程的细节会在【第10章 挖矿和共识】中详加描述。
这些交易被加进新区块时,以交易费用和其它的一些规则进行排序。矿工一旦从网络上收到一个新区块, 就知道自己在这个区块上的解题竞赛已经输掉了,然后马上开始下一个新区块的挖矿。它会立刻将一些交易和最新那个区块的数字指纹放在一起开始构建下一个新区块,并开始工作量证明计算。每个矿工会在他的区块中包含一个特殊的交易,将新生成的比特币(当前每区块为6.25比特币)作为矿工费支付到他自己的比特币地址,再加上块中所有交易的交易费用的总和作为自己的报酬。如果他找到了使得新区块有效的解法,他就会得到这笔报酬,因为这个新区块被加入到了区块链总账中,他添加的这笔报酬交易也会变成可消费的。 参与矿池挖矿的Jing设置了他的软件,构建新区块时会将报酬地址设为整个矿池的地址。然后根据各自上一轮贡献的工作量将所得的报酬分给Jing和其他参与矿池挖矿的矿工。
Alice的交易被网络拿到后放进未验证交易池中。一旦被挖矿软件验证,它就被包含在由Jing的矿池生成的新区块(称为候选块)中。参与该矿池的所有矿工立即开始计算候选块的工作证明。大约在Alice的钱包将这个交易发送出来五分钟后,Jing的ASIC矿机发现了新区块的正解并将这个新区块发布到网络上,一旦结果被其它矿机验证成功,它们就会立即开始下一个新区块的竞赛。
Jing的ASIC矿机发现了新区块的正解并将之发布为第277,316号区块,包含420个交易,包括Alice的交易。将Alice交易包含在区块中就算做对该交易的一次"确认"。
提示 你可以查看包含Alice交易记录的这个区块的信息。
大约19分钟后,第277,317号新区块诞生在另一个挖矿节点中。因为这个新区块是在包含Alice交易的第277,316号区块的上层(栈),在这个区块的基础上增加了更多的计算,因此就加强了这些交易的可信度。基于这个区块每产生一个新区块,对Alice这个交易来说就会增加了一次"确认"。当区块一个个堆上来时,这个交易被推翻的难度就会指数级增加,因此它在网络中越来越被信任。
在图2-9中,我们可以看到包含Alice的交易的第277,316号区块。在它之下有277,316个区块(包括0号区块),像链子 一样一个连着一个(区块链),一直连到0号区块,即创世区块。随着时间变长,这个区块链的高度也随之增长,每个区块和整个区块链的计算难度也随之增加。包含Alice的交易的区块后面形成的新区块使得信任度进一步增加,因为他们叠加了更多的计算在这个越来越长的链上。按惯例来说,一个区块获得六次以上“确认”时就被认为是不可撤销的了,因为要撤销和重建六个区块需要巨量的计算。在第10章我们会详细描述挖矿和信任建立的过程。
图2-9 Alice的交易包括在区块277316中
既然Alice的这笔交易已经成为区块的一部分被嵌入到了区块链中,它就成为了整个分布式比特币账簿的一部分,并对所有比特币客户端应用可见。每个比特币客户端都能独立地验证这笔交易是有效且可消费的。全节点客户端可以追溯钱款的来源,从第一次有比特币在区块里生成的那一刻开始,按交易与交易间的关系顺藤摸瓜,直到Bob的交易地址。轻量级客户端通过确认一个交易在区块链中,且在它后面有几个新区块来判定一个支付是否有效。这种方式叫做简易支付验证(参 见“简易支付验证(SPV)节点”)。
Bob现在可以将此交易和其它交易的结果信息作为输入,创建新的所有权为其他人的交易。这样就实现了对此交易的消费。举个例子,Bob可以用Alice支付咖啡的比特币转账给承包商或供应商以支付相应费用。大多数情况下,Bob用的比特币客户端会将多个小额支付聚合成一个大的支付,也许会将一整天的比特币收入归集成一个交易。这样会将多个支付合成到咖啡店财务账户的一个单独地址。图2-10为归集交易示例。
当Bob花费从Alice和其他顾客那里赚得的比特币时,他就扩展了比特币的交易链条。而这个链条会被加到整个区块链账簿,使所有人知晓并信任。我们假定Bob向在邦加罗尔的网站设计师Gopesh支付一个新网页的设计费用。那么区块交易链如图2-10所示。
图2-10 Alice的交易成为 Joe 和 Gopesh交易的一部分
在本章中,我们看到了交易如何被构建为一个链,并将价值从一个所有者转移到另一个所有者。 我们还追踪了Alice的交易,从她的钱包中创建交易,通过比特币网络被传输,以及最终被矿工记录在区块链。 在本书的其余部分,我们将研究钱包、地址、签名、交易、网络和挖矿等背后的具体技术。