都 9102 年了,连大大都发话要大力发展区块链技术,还不来赶紧了解下区块链知识吗。本篇文章主要是科普向,建立对比特币和区块链的基本认知。

一、比特币诞生

2008 年在世界金融危机的大背景下,有一个化名为中本聪的极客,在互联网上发表了一篇名为《Bitcoin: A Peer-to-Peer Electronic Cash System》 的文章。他在这篇文章中提出了设计一种去中心化的电子记账系统的设想。

我们知道,在当今时代,进行支付最重要的一件事情就是记账。所谓记账,就是要有人记录你的账本的资金变动,例如使用银行卡支付,实际是由银行进行记账。银行的背后是中央政府,代表的是国家的信用,我们都信任他,这里的银行就是一个中心化的电子记账系统

**如果这个节点出现了问题,那么我们的资金安全就受到了威胁。**还记得前几天微信支付直接崩掉了,有用户就反馈说付款后商家没有收到,而余额已经扣除的问题。

中本聪提出的观点就是,我们其实并不需要这个中心化的节点,我们可以去中心化,每一个人的账本都是公开,可被他人查阅的,这就是去中心化的电子记账系统

举个例子来说,假设存在用户 A、B、C,他们之间进行互相支付。A付给B 10块钱,A付款后,A将 A付给B 10块钱这条账单记在自己的账本上,为了让其他人都知道,A 将这条账单记告诉所有人,告诉B,又告诉了 C。过了一会B也要支付,它付给C 5块钱,同时他又把这条账单告诉给了A,告诉了C。

现在这三个用户每个人都收到了两条账单记录,我们会把这两条账单记录进行打包,打包后形成一个块,称其为区块。当这个区块被打包完成后,我们再把这个块链接到以前的交易记录上,链接成一条链,这条链就叫做区块链

区块链

以上大致就是中本聪所设计的系统,那么这个系统存在几个问题,比如:

  • 为什么要去记账? 凭什么你告诉我的账单记录,我要记录下来,并且打包到链上去呢。
  • 账单以谁为准? 因为每个人的账单可能不一样的,比如因为网络原因,刚刚的那两条账单记录的先后顺序可能不一样。
  • 如何防伪? 收到的账单记录可能是伪造的,并不真实存在。
  • 如何防止双重支付(双花问题)? A只有10块钱,但他同时分别转账给了两个人10块钱。
  • 如何进行保密? 既然账单都是公开的,那么其他人不就知道你的资产了吗?

二、为什么要去记账?

驱动用户去记账的原因是因为记账有收益,收益包括两个方面:

(1)账单的转账方多交的手续费

比如你正在打的包中,有一条账单是A付给B 10块钱,那么A可能实际支付了 10.5 块钱,多出来的 0.5 块钱也就是给打包者的收益(通俗点说就是支付宝提现到银行卡、银行卡跨行转账时的手续费)。

(2)打包成功后的打包奖励

中本聪在提出这个系统时,建立了一套打包奖励方案。规定每十分钟打出一个包,最初的一个包会奖励给打包者 50 个比特币,每过四年打包奖励减半

那么第一个四年的总奖励就是 10512000 比特币。

506243654=1051200050 \ast 6 \ast 24 \ast 365 \ast 4 = 10512000

由于每过半年减半,那么可以推算出总的比特币个数约等于2100 万个,比特币就是通过打包奖励这种方式向外扩散出去。

10512000(1+12+(12)2++(12)n)2100(ten_thousand)10512000 \ast (1 + \frac{1}{2} + {(\frac{1}{2})}^2 + … + {(\frac{1}{2})}^n) \approx 2100(ten\_thousand)

三、账单以谁为准?

3.1 工作量证明

打包只能够以一个人为准,解决的办法叫做工作量证明,所有想要参与打包的用户(后文称其为矿工)都要去做一个非常复杂的数学运算,复杂到使用计算机都要运算非常久,谁最先计算出来谁就有权利去打包,也就能获得手续费奖励和打包奖励。计算这个数学题的过程,就被称为挖矿

3.2 挖矿的具体原理

这个数学运算其实跟计算机中的 SHA256 哈希函数有关。哈希算法的特点,是正算容易、逆算困难,因此被广泛用户加密领域。而 SHA256 的特点是把任意大小的字符串参数,其哈希结果都是 256 位的二进制数,故得名 SHA256。

SHA256 算法

