假如你接触比特币够久,你一定听说过比特币是个区块链,一个区块里包含许多买卖,而买卖都是链在一起的。那么,具体买卖的细节如何?一般的技术文档都充满了术语,即使是中本聪的白皮书也难以直接联系实际,我最近又仔细研究了一下,这儿用一种简单的比方来解说下
比方说你的钱包里有三个地址A,B,C。你在地址A有1个币,你在钱包软件里把币发送到地址B,能够在区块链上查到这笔买卖,无妨叫做买卖甲。然后你又做了一笔买卖乙,把币从地址B发到地址C。假设手续费是0.0001个币,每次发送你都花了0.0001个币作为手续费,那买卖甲被确认后地址B便是0.9999个币,而买卖乙被确认后地址C里便是0.9998个币
买卖甲:地址A 1BTC -> 地址B 0.9999 BTC, 手续费 0.0001
买卖乙:地址B 0.9999BTC -> 地址C 0.9998 BTC,手续费 0.0001
用账簿的比方最好了解
账簿便是区块链,账簿的每页纸便是区块,这些纸依次装订在一起形成了一整个账簿。每页纸上贴满了一条又一条的汇款单(买卖)
假如仔细观察汇款单买卖乙(把0.9998个币从地址B转到地址C,并付0.0001手续费),你会发现买卖乙是由两大部分组成,前一部分可称为付款信息(input),后一部分可称为收款信息(output)
按一般在银行填汇款单的习气,付款信息里该填支出账户名(也便是地址B)和账户所有人签名(授权买卖),而收款信息里应该填金额和收款方账户名(也便是地址C)。事实上,比特币买卖也大致是这么写的,只要细微差别
买卖甲
付款信息:签名 + 公钥A(签名相当于盖章,是用地址A的私章(私钥)产生,而地址A的公钥可用于让其他人验证这个章是否有用 (私钥公钥加密原理处处都有))
收款信息:0.9999 (金额) + 地址B + 实现条件 (这儿的实现条件注明了未来要花地址B的币需求满足何种条件,下面有详述)
买卖乙
付款信息:签名 + 公钥B
收款信息:0.9998 + 地址C + 实现条件
买卖丙
付款信息:签名 + 公钥C
收款信息:0.9997 + 地址D + 实现条件
有几点和银行汇款单不同的地方
第一,每个汇款单都是花前一个汇款单的收款地址里的币,这样所有买卖就一个个链结在一起,而假如要彻底核实某笔买卖丙是否有用,就要顺着这个链一直回溯到最原始的挖矿产出买卖(在买卖甲之前还有别的买卖),这样确保了只要用户有区块链的完好拷贝(也便是现在全节点的那60G数据),就能够独立验证任何一笔买卖的有用性
第二,每次汇款只能彻底将支出账户里所有的币都花掉。以买卖乙为例,汇款完成后本来的地址B就空了。假如只想转一半的资金到地址C,剩下的那一半就要在收款信息里另外填一个账户地址E,也便是所谓的找零地址
第三,总汇款金额小于地址B的部分便是手续费。假如地址B里有0.9999个币,汇款到地址C的金额是0.9998个币,那中心的差额0.0001便是矿工的手续费
第四,验证买卖乙是否有用,是靠上一个买卖即买卖甲的收款信息中的实现条件来确保的。能够有多种规则,现在最常见的两种便是提供收款地址的签名 (P2PKH)以及提供一段程序的哈希值(P2SH,这个涉及到哈希,一种防伪的手法)
假如你彻底看懂了,那你对比特币买卖的功能了解,就接近于core程序员的水平了,今后碰到许多名词如scriptSig (签名+公钥) 和scriptPubKey(实现规则)之类你就很简单知道那都是汇款单上的哪个部分了
这儿还有个较为杂乱的概念即签名,我另外独自发文分析,这个签名和最近的火星文阻隔见证有密切关系