比特币的原理

https://zhuanlan.zhihu.com/p/34350017

https://bitcoin.org/en/bitcoin-paper

 

转的一篇,其中的关键点进行点评

 

简介

本篇文章试图让你明白什么比特币?以及让你明白账本、数字签名、加密散列函数、区块链、挖矿等含义。
我不会做一些浅显的类比来进行说明,如通过现实中矿工挖矿来讲比特币,因为这失去了很多细节,让人懵懵懂懂,我尝试讲解你在使用比特币时,计算机究竟发生了什么?当然不会涉及太多技术细节。

先下个定调:加密货币是一套基于密码学的去中心化、互不信任的交易验证体系

账本

首先要弄明白加密货币中账本的概念。
你ayu,在生活中有3个朋友,分别是小吕、小林、小廖,你们很要好,经常一起玩耍,玩耍当然要花钱,吃吃喝喝,但是这显得比较麻烦,比如ayu和小吕出去吃东西,你俩AA,一人付一半,你和小林出去玩也AA,每次都要算钱,朋友之间很尴尬,但是不算又不行,毕竟是钱,那将这些交易都记录在一个账本上,每个人都可以往账本上添加交易记录,月尾4个人一起结算一下不就好了

账本如下:

  1. 账本
  2. ---------
  3. ayu 付了50元小吕
  4. 小林收了小廖100元
  5. 小吕付了80元小廖

 

到了月尾,大家一起来计算一个账本中的数据,如果有人有盈余,就将盈余取走,如果有人在账本中欠了钱,就补回来,每月一次,方便了很多,因为每个人都可以往账本上添加交易记录,那么如果有人偷偷添加了一条交易记录怎么办?朋友之间很难说的嘛ㄟ( ▔, ▔ )ㄏ,将问题转换一下就是我们为什么要相信账本上的所有记录都是对的?没人动过手脚?这就需要动用电子签名技术了

数字签名

为了让账本中的交易记录可信,最直接的方法就是让交易人本身在这条交易记录后面签上你独一无二不可被复制的签名,但无论你的书法多么精妙,在电脑上只需要简单的复制粘贴就可以了,所以“独一无二不可被复制”的签名感觉做不到啊,根本挡不住ctrl+c/v,其实我们可以使用非对称加密算法来解决这个问题,非对称加密算法有两个秘钥,一个是公钥(Public Key),另一个是私钥(Secret Key),公钥你可以外放出去,交给他人,比如给你的3位朋友,但是私钥只能你自己知道,要妥善保管,此时你就可以使用你自己的私钥加密你的交易记录生成一个长为256bit的数字签名,所有人都可以这样做,那么账本就会是下面的样子

  1. 账本
  2. ---------
  3. ayu 付了50元小吕001101...
  4. 小林收了小廖100元100111...
  5. 小吕付了80元小廖011011...

 

其他人可以通过你的公钥来验证你的签名,如果使用公钥解开你的加密签名获得其中的内容与交易记录的内容一致就说明这确实是你签的名,公钥和私钥都是互相对应的,单纯的拿到公钥和私钥加密后的内容是无法破解私钥的,准确说,除了使用穷举法,没有什么更好的方法得到私钥,而私钥的长度为256bit,也就有2的256次方的可能,比天文数字还要大,可以去知乎上看看这个问题对2的256次方法有直观的认识2的100次方到底有多大?

可以说有了签名,其他人就不能偷偷往账本上写交易记录了,虽然他不能写,但是他可以复制啊,连同你的签名一起复制,这样你就无缘无故多付了几倍的钱,果然是好朋友啊,这个问题很好解决,每条交易记录都加上唯一的编号,这样通过秘钥加密时,因为有了编号,要加密内容就不同了,得到的签名会完全不同。

  1. 账本
  2. ---------
  3. 0 ayu 付了50元小吕0011101...
  4. 1小林收了小廖100元1010111...
  5. 2小吕付了80元小廖1011011...
  6. 3 ayu 付了50元小吕1111010...

 

顺带提一下,非对称加密算法还常于信息安全中,如加密传输的信息,与上面的用法有点不同,使用公钥加密要传输的信息,只有拥有私钥的人才能解密其中的信息