区块链本质上就是一个线性链表数据结构。通俗点说就是链上包含了所有的账单信息,这些账单信息分布在一个个区块上,每一个区块通过指针链接到它的前一个区块上。

下面开始具体说下挖矿的原理了,如果我想要打包一个区块,那么我需要准备好以下信息:

  • 目前区块链上最后一个区块的头部信息(便于链接)
  • 收集到的尚未被打包的账单
  • 开始打包的时间戳
  • 一个随机字符串 x

然后我们将以上的信息都拼接成一个字符串,对其连续做两次 SHA256 运算,会得到一个字符串结果 y。系统会告诉我们如果当前想要成功的打包区块,这个结果 y 需要满足前 n 位必须为 0。如果我们得到的这个结果 y 正好满足这个要求,你将最后算出来的这个 x,作为新块的头部,接到区块链最后面去。那么我们就打包成功了。

当然,想要满足结果 y 前 n 位必须为 0 的条件是异常苛刻的,在打包的区块信息中,能改变的就是那个随机字符串 x。通过让计算机进行穷举法去尝试那个 x 的值,直到试出一个满足条件的值。

另外,每个人在计算的时候的难度其实是不一样的,因为每个人打包的账单不同,开始的打包时间也不同。所以可能存在有人运气好,很快就算出结果,有人运气差,怎么都算不出来。

抛开运气,想要比别人更快的算出结果,就只能提高计算机的算力(运算速度),也就是我们经常听到的买矿机、买矿卡

矿机

3.3 难度设置

接上一节所说,计算成功的难度和 n 值是密切相关的。n 越小,难度也就越低,n 越大,难度也就越大。n 为 1 挖到概率是 1/2,n 为 2 挖到概率是 1/4,因此挖到的概率就是 (12)n{(\frac{1}{2})}^n

121212n2=(12)n\frac{1}{2} \ast \frac{1}{2} \ast \frac{1}{2} \ast … \frac{n}{2} = {(\frac{1}{2})}^n

那么这个 n 是如何确定的呢?前面说到,打包奖励方案中规定每十分钟打出一个包,因此 n 会根据当前整个区块链的全网算力来动态调整的。

假设目前全网有一万台矿机,每台矿机的算力是 14T/s(每秒进行 14T 次哈希运算,1T=10121T = {10}^{12}),计算可得十分钟全网能算 8.410198.4 \ast {10}^{19} 次。

1.41013100006010=8.410191.4 \ast {10}^{13} \ast 10000 \ast 60 \ast 10 = 8.4 \ast {10}^{19}

又因为计算成功的概率是 (12)n{(\frac{1}{2})}^n,也就是说平均的计算的次数要是 2n2^n。那么 8.410198.4 \ast {10}^{19} 相当于 2 的多少次幂呢。

8.410192668.4 \ast {10}^{19} \approx 2 ^ {66}

计算结果大致是 66,也就是说系统会将 n 的值设置为 66,第一个计算出结果前 66 位都为 0 的矿工,就有资格进行打包,俗称挖矿成功。

闲扯下,如果你想更快的挖到矿,不考虑运气的话,你只能不停地买矿机提高算力。而其他矿工也是这样想的,导致全网算力提高,挖矿难度也随之增大,就是一个轮回啊。AMD 和 Nvidia 表示很开心。

四、如何防伪?

如何保证比特币的交易记录是真实的,比特币是如何进行身份认证的?传统的身份认证方式包括:刷脸、签名、指纹等等。但是这些方式在电子支付系统中都不能实现,因为利用计算机系统都可以进行拷贝。比如拷贝下你的签名,然后添加到我伪造的记录上。

因此必须对传统的身份认证方式进行更改,比特币采用的身份认证方式叫做电子签名

用户在创建比特币钱包时候,会生成一个随机数,根据这个随机数,会产生一个名为私钥的字符串。根据私钥字符串,又可以产生一个名为公钥的字符串,根据公钥产生你的比特币钱包地址。

私钥和公钥采用的是非对称加密方式,即通过私钥能够计算出公钥,但是通过公钥无法计算出私钥。私钥的作用是可以对一个字符串进行加密,而公钥的作用是可以对加密的字符串进行解密。 私钥私有,只有你能够加密。公钥公开,所有人都可以解密你加密后的信息。

私钥是十分重要的,如果私钥丢失或泄露,那么你钱包中的比特币就都丢了。公钥和地址都是对外公开的,当他人向你转账时,你需要提供地址即可;当你向他人转账时,需要提供公钥和地址。

