一文读懂区块链之——比特币算法探秘

bitcoin

  区块链、比特币、挖矿等新型词汇也许大家都听说过,不过对其中的原理不甚了解,感觉既高级又神秘。本文就带领大家从简单的计算机知识开始,一步步探索比特币背后的原理以及实际操作的过程,揭开比特币神秘的面纱。

  本文提出了一种通过“点对点分布式的时间戳服务器,来生成依照时间前后排列并加以记录”的电子交易证明,使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的第三方金融机构。

  这是中本聪在比特币白皮书中的一句话。比特币系统产生于2009年的全球金融危机后,虽然没有法定货币(法币)那样的中心银行,但比特币也有一套自身的发行、交易和确认机制,它提供了一种匿名和去中心化的电子货币解决方案。如今十几年过去了,当初看似毫无价值的比特币现在已经炒到了超过13,000美元一枚,最初买比特币的人也已经实现了财务自由。比特币虽然没有中心机构来对交易进行管理,但巧妙的设计却使得全网络都愿意为之尽力,看似毫无意义的哈希运算却让数以亿计的设备不分昼夜的运算(甚至有公司研发了很多专门的比特币矿机)。那么比特币究竟是怎么产生的呢?挖矿又是一种怎样的运算?转账交易又是由谁来进行处理和记录的呢?其背后的原理不能不说是值得学习的。

前置知识:简单的加解密基础

  为了弄懂比特币背后的原理,需要一些最简单的密码学知识:

  哈希函数:可以简单的理解为一个单向函数,即已知字符串x,可以很容易地求出hash(x)。但是已知hash(x),却很难求出x(除非一个个遍历)。哈希函数并不是一个一对一的映射,一般来说输入是不定长度的,而输出是固定长度的(比如256bit)。对于不同的输入,可能会得到相同的输出(当然,这样的概率是很小的)。

  sha256:一种信息摘要算法,简单来说,就是一种哈希值长度为256位的哈希函数,给定任意输入会得到256位的输出。它的计算方法是固定的,无论谁计算都会得到相同的结果。比特币使用的哈希算法就是sha256

  对称加密和非对称加密:对称加密就是使用同一个秘钥加密和解密,而非对称加密使用公钥加密,私钥解密。

  公钥和私钥:每个用户都有一个公钥和一个私钥,称之为公钥-私钥对。私钥是自己拥有的,不会透露给别人,而自己的公钥是告诉别人的。用私钥加密的信息可以用公钥解密,同样,用公钥加密的信息也可以用私钥解密。假设我要给对方发送一封加密的电子邮件,那么我就使用对方提供给我的公钥对邮件进行加密,对方收到邮件后再使用自己的私钥进行解密。这样,即使邮件在发送途中被其他人窃取,也会因为没有用于解密的私钥而无法获取邮件的真实内容。

  公钥和私钥的另一种用途是验证身份。虽然收到了邮件,但是对方并不能确认是我发出的(因为每个人都可以用对方的公钥来加密来给对方发邮件)。于是,我在发送邮件时会使用我自己的私钥对邮件的摘要进行签名,对方收到邮件后用我的公钥解密签名,如果解密的摘要与邮件内容相符,则能够确定发件人确实是我。

