《精通比特币》第五章“交易”解读——区块链基础知识篇
通过本章的学习,我们能了解到比特币交易所包含的信息、交易如何被创建、如何被验证。对于产品和研发人员实现数字钱包的应用功能,有非常直观的借鉴意义。
建议阅读时长:5分钟左右
第1节 交易概述
交易是比特币系统最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络得以传播和通过验证、并最终加入全球比特币交易总帐薄。
通过比特币客户端可以创建并广播交易。比特币交易是一个含有输入值和输出值的数据结构,该数据结构中植入了将一笔资金从指定的比特币地址转移至目标地址的代码信息。比特币客户端会维护一套节点地址列表(即挖矿节点的地址列表),当交易创建完成后,会将交易信息通过比特币网络广播到所维护列表中的节点,节点验证交易有效后,会继续广播至与其相连的其他节点,就这样,一笔交易很快会被所有节点接收到,当矿工通过挖矿将这笔交易加入到新区块、且大部分节点在该新区块的基础上开始工作后,这笔交易就成为了比特币交易总账簿的一部分。
比特币系统并不存储比特币地址的余额,比特币是分散在各个区块交易记录中的,当一笔交易中的收款地址还未用于新的支付时,这个收款地址即对应着一笔可用的未消费UTXO(全称Unspent Transaction Output)。UTXO是比特币交易的基本单位,不可再拆分,就像纸币一样,当一张纸币大于待付金额时,不能将纸币撕成几段,只能整体支付后,再接收找零。
所以比特币交易的输入,是将1个或多个UTXO组合成足额大于等于待支付的金额;比特币交易的输出,是输出新的UTXO到接收方的收款地址中,同时会创建用于找零的UTXO。输入和输出之间的差额即为奖励给矿工的交易手续费。
比特币钱包是如何知道用户有哪些未消费的UTXO用来支付呢?
这可以从”第4章 密钥、地址和钱包“中的知识来理解。当用户刚开始使用一个新的比特币客户端时,可以通过各种方式导入已有的私钥。当导入私钥后,比特币钱包会根据该私钥自动生成对应的比特币地址,然后钱包用这些地址去扫描区块链,得到比特币地址上每个还未消费的UTXO记录。最终比特币钱包客户端本地会维护一套未消费的UTXO数据库,用于支付时作为交易输入。
第2节 交易输出
给某人发送比特币实际上是创造新的UTXO,注册到那个人的地址,并且能被他用于新的支付。
交易输出包含两部分:一定量的比特币和一个锁定脚本。锁定脚本,是用来支付时必须满足的条件,只有满足锁定脚本中的条件,才能动用这笔UTXO输出比特币给其他人。锁定脚本中包含了接收方的比特币地址。
第3节 交易输入
若想支付UTXO,一个交易的输入也需要包含解锁脚本,用来满足UTXO的支付条件。解锁脚本是一个签名,用来证明对于在锁定脚本中的比特币地址拥有所有权。
当用户付款时,钱包需要选择特定的UTXO来满足付款额,比如需要支付1BTC,钱包应用会选择一个包含0.4BTC的UTXO和0.7BTC的UTXO,加在一起用于支付。多余的0.1BTC,客户端可指定作为找零打到支付方的比特币地址中。若指定了奖励给矿工的手续费,这时除去手续费之后剩余的部分也会找零到指定地址。
当然,比特币客户端中维护了一套未消费的UTXO数据库,如何从库里面选择最优的UTXO组合,也是钱包要实现的功能。
说明:矿工的交易手续费,是基于交易的字节长度来计算的,而不是基于交易金额的价值。
所以,交易输入的步骤是:选定最优的UTXO—>为每个UTXO生成解锁脚本—> 当解锁脚本验证通过后—>可正常创建交易输出。
第4节 脚本验证
原书中,讲解了比特币系统中5种标准脚本的原理和使用背景,感兴趣的朋友可以深入学习。本节以P2PKH(Pay-to-Public-Key-Hash)为例,主要讲讲解锁脚本是如何验证锁定脚本的。
比特币网络中的大多数交易都是P2PKH交易,此类交易都含有一个锁定脚本,由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥生成的数字签名进行匹配来解锁。
解锁过程与第四章原理一致,如下:
1.先由私钥生成公钥;
2.将公钥通过哈希算法得到公钥哈希
3.将解锁脚本和锁定脚本组合在一起,比对由私钥生成的公钥哈希与锁定脚本中的公钥哈希是否匹配,若匹配成功,则符合解锁条件;否则无法使用该UTXO中包含的比特币。
第5节 总结
通过本章的学习,我们了解了比特币交易所包含的信息、交易如何被创建以及如何验证是否对UTXO中的比特币拥有支配权。
本章对于产品和研发人员实现数字钱包的应用功能,有非常直观的借鉴意义。
文章首发于公号“Tina说”