区块链:看得见的信任
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第四节 币来币往

“挖矿”成功后,比特币网络中的其他节点会验证是否真正成功,一旦验证通过后,成功节点就获得了比特币交易的记账权。记什么?记上一次记账后到这一次记账时比特币网络中发生的所有比特币交易。每次记账完成后,记账者会获得比特币奖励,比特币就是这么来的。所以,“挖矿”竞争的是记账的权力,比特币只是对竞争胜利者的奖励。

搞清楚了比特币怎么来的,那么比特币到底长什么样子呢?前面说过它不是纸币和硬币,只是存在于计算机和网络中的一串符号。那么,它就像银行账户里的那些数字吗?那些数字同样也代表你拥有的财产——我们当然希望那些数字越大越好。

比特币被挖出来后,可以存放在比特币钱包里。什么是比特币钱包?想想现实生活中我们的钱包用来装什么:现金、银行卡、钥匙、照片、公交卡……比特币钱包当然装不了那么多,它主要装比特币地址、私钥、比特币交易记录。比特币钱包是一种计算机程序,用来保存和管理上面提到的比特币地址、私钥和比特币交易记录。

比特币钱包里的比特币地址是什么?人民币上面可没有印钞厂的地址,也没有中国人民银行的地址。银行卡上面也没有地址,只有网址和400开头的电话。比特币地址就可以被理解为存放比特币的账户号,就像钱包里的银行卡号一样,这个号码代表你在某个银行的账户,如果其他人需要向你转账,他需要你提供银行卡号。同样的,比特币交易时的比特币地址就是你接收和转出比特币的账户号,它不是完全由数字构成的,通常还夹杂着大小写英文符号,比如1CkrtudPutvD3LrstXoqQ42tT6AKRw0YB6,这显然比银行卡号难记多了。就像一个钱包里有多张银行卡一样,比特币钱包里也可以有多个比特币地址,即多个比特币账户,这样你可以把不同用途的比特币分开:家用、老婆给的零花钱、私房钱……

银行卡号是开卡时银行给的,车牌号和手机号倒是可以自己选吉祥号,那比特币地址怎么产生的?可以自选吗?(这里会涉及私钥和公钥两个概念,后面章节有详细说明。)在比特币系统中,私钥与比特币地址密切相关,它是利用随机数生成器产生的,虽然是你要求生成的,但基本上没法选吉祥数。私钥非常重要,不能告诉别人,因为你的身份、比特币交易等都会用到它。这有点类似于银行卡的密码,你从卡上取钱需要输入密码来验证你的身份,表明这个账户确实是你的。私钥产生后,经过运算转换成公钥,然后再经过一系列复杂的操作,变成你用来存放和交易比特币的比特币地址,就像你的银行账号一样(当然,银行账号和密码之间通常没有任何关系)。设计出这么复杂的操作就是为了不让黑客通过比特币地址倒推出你的私钥。

有了比特币地址后,就相当于有了接收比特币的账户,这个账户可以存放比特币。于是,有人就会在网上公布自己的比特币地址,用来进行比特币交易。你马上就会想到安全问题:既然我的比特币地址都是公开的,那里面的比特币会不会被别人盗取呢?毕竟目前比特币这么值钱。但是,你会担心你银行卡中的钱被人盗取吗?不会,因为有密码的保护。同样的道理,比特币钱包里有你的私钥,并且一个比特币地址实际上是与一个私钥对应的(上面讲过,私钥经过一连串令人眼花缭乱的变化转换为比特币地址)。只要你的私钥足够安全,你的比特币也是安全的(实际上,量子计算机出现后,传统私钥很快也不安全了)。

而比特币交易与常见的交易类似,无非就是你给我多少比特币,我给其他人多少比特币。交易过程中不会增加或减少比特币的数量,总数保持不变,变的只是比特币在不同用户之间的分布。传统的交易一般采用“账户/余额”模式,银行账户、股票账户等都是如此。这种模式中,A和B之间的交易过程可以看作是在A的账户中减掉交易数额,然后在B的账户中加上交易数额的过程,交易完成后A和B的账户余额都会发生改变。