假设A付给B 5 个比特币,首先A写一条 “A付给B 5 个比特币”这条记录,写完这条记录后,A将这条记录,利用 SHA256 算法进行哈希运算,得到一个字符串(称作数字摘要)。随后A利用自己的私钥对这个字符串进行加密,得到一个密文。

随后A对全网进行广播,告诉全网 “A付给B 5 个比特币”这条记录,然后将自己的公钥和加密后的密文一起广播出去。

其他人接收到这条广播后,需要验证这条消息的真实性。首先将 “A付给B 5 个比特币”这条记录进行SHA256 哈希运算,得到一个摘要1(这里的摘要1应该是和A自己计算的摘要是一致的),然后利用广播中的公钥将广播中的密文进行解密,得到摘要2。

前文说过,公钥作用是可以将私钥加密的字符串进行解密。因此如果消息真实,那么摘要1就会等于摘要2。如果计算结果不相等,那么就认为这条消息是伪造的,所有矿工都会拒绝这条记录。

五、如何防止双重支付?

5.1 余额检查

比特币进行余额检查最简单的方式是追溯,前面说过所有用户的比特币支付信息都会被记录在区块链上,那么当我接收到A的转出5个比特币的消息,就会顺着区块链的末端,向前一个区块一个区块的去查找你是否有足够多的余额去支付。

比如向前查找到你通过挖矿赚了6个比特币,那么就认为余额足够;如果不满足条件就继续向前找,直到满足条件,或者找到开头仍不满足。

其实目前已经不再采用这种方式进行余额检查,但那已经不在本文的探讨范围。

5.2 双重支付

如果用户A只有5个比特币,但他同时向全网广播了“支付给B 5 个比特币”、“支付给C 5 个比特币”这两条记录。那么到底转账给谁成功了了?如何防止这种双重支付问题呢?

前面说到,由于网络原因,每个矿工接受到的账单先后顺序是不同的。那么有些矿工可能先收到“支付给B 5 个比特币”,有些矿工先收到“支付给C 5 个比特币”,有些矿工可能同时收到这两条记录。

如果同时收到这两条记录的话,余额检查这一步就通过不了,记录会被拒绝。

如果只收到一条记录的话,首先余额检查通过,然后开始打包,进行挖矿。注意由于收到的顺序的不同,有的矿工打包的内容是“支付给B 5 个比特币”,有的矿工打包的是“支付给C 5 个比特币”。这都没有关系,因为只要没有人挖矿成功,这些区块都只存在本地,不会真的生效。

直到某个矿工打包成功了,他所打的区块被链接到区块链中,那么其他的打包者发现自己打的包中的记录已经被别人打到了区块链中,他就会主动放弃自己打的包。

也就是说,双重支付情况下,哪条支付记录先被打到区块链上,哪条支付就会生效,另一条支付就会因为余额不足而失效。

六、如何防止篡改?

6.1 最长链原则

前文说到,矿工将自己的收到的账单打包成区块后,开始挖矿。谁先挖到,谁就获得奖励,那么另外一个人其实就没有必要再挖了。但是有一些矿工就表示,我不管,我就要接着我的挖,我才不管你先挖到,最后还真让他给挖出来了,然后这个矿工也把他自己挖到的块链接到区块链上。那么此时的区块链就出现了分叉了,从一条链分叉成了两条链。其他的矿工就懵逼了,我现在打的包该链在谁的后面啊。

为了解决这个问题,区块链给出的原则是哪一条链最长,就以哪一条链为准,即最长链原则

接着上面的例子,此时这两条分叉的链一样长,那么矿工就会随便选一条在后面挖矿。直到某个分叉上的矿工先挖出来了矿,那么此时分叉的链就不一样长了。此时另一个分叉的矿工们都会一溜烟的跑去最长的那个分叉上。

那一条短的分叉就被抛弃了,其上的所有区块的交易也都无效了。

最长链原则

6.2 51% 攻击

前文在说“如何防伪”的时候说过,所有对外广播出去的账单记录,都会附带广播者的公钥和密文,来确保账单记录的真实。因此除非你拥有广播者的私钥,才能篡改其他广播者的账单记录。如果私钥丢失了,就没有必要去篡改了,毕竟整个钱包都能让你操作了。