通过上面的努力,建立了一本大家都可以信任的账本,但是它还是需要一个中心的机构,比如政府、银行,因为朋友可以在月尾结算时跑路,而他却在账本里却欠了很多钱,只有通过中心机构才能让他还钱,为了避免这种友谊破碎的情况,我们4人可以一开始先支出100元到账本里,然后再使用账本,这样每个月月尾也不用结算了,如果发现一条交易记录他的交易人没有那么多钱,就拒绝记录这条交易,账本如下

  1. 账本
  2. ---------
  3. 0 ayu 充值了100元0010101...
  4. 1小林充值了100元0111011...
  5. 2小吕充值了100元1101101...
  6. 3小廖充值了100元1000100...
  7. ---------
  8. 4 ayu 付了50元小吕0011101...
  9. 5小林收了小廖100元1010111...
  10. 6小廖支付20小吕--->余额不足,拒绝记录
  11. ...

 

你可以发现,现在使用这个账本,你完全不再需要现金,也就说它与现金脱钩了,同时它可以拒绝非法交易(余额不足等情况的交易),这也意味着账本在记录交易前要检查前面的所有交易。

而Bitcoin(比特币)就是一个账本,它表示所有的历史总和就是当下的货币。

分布式账本

因为账本具有人人都可以修改的特性,那么这个账本放哪才能让人人都可以修改?放在一个公共场所?放在一个人人都可以访问的网站上?如果这样会造成中心化,如谁有权管理这个地方?谁有权管理这个网站?谁来控制账本的添加规则?

那人人都有一本账本不就可以了?没错,这就是分布式账本,人人都有一本账本,人人都可以在自己的账本上记录交易。将账本分布到每个人上,那么每有一笔交易,交易人不仅要在自己的账本上记录上这条交易,还要将这条交易广播出去,告诉所有其他拥有账本的人,让他们也记录这条交易

这个想法虽然简单,但是却会带来很多严重的问题,如下:

1.如何确保全部所有人手上的账本都是正确的?如记录顺序无误?没有漏记?
2.ayu收到一个广播,说“小林支付给小廖100元”,ayu使用公钥验证了这条交易记录没问题后,他如何确保其他人也收到了这条交易记录呢?让他可以放心与其他人交易?
3.你如果收到了多个交易广播,怎么才能确保其他人跟你以相同的顺序收到交易广播呢?

想出一个可靠的方法来接收或拒绝收到的信息,而且确保其他人在这个方法下能以同样的顺序得到交易信息,最终生成同样的账本就是关键,这也是中本聪在比特币创世论文中详细讨论的部分。(至今没人知道中本聪这位神人是谁?中本聪只是一个ID,他创造了比特币,最先提出区块链的想法。)

长话短说,Bitcoin的解决方法是选择信任消耗最多计算资源的那份账本,如果将计算资源的消耗作为信任的基石,那么伪造或修改交易记录就需要不可能达到的计算能力,暂时不理解这句话没关系,因为涉及到了加密散列函数、区块链等概念,先来讲讲加密散列函数

加密散列函数

散列函数,或者叫哈希函数,这个函数可以将输入的任何内容都输出成具有相同长度的内容,最常见就是MD5,而这里使用的是SHA256,它会将输入的内容加密成256bit长度的哈希,这个过程是不可逆的,也就是告诉你一个加密好的256bit的哈希,你无法逆推出加密的内容是什么,散列函数都具有正向计算简单,逆向计算几乎无解的特性,所以除了用穷举法,你没有什么特别好的方法来破解,穷举嘛,你就需要体会2的256次方的恐惧。

你可能会想,去深入了解散列函数的细节与作用原理,再通过结果一步步逆推不行吗?目前没有人做到,而且有趣的是,目前数学上也没有严格的证明说逆向计算是困难的。

可以去这个网站体会SHA256是如何加密的,SHA256加密

回到刚才的那句话,Bitcoin选择信任消耗最多计算资源的那份账本,问题是如何证明账本消耗了计算资源呢?可以用加密散列函数来证明,这也是Bitcoin的核心,工作量证明Proof Of Work,简称PoW