比特币交易则采用了另外一种模式——UTXO(Unspent Transaction Output,未消费交易输出)。下图给出了一个例子,在这个例子中,Alice需要给Bob转账10个比特币。因为Alice正好有10个比特币,所以转账完成。于是我们可以看到交易记录的“输出”中有了一条记录记录了Bob的比特币地址和转账数额10。然后Bob给Carol转账了8个比特币,你会发现在交易记录的“输出”部分有两条记录:一条是转账8个比特币给Carol,另一条是转账2个比特币给Bob。等等!什么叫“转账2个比特币给Bob”? Bob不是向Carol转账吗?

图2.5 比特币交易示例

是的,Bob向Carol转账了8个比特币,他又收到自己给自己转账的2个比特币。这是什么意思呢?举个日常生活中的例子,有次在医院的时候,护士要求我必须用现金支付1元钱。可是当时我只有一张100元的纸币,护士说没有零钱找补,坚持要求我付1元。于是我只好去小卖部用100元的纸币买了瓶水,小卖部找补了98元零钱。我终于可以按护士的要求支付现金了。比特币交易与之类似,你只能每次都把拥有的没有消费的某一笔比特币全部先转账出去,然后再把多余的部分转回来。这个过程中,没有消费的那笔比特币就像纸币一样,你没法将纸币撕开只付给对方一部分,只能先全部给对方,然后对方再找补给你。这和“账户/余额”模式不同,后者实际上是可以按照转账数额随意分小的(当然有最小单位,比如到一分钱)。看上去比特币交易更类似于日常生活中使用货币的方式,此处不讨论UTXO模式和传统“账户/余额”模式的优缺点。

在比特币网络中,随时都有可能进行这种一个比特币地址到另一个比特币地址的转账交易,这些交易均需记录在案,最终形成比特币账本,即整个比特币网络中每一笔交易的明细。

图2.6 比特币账本示例

一个比特币网络的账本由一个个区块构成,每个区块中保存了若干交易记录。区块间通过一种机制串联成一条链,称为“区块链”,实际上整个链就构成了有时间先后顺序的交易记录流水。这种结构有点像本流水账,如果我们以“天”为单位来组织流水的话,每天的流水明细就构成了一个区块,每天的流水明细按“天”记录在账本上就构成了整个流水账。显然,每天的流水明细可能多也可能少,区块也一样,可能这个区块交易多点,另一个区块交易少点,因此大小不会完全相同。

那么,区块是怎么产生的呢?比特币网络的区块大约是每十分钟产生一个,区块中就记录这十分钟内的所有交易。为什么是十分钟?让我们回忆一下“挖矿”的过程,“挖矿”实际上是进行哈希计算,比特币系统在设计的时候就估算了当时网络中所有的计算能力,将哈希计算的难度值设定为大约每十分钟能够完成计算,也就是大约十分钟产生一个区块。随着“矿机”计算能力的不断提高,如果难度值不改变的话,完成哈希计算的时间会小于十分钟,这个时候就需要调整难度值,使哈希计算的速度基本上保持在约十分钟能够完成。

比特币“矿机”拼命地计算,大约每十分钟就会有某台“矿机”比其他的先计算出来,成为优胜者。优胜者需要做的工作就是将这十分钟内的所有比特币交易全部打包记录在一个区块中,然后把这个区块链接到区块链上,经其他“矿机”验证无误后,再获得系统给予的比特币奖励。然后,下一轮十分钟的计算竞赛又开始了,全世界的“矿机”又拼命计算以获得这一轮的记账权,从而获得记账奖励的比特币。完整的比特币交易及获取过程如下:

①Alice发起转账10个比特币给Bob,同时会向比特币网络中的所有用户(如Carol、Dave和Eve)发送本条转账信息;

②Carol、Dave和Eve接收到此信息后,会确认Alice是否有10个比特币可以转账;

③大家确认Alice可以完成转账后,会把转账信息暂时先保存在各自的计算机上;

④Carol、Dave和Eve开始疯狂地“挖矿”;

⑤Eve获得胜利;

⑥Eve把这段时间内的所有交易记录(包括Alice转给Bob的)打包放到一个区块里并链接到区块链上,同时通知Carol和Dave确认他做的工作的有效性;

⑦Carol和Dave默默地确认了Eve工作的有效性,本轮“挖矿”比赛结束;

⑧Eve获得了比特币奖励。Alice、Bob、Carol、Dave和Eve转入下一轮“挖矿”比赛。