
通过前面的学习和实践,相信你对比特币已经有了一定的了解,在使用了比特币钱包之后,你已经推开了比特币的大门。如果说比特币是一家银行,那么它应该具备两个基本功能:发行货币和记账,今天我们的任务是初步的探索一下它的记账能力。
从技术角度,说起记账,你可能会联想到商业的Oracle数据库,或被广泛使用的MySQL,比特币是一个去中心化系统,它不可能利用这些软件进行记账,但由于记账是比特币的核心能力之一,同时它又被称为分布式账本,所以很多懂技术的人会把比特币理解成一个分布式的数据库。
逻辑上,数据库是类似于Excel或Numbers的表,它的基本单位是行(Row)或记录(Record),在“比特币数据库”中,没有抽象的行,取而代之的基本单位是具体的交易。下面,我们由表及里的从交易入口、交易原理两方面进行学习。
交易入口
比特币系统的用户界面(User Interface)就是它的钱包,上一篇我们介绍过,钱包上的交易二维码(或其对应的地址)即是交易的入口,我们来看下这个二维码背后会藏着怎样的信息。
假设你去一家可以接受比特币付款的咖啡厅买了一杯咖啡,收银员会打印一张收银单给你,在这个单子上有一个二维码,意思是你可以通过扫描这个二维码来付款,例如下面这张:

通过钱包扫描这个二维码,你可以看到支付金额,收款地址,以及一些附加信息,例如“Bob's Cafe”这样的描述字样。注意,如果你扫描了上面的二维码,千万不要点付款,否则你的币就丢了。

实际上,扫描二维码后,钱包程序会给你解析出一堆字符:
bitcoin:1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA?amount=0.015&label=Bob%27s%20Cafe&message=Purchase%20at%20Bob%27s%20Cafe
这些字符中包含了发起一笔交易所需的信息,看不懂这串字符也没有关系,如果你使用过BT下载的话,下面这一串字符你一定不会陌生
magnet:?xt=urn:btih:2570CE2EA93F7D44277F0A694D01A0896033D7CE
没错,这是BT磁力链的地址,有没有发现这两个地址很相像,是的,因为比特币本身也是一种p2p网络,所以它的协议(节点之间通信的规则)也遵从了p2p的设计原则。也许你会问,比特币的p2p网络有什么作用?它和传统的p2p有什么区别?
除了之前说的防止数据损坏、防止被恶意攻击之外,p2p还起到扩散交易的作用,一笔交易很大程度上不是点对点的传输,而是接收到交易的节点,验证了交易的正确性后,将交易转发给与之连接其他节点,这种传播方式也正是我们常说的“病毒式”传播,一笔交易在短短几秒钟之内就可以传播到整个网络。
回到刚才的那串付款码,通过其他节点对其解码,会得到以下信息
- 收款端比特币地址: "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA"
- 付款金额: "0.015BTC"
- 地址对应的标签: "Bob's Cafe"
- 付款所需的描述: "Purchase at Bob's Cafe"
交易原理初探
比特币交易的设计来源于会计中的复式记账(Double Entry Bookkeeping),复式记账是一种高效的便于统计各个业务的记账手段,其中的借贷法需满足以下等式:
Asset(资产)+ Expense(支出) = Liability(负债) + Equity(所有者权益)+ Income(收入)
据我理解,等式左边可看做一家公司的总资产或总债务(即debits),等式右边为资产或债务的来源(即credits——意为有信用别人才会借债给你)。交易账本分两部分,左边部分Debits和右边部分Credits。当等式左边项的值增加时,我们在账本的左边部分(Debits)进行记录,当等式左边项的值减少时,我们在账本右边(Credits)进行记录;相反,当等式右边项的值增加时,记录Credits部分,而当等式右边项的值减少时,记录Debits部分。是不是被我绕晕了,我开始接触这个概念时也是一样的感觉,我们把它和比特币结合起来看一下吧。
假设比特币是一家银行,从这个角度看过去,当交易发生时,花钱的一方相当于用钱兑换了等值物,比特币这家银行的负债减少了(等式右边),此时会在Debits部分(账本左边)记录一笔;与此同时,收款的一方相当于给“比特币银行”带来了新的负债,负债增加(等式右边),那么需要在Credits部分(账本右边)也记录一笔。账本的Debits和Credits分别对应了交易的Inputs和Outputs。
复式记账需满足左边Debits和右边的Credits相等,这样就不会少账,Debits和Credits下可以记录不同的业务(上面的等式中包含5项业务),这样就可以很方便统计不同业务的财务状况,在比特币中,业务即对应着每一个比特币地址,所以,通过一个简单的数据结构就实现了为所有人记账的功能。看到这里,你应该会感叹一下人类智慧的伟大了吧!(这一部分内容并不容易理解,没关系,你可以先看下文后的参考链接,然后再回过来看这段文字,如果还有疑问,请给我留言。)

上图是一笔交易举例,虚线左边是输入(Debits),右边是输出(Credits),可以看到输入之和几乎等于输出之和,不是说应该完全相等吗?为了奖励矿工做出的交易确认和写入账本的工作,交易过程中会产生一笔隐形的交易费用,这笔交易费用不作为输出明确的列出来,在这个例子中,该交易费用为0.05BTC。
对照着复式记账,我们来看一笔真实的比特币交易会包含了什么信息

上图包含三笔交易,以中间的交易为例,可以看到一笔交易中,包含了
- 一个交易ID:
0627052b...c2f2
- 输入:新交易的输入就是旧交易的输出,还包括原拥有者的数字签名
7957a...6f18:0
- 输出:输出会指向新拥有者的地址,该例中,输出产生了两个地址,另一个是用来找零的
- 交易费用
新交易的输入是旧交易的输出,这说明了比特币是一种价值链条,价值永远从一个人转移到另一个人;为什么输入要包含消费者的数字签名呢?这是为了让这笔交易可以被验证——交易者用私钥进行签名,而系统用公钥来验证签名的正确性——证明确实是这个人花的,而不是别人花的。
最后我们再回到钱包,当一笔交易完成后,你钱包中的余额会产生变化,这又是怎么做到的呢?通过上文,这个现象就比较好解释了,因为每笔未使用的交易输出中(Unspent Transaction Output, UTXO),都对应一个地址,钱包程序只需收集自己地址的UTXO,并将它们累加,即可算出余额。
总结
在这篇文章中没我们以一笔交易的生命周期为脉络,从发起一笔交易,谈到了比特币中的交易原理,介绍了会计中的复式记账法,并通过例子描述了一笔具体交易的形态,最后当一笔交易结束时,用户会有什么感知。如果不想深入到交易的实现细节,我想你看这篇文章就刚刚好。
参考
- 复式记账(复式簿记)的基本原理:https://www.zhihu.com/question/20718557
- 从单式记账到复式记账:https://sspai.com/post/36607
相关文章:
我建立了一个收费的知识星球,在这里,我会为大家营造一个沉下心来学习的环境,在今年,我至少会做三件事情:
- 精通比特币的实现原理
- 精通EOS的实现原理,并着手在EOS上建立应用
- 学习其他项目的白皮书,寻找有创意、有价值的项目
以上内容会不定期的输出分享,同时也会在能力范围内解答同学的问题,期待你的加入

网友评论