挖矿与哈希运算:比特币是怎么产生的

  在中本聪的论文中,区块链中的每个区块的数据结构是这样的:

  图中Prev Hash是上一个区块的sha256哈希值,而Tx是一些交易信息(某个账户给另一个账户转了多少比特币),Nonce是一个随机数,而这个数的值是未知的,需要大量的算力去解一个哈希方程,而找到正确解的概率又是非常非常小的,这也就是我们通常所说的挖矿。

  具体要解的哈希方程是这样的:由于Prev Hash和交易信息都是已知的,所以要找这样一个Nonce,使得当前整个blocksha256值的前n位全是0,也就是类似0x0000000000000000000bb3e1c36b33c27e1246adfa962daabe2e5ef00e49f1fb这样的哈希值。这里的n值并不是固定的,每2016个区块会调整一次,也就是调整难度,使得每个区块产生的时间不会随着全网算力的提高发生太大的变化。

  当有一台机器找到了这个方程的一个正确解(哈希函数可能有多个正确解)以后,他会向全网广播,于是一个新的区块产生了,而正确解的发现者会得到这个区块全部比特币的奖励(刚开始是50个,每隔4年会减少一半),其他人则无法得到任何奖励。随着一个新区块的发现,大家立即放弃旧的区块,转而投入到用新区块的哈希值再挖下一个区块的Nonce,全网大约每10分钟产生一个区块(有点像买彩票,不过有人中奖就会马上进入下一期)。

  下面的图片是笔者写这篇文章的时候被挖出的区块,可以看出现在能挖出比特币的都是一些大矿池,已经几乎没有个人用户了。当前根据全网算力计算出的难度大约是十六进制的哈希值前19位为0

  (数据来源 http://btc.com)

  比特币的总量是固定的2100万个,那么这个数字是怎么算出来的呢?我们知道刚开始的时候产生一个新的区块奖励50比特币,这个数字每4年会减少一半,而全网算力大约10分钟产生一个新的区块,那么在刚开始的4年,总共可以产生4 × 365 × 24 × 6 × 50 = 10,512,000个比特币,也就是1050万个比特币,这是全部比特币数量的一半,因此比特币的总量为2100万左右。下面这个表格大致可以看出比特币产出的时间线。

年份 每个区块(10分钟左右)产生的比特币数量 剩余的比特币数量
2008年前 21,000,000
2008-2012 50 10,500,000
2012-2016 25 5,250,000
2016-2020 12.5 2,625,000
2020-2014 6.25 1,312,500
2024-2028 3.125 656,250
2028-2032 1.5625 328,125
2032-2036 0.78125 164,062.5
2036-2040 0.390625 82,031.25

  到2040年左右,99.6%的比特币都会被挖完。事实上,即使现在一个比特币能卖到上万美元,随着比特币的不断减产,如今比特币挖矿也很难再赚到钱了。

  为什么要有矿机和矿池?用自己的电脑挖不到比特币吗?

  理论上是可以的,只不过需要很久很久。假设我们有一块Intel i9 9900cpu(sha256用显卡计算不会更快),它的算力是100kh左右。那么我们在全网算力的竞争力如何呢?下图是一个算力的单位表:

单位/hash 数量级 速度
K 1e3 每秒1,000次哈希
M 1e6 每秒1,000,000次哈希
G 1e9 每秒1,000,000,000次哈希
T 1e12 每秒1,000,000,000,000次哈希
P 1e15 每秒1,000,000,000,000,000次哈希
E 1e18 每秒1,000,000,000,000,000,000次哈希

  笔者写本文时,全网算力为135EH左右,也就是135EH的算力平均每10分钟能挖到6.25比特币(注意2020年是比特币减产年),而我们的算力是全网算力的1350000000000000分之1,就算我们不考虑全网算力增长的问题,平均也需要135000000000000010分钟,也就是25,684,931,507年左右才能挖到比特币。但是我们电脑的寿命不可能有256亿年那么长,更何况随着不断减产100年后就只剩下不到1个比特币没有挖完了,因此实际上用自己的电脑是不可能挖到比特币的。

  由于挖到比特币的人可以获得所有的奖励(现在是6.25比特币左右,将近10万美元),而其他的人则颗粒无收。这样对于算力少的人来说风险太大了(要么一次赚10万美元,要么赚不到任何钱,和买彩票差不多)。于是矿池产生了,它集合了全网上大量的算力一起挖矿,比如F2Pool有全网12%左右的算力,那么它平均每83分钟就能够挖到一次比特币,这样收益是十分稳定的。然后,再根据大家贡献的算力多少分配挖到的比特币(当然,矿池也是有一定的抽成的)。

算力的战争:最长链有效与51%攻击

  根据上面的描述,我们知道了第一个找到正确Nonce的(也就是挖到矿的)机器能够获得新区块全部的奖励。这里有一个问题,如果有多个机器都声称找到了同一个区块的正确Nonce,那么以谁为准呢?(如下图所示)

  

  每个声称正确的结果都会被进行校验(注意校验是很容易的),如果计算结果都是正确的,那么这两个结果暂时都会被保留,称之为分叉。随后,比特币是认最长链的,红绿这两个区块,谁先有子区块,变成最长链,谁就会胜出。而另一条路径上的区块就会被抛弃,就像它从来没存在过,奖励也没有了,其中包含的交易重新回到交易池,等待后续的区块来打包。

  

  在比特币系统中,一个攻击者是无法凭空创造价值的(因为无法说清来源,大家不会承认),也无法掠夺别人的比特币(因为没有对方的私钥)。虽然只能进行合法的交易,但是仍然存在一个潜在的安全性问题:对已经转出的比特币抵赖。假设有某个人掌握了全网超过51%算力,它先向别人转出大量的比特币进行套现(比如兑换成美元),然后在之前未进行这项交易的区块上开始用51%的算力挖矿,由于算力超过全网其他的算力总和,它很快就能挖出一个最长链,于是大家的共识都会认可这个新产生的最长链,而将原来的交易作废。转出去的比特币就又回到了自己的手中,但是美元已经套现,对方就只能追悔莫及了。

  然而,这种攻击只是在理论上可行的,实际上却是一种不明智的选择。因为在比特币的激励系统中,如果一个人掌握了51%的算力,那么他与其通过欺诈以偷回之前支付的款项(即双重支付攻击),还不如通过挖矿获取生成的新比特币(因为他可以获得比其他所有人联合起来更多的比特币)。既然按照规则行事更加有利可图,那么破坏系统来为自己谋利也就失去了意义。

匿名身份的交易:一种新型的隐私保护方式

  比特币的另一个魅力在于它的匿名性,在传统的交易中,虽然交易信息和交易双方的身份信息对于公众都是不公开的,但是第三方金融机构(银行,在线支付app等)却可以获取到所有的交易记录。为了防止洗钱、逃税等经济违法犯罪行为,所有人的金融行为都会被记录下来进行分析,而银行卡又绑定了个人的身份信息,因此你的每一笔存款、取款与转账实际上都处在中心机构的监控之中,毫无隐私可言(如下图所示)。

  而比特币是由黑客和无政府组织者提出的一种身份完全匿名的交易方式,你的比特币账号不会绑定任何的身份信息(身份证、邮箱、手机等),甚至连用户名和密码都不能自己设置(因为根据设置用户名和密码的习惯也可能会暴露出身份)。唯一能够证明对账户拥有权的就是在申请比特币账号时随机生成的256位私钥,它是长这样子的:

KwHXUjdvqECm4DMAHo3kUiKxXw6bMHG7LNvj8XkLwC8UNa4q4Vuo

  拥有了这串代码,就等于拥有了这个钱包中的所有资产。在比特币系统中,账户之间的转账信息都是对所有人公开的,但是每个账户的主人身份都是未知的。例如,下图是笔者写作时高度为654,320的块所记录的一些交易信息(所有的交易信息都可以在btc.com上查到)。

  可以看到比特币的每一笔交易都可以查询的到。由于比特币匿名的特性,能够避免市场的监管,因此在一些非法活动(暗网交易、勒索软件等)中,比特币都是默认和唯一的支付工具。

去中心化的服务:比特币块信息是如何存储的?

  比特币的完整交易记录在全世界的几个大型结点上存储,每个节点都保持完整的副本(现在大约200G左右的数据,并会不断增长)。区块链会自动同步和验证所有节点的事务。分类帐对所有参与成员都是透明的且可验证,无需中央授权或第三方验证服务。

  下图是全球一共的10,000个左右的结点的示意图,他们之间会互相同步和校验,以确保整个系统的正确性。

  (数据来源 https://bitnodes.io/)

  至于每个个人用户,则不需要存储所有的200G数据,而只需要在挖矿时使用每个块的头数据(约80k左右)

回归理性分析:比特币的优势与缺点

  说了这么多,那么比特币有哪些优势和缺点呢,我们来一一分析一下:

  优势

  ① 去中心化存储,节点之间相互校验,保证整个系统的正确性和容灾性;

  ② 完全的匿名交易,不用担心身份信息的泄露,比特币的发明者中本聪本人的真实身份直到如今还是一个谜;

  ③ 比特币是在全球金融危机时提出的,它的发行和交易是基于对算法而不是对权威机构的信任,一定程度上能够避免通货膨胀。

  缺点

  ① 挖矿的过程实际上是对社会毫无意义的重复计算,浪费了大量的硬件和电力资源;

  ② 区块链是一种链表的结构,代码一旦完成后,就算有BUG和性能缺陷也难以升级,一旦升级或修改程序则会产生硬分叉(如BCH(即比特币现金)和BSV);

  ③ 去中心化导致比特币缺少政府的监管,出现问题也难以维权。(比如付了钱别人不发货那也没有办法)

比特币实战:申请钱包和转账

  最后我们结合实际介绍一个比特币钱包的注册,首先我们下载一个比特币钱包的app,如imtoken,然后就可以申请多链钱包了。一个比特币钱包的地址大概是这样的:

19NFgVsGcU915HH3Pqg7PLAPUabNLn11oF

  这个地址是你的收款地址,在需要收款时将这个地址发给对方,只要知道这个地址,网络上的所有人都可以看到你的余额和交易信息(不过不会知道你是谁)。另外,在申请比特币钱包的时候,会自动生成一个私钥,就像这样:

KwHXUjdvqECm4DMAHo3kUiKxXw6bMHG7LNvj8XkLwC8UNa4q4Vuo

  注意拥有这串私钥的字符串就拥有对钱包完全的控制权(相当于有了银行卡+密码),收款地址也是可以用私钥计算出来的。由于私钥区分大小写而且毫无规律,非常难以记忆,因此社区开发出了一种助记词协议BIP39。助记词和私钥是能够一一对应的,由于数量级很大,通过暴力破解也是难以枚举出别人的助记词的。助记词大概是长这样的:

admit donor crouch regular glow concert bulb uncover actual regular atom harvest

  区块链的新手们需要注意:拥有助记词即等于用于私钥,也就是拥有了钱包的所有资产。因此请妥善保存你的助记词,将它们抄在纸上并且不要让别人看到(因为存放在硬盘上可能会被黑客窃取)。如果你的助记词遗失了,那么你的资产就无法找回了

  转账时,我们只需要输入对方的收款地址和转账的金额即可(还需要支付少量的矿工费(gas fee)),如果支付的矿工费很少可能需要很久才能到账,因为矿工们更倾向于将矿工费高的交易优先打包进新的区块。

  

  如上图所示,有一个推荐的矿工费,但也是可以自己设置的(设为8.8人民币,大约3个网络时间,也就是30分钟内到账,设为6.82人民币,大约120分钟内到账)。

参考链接

中本聪《比特币——一种端到端的电子现金系统》原文 https://bitcoin.org/bitcoin.pdf
比特币全球节点 https://bitnodes.io/
比特币区块查询 https://btc.com/

  特别声明:文中的内容是一些自己的理解。本文中的所有内容不代表任何投资暗示。鉴于中国尚未出台数字资产相关政策及法规,请中国大陆用户谨慎进行数字货币投资。