既然不能篡改账单记录,那我能直接删掉记录吗?理论上是可以的,依据最长链原则

比如我支付给某人5个比特币,这条记录广播出去,且被正式链到了区块链上,成为了最后一个区块。现在我想篡改掉,直接删除掉这条转账记录,如果真的让我删除成功了,我的余额就不变了。

由于这条记录已经被打包成了区块,记录到了区块链上,那么其他的矿工自然会在这个区块后面继续挖矿。而你由于想要篡改掉这条转账记录,你就必须把这个区块里的自己的转账记录删除掉,并重新打包区块,链接到最后一个区块的前一个,构造出一个分叉出来。

而在你删除记录、重新打包、挖矿、链接到最后一个区块的前一个区块的过程中。世界上除你以外的其他所有矿工,都在原本的链上继续往后挖。

依据最长链原则,你必须使得自己构造的分叉比原有链还要长,才会让其他矿工都到你构造的分叉链上来挖。如果你真的成功了,你也就篡改成功了。

51% 攻击

区块链之所以这样设计,就是它相信,不怀好意者终究只是少数。除非你的算力超过世界上所有人,你才有希望使得你构造的分叉链超过原有链。

这也被称为51% 攻击,即发动全网 51% 的算力,去构造出一条分叉链,使得原有链分叉区块以后的交易全部失效。因此,如果掌握 51% 的算力,这条链也就被你所掌握了。

七、区块链发展史

  • 2008 年
    • 中本聪(Satoshi Nakamoto)是个人或团体的化名,他出版了“ 比特币:点对点电子现金系统”。
  • 2009 年
    • 首次成功的比特币(BTC)交易发生在计算机科学家 Hal Finney 和神秘的中本聪之间。
  • 2010 年
    • 佛罗里达州程序员 Laszlo Hanycez 完成了有史以来第一次使用比特币的交易——两份 Papa John’s 披萨。Hanycez 转移了 10,000 个BTC,当时价值约 60 美元,被称为史上最贵的披萨。
    • 比特币的市值正式超过100万美元。
  • 2011 年
    • 1 BTC = 1 USD,给予与美元的加密货币平价。
    • 电子前沿基金会,维基解密和其他组织开始接受比特币作为捐赠。
  • 2012 年
    • 在诸如《老婆婆》等热门电视节目中提到了区块链和加密货币,将区块链注入了流行文化。
    • 早期比特币开发商 Vitalik Buterin 发行《比特币杂志》。
  • 2013 年
    • BTC市值超过 10 亿美元。
    • 比特币首次达到 100$ / BTC。
    • Buterin发表“ 以太坊项目 ”论文,暗示区块链除比特币外还有其他可能性(例如,智能合约)。
  • 2014 年
    • 游戏公司 Zynga,The D Las Vegas Hotel 和 Overstock.com 都开始接受比特币付款。
    • Buterin 的以太坊项目通过首次代币发行(ICO)进行众筹,筹集了超过1800万美元的BTC资金,并为区块链开辟了新途径。
    • R3 由200多家区块链公司组成,旨在发现可以在技术中实施区块链的新方法。
    • PayPal 宣布整合比特币。
  • 2015 年
    • 接受 BTC 的商户数量超过 100,000。
    • 纳斯达克和旧金山区块链公司 Chain 联手测试该技术以交易私人公司的股份。
  • 2016 年
    • 科技巨头 IBM 宣布了基于云的业务解决方案的区块链战略。
    • 日本政府认识到区块链和加密货币的合法性。
  • 2017 年
    • 比特币首次达到 1,000$ / BTC。
    • 加密货币市值达到 1500 亿美元。
    • 摩根大通(JP Morgan)首席执行官杰米·戴蒙(Jamie Dimon)说,他相信区块链是一种未来技术,这使分类账系统获得了华尔街的信任。
    • 比特币达到历史新高的 19,783.21$ / BTC。
    • 迪拜宣布其政府将在2020年之前采用区块链技术。
  • 2018 年
    • Facebook 致力于建立一个区块链组织,并暗示可能创建自己的加密货币。
    • IBM 开发了一个基于区块链的银行平台,并与 Citi 和 Barclays 等大型银行签约。
  • 2019 年
    • 央行表示将发行数字货币 DCEP,1 DCEP = 1 RMB。
    • Facebook 发行 Libra,遭遇国会质询。
    • 中央表示要大力发展区块链技术,国家电网等区块链“国家队”进场。