《比特币白皮书》解读(二)
比特币的流通
按常理来说,货币发行是货币流通的起点,先发行,才可以进行交易。但是中本聪在论文里却是先讲交易机制,再提比特币的产生,这当然是有原因的,且先不表,我们先跟着中本聪的思路来理解一下比特币的交易机制。
说到电子货币的交易,中国大部分年轻人基本都已步入无现金时代,对电子货币肯定不陌生,日常用度全都能通过扫码解决。不同于纸币实实在在的物体,我们对电子货币的感知大概就是打开手机银行或支付宝看到的一串数字:如果买个Switch,账户余额会减少2000块,而等到工资到账,余额又会随之上涨。但是我们没有感知到的是,为了保证这一串数字的准确性和安全性,这个承担信任的第三方(银行或者支付宝等)需要付出的巨大代价。
而没有中心化机构担保的比特币作为交易媒介和支付手段,如何确保交易的准确性和安全性呢?简单来说,就是通过加密算法确保交易信息不可被篡改,通过时间戳来确保一笔钱不会被花两次(double-spending, 也称为双花)。
交易过程
下图是中本聪设计的比特币的交易过程,在当前的拥有着(Owner 2)将这笔资金交易给下一个拥有者(Owner 3)时,会同时记录上一笔交易,也就是Owner 1 将其交易给 Owner 2 时的发生的交易。这样每一笔交易都可以向上不断追溯,保证交易是价值的转移,而不是信息的变更。
Owner 2向Owner 3转账,Owner 2是价值的损失方,如何保证这笔转账真的是由Owner 2本人发起,而不是其他人(例如Owner 3)冒名呢?这就涉及到比特币交易的非对称加密机制了。非对称加密是密码学的一种算法,它需要一对密钥,一个公开密钥和一个私钥,一个用来加密,另一个用来解密还原信息。回到上面这张交易图,Owner 2想要转账给Owner 3,需要用Owner 2的私钥进行数字签名,而这个数字签名只能够通过Owner 2的公钥进行解密和校验,验证通过就可以证明该交易是由Owner 2的私钥持有者发起,从而确保交易的真实性。比特币钱包的地址就是公钥,而私钥由每个用户自己妥善保存,一旦丢失或泄露即等同于钱包遗失。
_补充知识点:
- Hash:哈希算法,又称散列算法,是一种从任意文件中创造小的数字“指纹”的方法。与指纹一样,Hash就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。因为其不可逆性,经常用于给高安全系数的内容进行加密保护。1比特币用到的是SHA-256算法。_
如何防止双花
第二个问题是怎么确保A转给B的这笔钱之前没有转给其他人,也就是double-spending。这就涉及到了比特币的另外两个典型机制:UTXO和时间戳。
UTXO:比特币到底怎么存在
从广义上来看,比特币跟其他的钱在功能层面上其实是一致的。当你看到你的比特币钱包里有50个比特币的时候,你可以认为是你的账户上存有50个币,你可以用它消费,用掉10个还剩40个,就跟银行账户里的钱一样,只是数字的加减游戏。这样理解没有问题,但是,如果我们还想要进一步理解比特币系统的运行机制,就得抛掉这个常规理解了。
对于比特币的“币”,中本聪是这样定义的:
We define an electronic coin as a chain of digital signatures.
这句话理解起来不太容易,跟我们常规对货币或者电子货币的概念认知非常不同。我们先来看看比特币的记账方式。
常规交易的记账方式:如果A和B之间发生一笔交易,A需要支付100元给B,得到A的支付确认之后,A的账户-100,而B的账户+100元。想象一下这时如果并发多笔交易,同时有10个人给B转账,那么B账户的变更就只能串行起来:+100 -200 +300 +100 …,一笔交易入账才能进行下一笔交易。
而比特币记录的交易信息是这样的:钱包A(A的公钥)向钱包B(B的公钥)转账3.1415个比特币。这时如果有多个对B账户的转账并行,记账完全可以独立并行。
前面提到每一笔交易会记录一串签名,标识了这笔钱的来龙去脉,而这一串加密的交易信息则可被看作一个“币”。比如上面这个例子中,B所得到的这个币的金额就是3.1415。那我怎么才能知道我一共有多少钱呢?这个余额到底以什么样的形式存在?这里需要引入一个新的名词来说明——UTXO。
UTXO是 unspent transaction output 的缩写,顾名思义,也就是未花费的交易输出。还是上面这个例子,这笔交易被记录,也就是B得到一个UTXO,数量是3.1415,如果B再给C转账2个比特币,这时,这个3.1415的UTXO就会转为input被删除,同时又生成两个新的UTXOs,一个UTXO为2,到了C的钱包,另一个为1.1415,作为找零回到B的钱包。所以不断的交易往来之后,一个账户(公钥)所拥有的UTXOs总额可被视为这个钱包里的余额,这个余额大小是否够支付一次交易会在交易时进行判断。
时间戳的区块链
如果我们想知道是否有交易未被记录,唯一的办法就是记录所有的交易。例如传统是由银行记录所有交易,由银行来决定哪笔交易先发生就生效。失去银行这个记账的第三方,比特币使用的是全网广播的机制来记录交易。也就是说一旦钱包A向钱包B转账3.1415个比特币的交易完成,就会向全网发送一条广播,抢到记账权的节点会验证这条交易的有效性,也就是确认这笔资金之前是否已经被花出去,然后进行记录。
A账户余额10个币,同时向B和C转账10个币,如果A往B转账的交易先被记录,那么A向C转账的交易即使广播出去,也不会被记录。
比特币的每笔交易都是任意点对点的,为了更好地记录所有交易,比特币系统创造了区块这个概念。可以将区块链想象成被时间串起来的一个个盒子,每个盒子里装的是一定时间内(大约十分钟)全网每一笔交易的信息。每装满一个区块,就会将区块交易打包成一个带有时间戳的hash进行广播,然后紧随其后生成新的区块。
Question:怎么确保在全球范围内使用统一的时间来记录交易发生的先后顺序?
总结
回顾一下整个交易流程,通过非对称加密,确保交易双方点对点的交易是真实不可被篡改的;通过区块链的记账,确保每一分钱都可被溯源;通过时间戳确保同一笔钱不会被花两次。也就是说,比特币以信息化的方式成功模拟了真实世界中价值转移的过程,非常牛逼。