2.4.2 比特币支付的实现过程

现在,我要完成:

“从1PaSvGct6nHEhjg888DB6yJzrpGtn3d594

向12h5gJnF5YNq9HV2VvtzVmsVzvC42pcyD支付0.1个比特币”这笔交易。实现步骤如下。

(1)准备:用哈希函数,将原始交易指令压缩成一个简短的摘要,称为“交易摘要”,这是为了便于后面的运算和传输。

(2)签名:用付款地址的私钥跟交易摘要做签名运算,得到“交易签名”。这一步很关键,它把私钥跟交易指令紧密绑定在一起,就好像我们在一张付款支票上签上自己的名字,授权了这笔支出。这个签名运算有些复杂,可以想象成乘法。由于要动用私钥,所以这个过程一定要保密,防止私钥泄露。

(3)广播:把“原始交易指令”、签名通过互联网广播出去。一传十,十传百,几秒钟便可传遍全球。

(4)验证:接收到广播信息的账本持有者验证“签名”是否是付款地址对应私钥与“原始交易指令”进行签名运算的结果。这也是个运算过程,即验证运算。可以看作是签名运算的逆运算,就像除法是乘法的逆运算。但是,不同之处在于,签名运算类似“原始交易×私钥=交易签名”,验证运算本应“交易签名÷私钥=原始交易”,但这样就会泄漏私钥。非对称密码的奇妙之处就在于,验证运算不需要私钥,只要私钥和地址是对应的,“交易签名”与地址[3]进行运算就能够得到“原始交易”,类似“交易签名÷地址=原始交易”。数学上可以证明这种验证完全有效。这是解决我不出示私钥,又能证明我用私钥对交易进行了授权的关键问题。

(5)记账:当账本持有者们验证了签名信息的确经过了付款地址私钥授权的,他们就可以把这笔交易计入账本中了。这样,这笔交易就完成了。

2.5 工作量证明

最后我们研究一下记账的过程。为了实现全球分布式账本,比特币系统约定每十分钟将全球发生的交易记一份新的账页。作为一个开放、开源的去中心化的系统,任何一个人都被允许参与记账,并且为了鼓励人们记账,

记账者可以获得12.5个比特币的奖励,现在是很大一笔财富。为此,每分钟都有成千上万人试图将所有交易记到一份新账页中。他们要做的工作如下。

(1)开启比特币软件,链接到网络。

(2)接收来自世界各地的交易信息。

(3)验证这些交易信息是否经过了付款地址私钥的签名。

(4)增加一笔交易:没有付款地址,凭空给记账者的地址记入12.5个比特币。

(5)将验证过的交易和新币交易(称为Coinbase)整理成一个数据包。

(6)将交易数据、上一个区块摘要和当下时间(即时间戳)一起哈希得到本区块的摘要。

到这里,似乎已经将新账页通过哈希上一个区块摘要的方式加在了新账本上,从而完成了记账工作。但是,仍有3个重大问题存在。

①遍布世界各地的记账者,受到网络传输速度影响,在同一时间接收到的交易是不同的,记账的时间也是不同的。因此,他们记出来的新账页不会完全一样,从而最新账页的摘要(即新区块哈希)肯定不同。那么,分布式账本靠核对大家的账本摘要来对账的关键步骤就无法实现了。

②这个收集、验证和哈希过程非常快,半分钟不到就能完成,根本用不了10分钟。

③如何保证记账者认真地验证和记账,不偷懒,不作弊呢?

中本聪想到的“工作量证明(Prove of Work)”机制解决了这3个问题,并且一并解决了对记账者的奖励问题和新币发行的问题。基本的思路是:增加哈希的难度,让全世界大约每10分钟只有一个人能够哈希出符合要求的摘要,这样的新账页将被所有人复制一份加到自己的账本中。具体步骤是这样的,上述第6步改为如下内容。

(6)将“交易数据”“上一个区块摘要”“时间戳”进行哈希时,加一个“随机数”。

按照哈希函数的性质,加入了一个随机数哈希值就会有变化,变化结果如何无法预知。比特币系统对这个摘要(哈希值)添加一个要求,比如:哈希值的第一位必须为零。如果哈希值是由数字和小写字母构成的,那么不管其他位结果如何,第一位为0的概率是1/36。为了达到这样的目标哈希值,一般换36次随机数,即哈希36次会有一个,平均换18次找到一个。

假设一台电脑哈希一次需要1秒,全球共有10台电脑参与记账,即全网1秒能哈希10次,平均每次0.1秒。

那么,全网找到一个第一位为0的目标哈希值的平均时间就是18次×0.1秒 = 1.8秒。当然,这离10分钟还远,需要提高要求。

当要求目标哈希值前2位为0时,全网平均需要182 = 324次哈希,平均花费32.4秒才能找到前2位为0的目标哈希。

