通过本章的学习,你会对比特币交易的整个过程和基础原理有通俗的理解,本章可以帮助你建立比特币系统的大框。
阅读时长:5分钟左右
2.1 比特币交易
比特币的交易类似复式记账法账簿中的行,每一笔交易包含一个或多个“输入”,这笔交易发生时,会产生一个或多个“输出”,这些输入和输出的总额,不需要相等,两者之间的差额即支付给矿工的“矿工费”。
比如A一共有0.2个比特币,这0.2个比特币来源于之前2次其他人赠送,假设A使用0.12个比特币在咖啡店购买一杯咖啡,那么这笔交易的输入和输出如下图所示:
输入
第一人赠送 0.1 BTC
第二人赠送 0.1 BTC
总输入: 0.2 BTC
输出
输出1 0.12 BTC
输出2 0.03 BTC
总输出: 0.15 BTC
从上图可看出,虽然只需支付给咖啡店0.12个BTC,A需要通过钱包客户端将之前2笔交易收到的比特币整合成0.2BTC,以购买咖啡,整合后的数额大于了咖啡的金额,所以产生了一个找零的输出2。总输入和总输出之间的差额0.05个BTC,是该笔交易的“矿工费”。
2.2 交易的构建
比特币钱包应用会自动选择合适的输入和输出来建立用户希望的交易,用户只需要指定接收地址和金额。比特币交易建立和签名时不用连接比特币网络,只有在执行交易时才需要将交易发送到比特币网络。
2.2.1 获取正确的输入
钱包应用本地会维护一个由用户本人的密钥锁定的“未消费交易输出”小型数据库,每次在创建新的交易时,会从“未消费交易输出”数据中索引到合适的地址,来作为下一笔交易的输入。
2.2.2 创建交易输出
用户创建的交易输出会包含一个脚本,这个脚本的大意是“谁能拿出一个私钥签名和收款地址的匹配上,就支付给谁。”由于在创建地址时,就生成了该地址对应的私钥和公钥,所以私钥落在了谁手上,谁就能控制这个地址上的比特币。
这个交易还会包含第2个输出,即找零。如果从未消费输出中获取到的地址中包含的比特币之和大于本次交易数额,在本次交易中,还会包含有一个找零的输出,找零输出的收款地址为发起人的原地址。
为了让这笔交易尽快被网络处理,交易的发起方还需支付一笔矿工费,矿工费会进入首次确认该笔交易的矿工收款地址。
2.2.3 将交易放入总账簿
用户使用钱包创建的交易,包含该金额未来所属需要的全部信息,现在,这个交易必须要被传送到比特币网络中,以成为分布式账簿(区块链)的一部分。
比特币网络是由参与的客户端链联接其他比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播到所有的参与者。
比特币钱包应用会将新建立的交易发送给其他任何一个已连接到互联网的其他客户端,任何比特币网络节点收到一个之前未见过的有效交易时,会立刻将它转发给联接到自身的其他节点。
收款方的钱包应用收到付款方的交易时,因为它包含能用收款方私钥兑换的输出,收款方能立即确认这笔交易是正确构建的,同时有足够的手续费确保会被下一个区块包含进去,所以收款方此时只需等待该笔交易被区块确认。如果一个商家免确认接受比特币小额支付,那么也没必要等待6次确认那么长时间。
2.3 比特币挖矿
挖矿在比特币系统中的作用有两个:
》挖矿在构建区块时会构建新的比特币,就像中央银行印发新的纸币并发行一样。每个区块创造的比特币的数量是固定的,每四年减半。
》挖矿创建信任。只有通过挖矿的过程验证并将交易包含在区块中之后,这些交易才能成为分布式账簿的一部分。
挖矿的难度是动态调整的,以确保每10分钟产生一个新的区块。可以将挖矿类比于一个巨大的多人数独谜题游戏,想象这个数独有几千行几千列,其中只有几个单元格有值而其他单元格都为空的话,就需要花费很长时间来解决,而解题的难度可以通过增加或减少行、列的数量来动态调整,即便它解题困难但是验证起来是很容易。这和比特币的挖矿是很类似的。
2.4 区块中的挖矿交易记录
当新交易进入比特币网络,比特币网络上的节点看到这些交易时,会先讲他们放到节点维护的一个临时的未经验证的交易池中,当矿工构建一个新区块时,会将交易从交易池中拿出放到新区块中,然后通过挖矿以证明这个新区块的合法性。
矿工一旦从网络上收到一个新区块时,意味着在这个区块上的解题竞赛已经结束了,会马上开始下一个新区块的挖掘工作。他会立刻基于这个新区块和一些交易构建下一个新区块。
2.5 消费这笔交易
当一笔交易成为区块的一部分,被嵌入到整个分布式账簿(即区块链)的一部分时,每个比特币客户端都能独立的验证这笔交易是有效且可消费的。轻量级客户端可通过确认一个交易在区块链中且它后面有几个新区块来确认这确认这笔交易的合法性。
用户可以通过比特币客户端,用收到的这笔交易和之前已完成的交易作为输入,创建新的交易输出,这样就实现了消费。