Proof Of Work

有一天,小吕跑过了跟你说,她找到一个有意思的数,5201314,这个数和当前的账本作为内容输入给SHA256函数可以获得一个长度为256bit的哈希

SAH256(账本内容+5201314)= 00000000000000000000000000000000000000000000000000
00000000001011101001011011010111010010001001.....(256位)

有趣的是这个哈希开头是60个0,要得到哈希前60位都为0的概率是2的60次方,大约是十亿亿分之一,而SHA256函数又是不可逆推的,所以小吕要得到这个数只能去穷举,最坏的情况就是计算十亿亿次才能得到5201314,有没有突然觉得这个数字很沉重,其实5201314就是一个账本的工作量证明,通过花费大量算力去穷举出某个数,让该数与账本内容的哈希值其前60位为0,这个数就能用来证明你花费了很多计算资源,它就是工作量证明PoW,如果有人稍微修改账本中的内容,那么通过SHA256函数计算出的结果就全变了,为了再次获得前60位为0的哈希,你只能再次去穷举计算

有了工作量证明的账本我们一般不称它为账本,而称它为区块

还有一点需要知道的就是,PoW要求计算出的特殊哈希值,如前60位为0,这些0的个数是有规律变化的,比如过段时间PoW要求计算前62位为0的特殊哈希,其目的是为了确保平均每10分钟会建立一个区块,平均这个词很重要

之前pow这里一直有点疑问,现在大体说一下。比特币的区块链,如下图,SAH256(区块内所有内容+随机数)= 00000000000000000000000000000000000000000000000000
00000000001011101001011011010111010010001001.....(256位),这个哈希前60位都为0是提前要求的,因此pow的工作就是找到这个随机数。

For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block's hash the required zero bits.

 

 

 

区块链

从上面的描述可以知道,区块就是有工作量证明的账本,大概的样子如下

  1. ---------
  2. (账本内容)
  3. 0 ayu 充值了100元0010101...
  4. 1小林充值了100元0111011...
  5. 2小吕充值了100元1101101...
  6. --------
  7. 5201314(PoW)

 

我们已经知道,这个区块通过加密散列函数,如SHA256计算后就可以获得前60位都是0的特殊哈希,这个特殊的哈希值其实也唯一的表示了这个区块,我们会将这个哈希存到下一个区块的头部,将多个区块通过区块哈希串联起来获得一个链状数据结构就是区块链,如下图,图中的256bit的二进制哈希转成了十六进制的(该哈希的具体内容是对女朋友的一句情话:-D)

 

 

这里需要提一下,SHA256是对整块区块进行哈希计算,其中包括区块的头部,这点让区块链具有不可修改的特性,以及记录在区块上的内容是也是无法修改的,如果你修改了一个区块中的内容,比如该了账本中的交易记录,那么该区块通过SHA256计算出来的哈希就完全变了,你要重新计算你修改内容后的区块的哈希,让该哈希前60位为0,获得工作量证明数,但你发现下一块区块头部存储的哈希也要改变,这又导致该区块的哈希改变,你又需要获得新的工作量证明数。也就是说修改一个区块,该区块后的所有区块都需要重新做PoW和修改,这需要巨大的算力支撑。

你可能会想,修改最后一块区块就好,就没有所谓的连锁反应?这个放到文章后面讨论。

区块链是一个链状数据结构,那第一个区块它的区块头部存了什么?因为它本身开头,所以没有上一块了,那头部记录上一块的地方存了什么?你好不好奇我不知道,反正我学的时候很好奇,所以我就去找了,第0个区块

 

 

从图中可以发现,创世区块(第0个区块)中本该存上一块区块哈希的地方存的都是0

挖矿与矿工

任何人都可以成为区块的建立者。