当要求前3位为0时,需要183次哈希,大概183×0.1/60 = 9.7分钟,基本达到10分钟的要求了!

如果我是10个记账者中的幸运儿,我的电脑找到了前3位为0的目标哈希值。那么我要立刻把新区块或新账页广播出去,它包括:带有时间戳的交易数据包;算出的目标哈希值;成功算出目标哈希值的随机数。

其他9个记账者收到这些信息,会立刻验算:收到的交易数据包、收到的随机数和上一个区块的哈希值,放在一起哈希,是否能够得到收到的目标哈希值。如果能够,说明我率先成功了,他们就立刻接受我的新区块哈希值作为上一个区块哈希值,并收集新的未记账交易,寻找新的目标哈希值。此时,我的新区块链就被大家都接受了。也就是说,上述第6步改为以下内容。

(6)将“交易数据”“上一个区块摘要”“时间戳”进行哈希时,寻找一个“随机数”,使得哈希值的前3位为0。

(7)将“交易数据”“随机数”找到的“目标哈希”广播出去。

(8)受到广播的记账者验证新区块后复制加入到自己的区块链上。

这样,一个新区块就诞生了!

经过这样的记账过程,实现了以下任务:

·   整个网络在10分钟里完成了一次记账。

· 10分钟里大家只接受了一个相同的新区块。

· 我发给自己的12.5个比特币被大家认可了。

· 整个网络有了12.5个新发行的比特币。

· 每个记账者都会诚实认真的记账。

竞争会使得全网每10分钟计算花费的成本接近12.5个新币的价值,也就是说10个记账者,10分钟里平均每人为猜目标哈希耗费的成本接近1.25个比特币(竞争的激烈程度将决定成本接近收益的程度,即利润率)。如果某人不愿意接受我的新区块,仍然继续算上一个目标哈希值,当他找到并广播出来的时候,其他人都已经在计算新的区块哈希了,没人接受他的新账页,他给自己的12.5个比特币得不到认可,接近1.25个比特币的消耗就白费了。

不能不赞叹中本聪这个看似粗暴、浪费资源的竞争方法,很好地解决了分布式账本的实现和新币发行问题,尽最大可能消除了主观影响。至此,一个分布式货币系统终于可以运行了!

比特币的发行、减半和总量。从2009年1月3日开始每记一页账有50个比特币奖励,然后按照每记210000个账页(约4年时间)减半的速度递减,大概2013年开始每个区块奖励25个比特币,2017年开始每块奖励12.5个比特币……一直到2140年奖励衰减到小数点后8位都为零了,也就不再奖励了,也就是说比特币系统在没有新币产生了。此时的总发行量大概为21000000个,如图2.6所示。

2.6 密码共识的基本逻辑

理解了比特币实现的技术逻辑,就更加容易理解我们为什么在第一章将区块链定义为密码共识机制。

在比特币的系统中,这些技术组合在一起使得全球范围内的人可以通过去中心化的方式运行一个公共的货币系统。这就是一个典型的大规模去中心化的经济组织。为了消除法币体系所依赖的中心,采用分布式账本取代银行的账本体系。区块链技术实现了大规模分散的对账机制,并增强了账本的安全性。工作量证明机制保证了新增区块的一致性,并提供了人们自觉维护账本安全的经济激励。非对称密码技术实现了大规模人群中无须信任即可确立的个人权利。这些技术组合在一起实现了去中心的全球公共货币体系。

在这个系统中,分布式共识是去中心化的实现方式,它主要体现在分布式账本上,而区块链技术和工作量证明机制进一步保障了分布式账本的可行性。非对称密码技术是把分布式账本这个数字系统跟现实的人结合起来的关键,让掌握私钥的个人或组织有了数字身份,并且能够通过签名和验证进行数字授权,这是分布式共识成为真正的经济系统的关键。为此,我们将这项机制不再称为“区块链”,而是称为“密码共识机制”,或简称“密码共识”。区块链只是其中的一个并非最重要的环节而已。

如果不是为了实现大规模去中心化的经济组织,多数技术是低效的、不必要的。比如,分布式账本在千百万人那里保存一个完整数据库副本是十分浪费资源的;区块链技术只是为了大规模对账才需要把区块不断嵌套哈希,这不仅浪费了资源,而且大幅降低了性能,要等10分钟才能确认,一经确认不可修改丧失了很多经济活动所需要的灵活性;工作量证明机制更是浪费了巨大的算力资源,一个可信组织如央行记账根本无须这种耗费。

只有非对称密码技术和哈希函数即使在小规模的经济活动中也是有用的,比如前面的遗嘱案例。但是,这样的应用早就已经在经济活动中,尤其是被银行系统采用,跟所谓“区块链技术”没有必然联系。

因此,我们再次强调,密码共识机制才是这场冠名以“区块链”的技术和制度创新的实质。它是由非对称密码技术和分布式共识机制实现的大规模、去中心化经济组织模式。