成为建立者意味着你将要收听网络中的交易广播,将这些交易信息整理成一个账本然后通过巨大的算力去计算获得工作量证明(PoW),将获得的PoW和账本内容整理成一块区块广播出去,可以看出要建立区块需要花费算力,简单说就是水电费、设备折旧费等,这些都是成本费用,所以为了鼓励建立区块的人,系统会奖励区块建立者的算力付出,当他建立一个区块时,系统规定他可以将一笔特殊的钱记录到区块的账本开头,这叫做区块奖励,这也就是我们接受或拒绝交易信息规则的一个例外情况,它不来自任何人,不需要数字签名。

通常我们将区块的建立者称为矿工,将建立区块这个过程称为挖矿,很形象。

总结一下,矿工要做的事情就是,收听交易信息、建立区块、广播区块、获得区块奖励。

在Bitcoin中,区块奖励一开始是50个比特币,每4年减少一半,比特币在2009年1月3日出现,所以到现在区块奖励是12.5个比特币,其实也就可以计算出比特币的总量是2100万枚。矿工挖矿获得的区块奖励为整个比特币体系引入了新的比特币。

如果你只是用比特币进行交易,那么你只需要收听矿工发出的区块广播,然后更新自己那一份区块链就好了,建立区块的事情交给矿工,同时为了感谢矿工将你的交易记录写到区块账本上,你还需要给矿工一些手续费,这也是矿工另外一个收入来源,这笔交易同样会记录到区块账本中,这是在进行PoW前就记录好的,如果你产生的区块被添加到大家的区块链中并被认可了,自然就获得这份小费了。

还有一点,在Proof Of Work小节中提到,PoW特殊哈希前n位的0是有规律变化的,确保平均每10分钟会建立一个区块。那么当越来越多人加入矿工的挖矿队伍时,算力资源的加大会让区块产生的速度越来越快,为了确保平均每10分钟才创建区块,计算出特殊哈希的难度也会越来越高,现在不是定制的矿机几乎计算不出特殊哈希(就是挖不出矿)

比特币体系安全问题

现在你已经弄明白了比特币和区块链了,虽然还有很多技术细节没有弄清楚,但是已经对比特币有了一个大体的把握了,那么一个随之而来的问题时就是比特币体系安全可靠吗?具体会有下面几个问题

如果你同时收到两份不同的区块链怎么办?
我们选择更长的那一份区块链,因为更长的区块链消耗了跟多的计算资源,如果你收到的两份不同的区块链长度相同,那你等待下一个区块广播,直到可以选出更长的那一份区块链,总有一份会成为最长区块链,这也意味着,每个人都需要维护更新自己那份区块链。如果每个都信任最长的那份区块链(消耗最多算力),我们就可以构成一个去中心化的组织

如果有人恶意修改了区块链中某一个区块的信息怎么办?
修改了区块中的信息就需要重新进行PoW,而且这个区块的哈希也发生了改变,因为该块哈希变了,那么下一块区块头部存储的哈希也要改变,头部存储的哈希一变,又需要重新计算PoW,这是个重复的过程,直到区块链中最后一块区块,就算你经过不懈的努力做到了,成功的修改了某个区块中的哈希,并获得了一个新的区块链,但是你在运算PoW的时候,其他矿工依旧在挖矿,也就说,此前的那份区块链变得更长了,你计算出来的区块链将不会被接受,除非你拥有超过全网51%的算力,你才有能力修改区块中的内容,生成新区块链,并且慢慢追上其他矿工的挖矿速度,让自己的区块链最长,这也就是著名的51%攻击,要用于51%的算力非常困难

如果有人修改最后一个区块呢?或者直接发送伪造的区块广播?
跟上一个回答类似,修改最后一个区块或直接发送伪造区块广播,因为是区块链中最后一个区块,所以只需要计算当前区块的PoW就好了,但是为了让网络上所有人的信任它这份区块,伪造者就需要像矿工一样多创建几个区块并广播出去,因为我们在接收到区块广播时通常会等待一段时间用于接收更多的区块广播,然后选择最长的区块链,确保自己收到的区块都是可信的,所以伪装者必须创建多几个区块,这相当于跟全世界的矿工竞争,除非你拥有超过全网51%的算力,不然你很难创造出最长的区块链

posted @ 2020-02-23 16:32  Alexander  阅读(556)  评论(0编辑  收藏  举报