区块链原理汇总

参考资料:https://www.jb51.net/blockchain/801891.html

1、前言

这几天在学习区块链相关知识,这里做下归纳和记录。

2、什么是区块链

区块链的基本功能是记账,特点是不可篡改。所以其创建初衷就是搞一个不能篡改的记账本,所以区块链可以分拆成2部分,即区块和链。

2.1 区块

区块可以认为是电子记账薄中的一页,如下图所示是经典的一个区块,记录了2笔交易。

 

第一笔,Damian转出100BTC,George转入100BTC

第二笔,Bernard转出200BTC,Gerald转入200BTC

这2笔交易的全部字符可以看做一个长字符串,将这个长字符串做哈希计算,假设得到的值是“X32”(实际情况会很长,这里是示意),这样我们就得到了这2笔交易记录的唯一“签名”。假设现在有人要修改这笔交易记录,必然会导致签名的变化,所以只要我记住了签名就能够知道交易记录是否被篡改,但我一个个签名去记录也很费事所以又引入了“链”。

2.2 链

假设我们在新的区块中又记录了2笔交易,在记账时我们将上一个区块的签名一起记录,由哈希运算的特点我们知道,若区块1中的任意字符被修改,则会得到一个非“X32”的新签名值,而原区块1的签名值我们是记录在区块2中的,这样我们就非常容易发现区块1的值是否被修改过。

 

 

在计算区块2的签名时,我们以“交易记录+上一个区块签名”作为字符串做哈希运算可以得到一个新的签名值,假设是“9BZ”,同时将这个签名记录到下一个区块中。

 

 依次类推便实现了一个“链”,这个链中任何一个区块的值都无法被篡改,因为任意的篡改都会导致当前区块计算出的签名值与下一个区块记录的签名值不一致,我们称为断链。如下图所示,对区块1的篡改就导致了区块1与区块2断链。

 

 3、区块链是如何完成记账的

3.1 私钥、公钥与钱包

一般的交易中我们需要用到“账户名、密码”比较严谨的还会用到“交易密码”,在虚拟货币交易时也是这样。要参与区块链首先你得有一个“私钥”,这个私钥其实就是一个32字节的随机数,像下面这样。

“8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3”

这个数是怎么来的呢?这完全看你了,你自己手写也行,摇骰子记录也行,但你自己编的很容易跟别人重复了,如果发生重复则别人就可以使用你的资产。所以一般是通过专门的随机数生成器来自动生成,这样的32字节随机数即使你生成到天荒地老很可能也难以重复出现两个一样的。一般各平台或客户端都配套有私钥生成器,大家不用操心这个。

公钥则是基于私钥的一系列运算(公开的算法)后得到的另一个字符串,钱包账户则是基于公钥再进行一次运算(公开算法)得到。总的来说你现在得到了3个有关联关系的字符串,大概长下面这样:

私钥:8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

公钥:04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235

钱包:3E1yP8eO5Wkaib7DRPsfTN9Xlmu1CizfQg

这里面最重要的是私钥,一定要保存好了,同时也需要保密,因为公钥和钱包都是基于私钥“通过公开算法”计算得来,也就是任何人掌握了你的私钥他都可以通过这个私钥来计算出公钥和钱包,从而控制你的虚拟资产。同时要注意的是,这三个字符串都是你本地生产的,链只做记录不负责相关的“开户”工作。

3.2 如何交易

交易过程可以参考下图示意。

 

1)交易双方达成交易后,卖出方生产一条交易记录并指明自己的钱包和接收方钱包(前面讲过的一串字符),接着卖出方需要用自己的私钥对这个交易记录进行签名(就是做一次加密计算得到一串字符),并将签名结果放到交易记录的后面(就是把那一串字符附到后面)

2)卖方产出交易记录并签名后就将这个记录向全网广播,同时附上的还有自己的公钥(如何广播后面再讲)。

3)链网络中的节点(就是矿工,后面讲)收到这个记录后会先存起来,每间隔10分钟有记账权力的节点会将收到的所有交易记录写到链中并向全网广播(为啥是10分钟、谁有权力记账后面讲)。

4)不过在确认交易记录时,节点还需要对交易记录进行验证,比如用公钥检验下这个交易记录是不是真的由卖方发出的(如何检验后面说),同时还要查询下卖方是不是有这么多币可以交易。

5)网络中其他节点收到这个广播后会在本地记录下交易记录,这样就实现了一次全网的数据同步,同时也完成了交易的确认。

6)买卖双方这时候就能在链上查询到自己的交易记录了。

3.3 如何知道节点的地址

交易时我们需要知道至少一个区块链网络中的节点地址,这样才能向网络提交数据。其实比特币源代码中是直接设置了一个“初始节点”的地址,默认是一个URL的域名,如果域名失效就直接访问IP,而这个初始节点地址是可以自己改的。总的来说当时搞这个的时候是有人在推动这个事情的,所以他们推出的客户端都写好了初始节点地址,也就是他们建设和维护的节点。如果你想自己来修改这个地址也可以的,比如你认识某个节点的维护人,你填上他的地址即可。当你连上某个节点后,它就会告诉你更多的节点地址,就这样口口相传维护了庞大的节点网络。

4、节点(矿工)是如何发挥作用的

在区块链网络中实际上是支持2种节点:全节点、轻节点。全节点就是存有所有的交易记录,一般矿工才会维护全节点,当然你也可以做雷锋。轻节点只存最新的交易记录,并根据你的需要去同步老的数据。显然轻节点就是一般的“客户端”,全节点则是矿工,那么矿工是如何在网络中发挥作用的呢?

4.1 节点如何记账

前面说过区块链创建的初衷是“记账”,而记账的方式简单粗暴,就像前面描述的那样把一个个连续的“区块”存在本地,而且在收到其他节点同步过来的区块时也存起来,这样就构成了一个由节点组成的记账网络。网络中所有节点都有“全量数据”,说实话这种所谓分布式存储跟我们常说的分布式区别还蛮大的。

4.2 奖励机制与挖矿

由于每个节点都会存全量数据,那么很快数据量就会变的很大,存储这样的数据是需要成本的,为何节点愿意存呢?因为有一个独特的奖励机制,即每10分钟,第一个获得了记账权的节点会获得50个比特币的奖励(最开始是50,每4年减半,后面说)。

这么看网络中的所有节点都想来第一个记账对吧,那怎么来分配这个机会呢?区块链的发明者想到一个很有趣的方法,还记得前面我们讲的区块如何成链的吗,其实没讲全,在一个新的区块(Block3)被记录时,其实还有一个要求。

那就是在计算出Block2签名“9BZ”后,不是直接写到Block3中的,而是需要你随机生成一个数nonce,当这个nonce+9BZ(Block2的签名)形成的字符串经过哈希计算的结果符合下面特定要求才获得了写Block3的权力。

这个特定要求就是“哈希计算的结果要以不少于N个0为开头”,且这个N值是自动调节的(后面讲网络是如何调整N值),比如当N是10时,你哈希计算的结果必须要像下面这样:

“00000000006E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3”

这看上去就很难,因为哈希计算的结果是随机的,而且随机数的数量突破天际。你需要不停修改nonce的值然后做哈希运算,最后撞大运得到了一个10个0开头的字符串,恭喜你获得了记账的权利。当你成功记账后网络就会奖励你50个比特币,这个过程就是所谓的挖矿,所以我们才说节点的维护者都是矿工。

前面提到过买卖达成交易后会由卖家产生一个交易记录向全网广播,所有节点都会收到,收到后先存在本地,当某个矿工得到了那个特定nonce后,他就会将收到的交易记录写到下一个区块中并向全网广播,其他节点收到广播后会做验证,验证通过后,所有节点再以最新的区块为基础寻找下一个nonce。

4.3 为什么是10分钟

10分钟只是个目标时间,我们知道全网的算力是动态的,节点的数量越多则算力越大,那么找到nonce的速度也就越快。为了实现10分钟记账一次这个目标,区块链采用调节0的数量来控制。前面讲过nonce+9BZ(Block2的签名)哈希计算的结果需要满足特定条件“哈希计算的结果要以不少于N个0为开头”。很明显这个N越小(0的数量越少)则难度越低,N越大(0的数量越多)难度越大,所以每次全网同步区块时还会评估当前全网的算力(就是看是不是算的太快了),如果感觉算力太多就会提高N的值,以此来控制记账时间间隔。

4.4 公钥检验原理

前面我们说过“开户”其实就是你自己生成一个私钥,再基于私钥生成公钥和钱包。在你向矿工发送交易记录时,会有如下过程:

1)假设你的私钥是“QWER”、公钥是“ASDF”、钱包是“AAA”、对手钱包是“BBB”

2)你本地产生交易记录,假设是 “AAA转出100,BBB转入100”

2)使用私钥对交易记录进行签名,其实就是做了一次加密运算(类似哈希那样将字符串转变为一串随机数),假设签名的结果是“SDADKJHKJGS”

3)将交易记录、签名、公钥发给矿工

4)矿工得到的记录大概长这样:

  AAA转出100,BBB转入100(交易记录);SDADKJHKJGS(签名);ASDF(公钥)

5)矿工使用你的公钥对签名进行解签(又是一顿字符操作),可以得到解签的结果比如说是“AAA转出100,BBB转入100”

6)矿工解签得到的结果与你发送的交易记录结果一致,那就证明了这个交易记录确实是你发的

矿工为什么可以通过解签确认这个记录是你发的呢?

假设你现在的钱包账户是BBB,你想要伪造一个AAA转给BBB的记录,但是你没有AAA的私钥,假设你随便捏造了一个私钥“QWER-2”,并依据这个私钥产生了公钥“ASDF-2”。

使用捏造的私钥“QWER-2”对交易记录的签名结果是“SDADKJHKJGS-2”。

矿工使用公钥“ASDF-2”确实也可以对“SDADKJHKJGS-2”进行解签,解签的结果就是“AAA转出100,BBB转入100”。

但问题矿工使用公钥“ASDF-2”得到的钱包账号不可能是AAA,所以你的计划破产,这条交易记录被抛弃。

4.5 矿工如何知道你有没有足够的币可以卖

因为记账(挖矿)模式的特性,矿工处始终会存有最新最全的区块信息,所以他可以对以往的交易记录做一次全量查询来确认你是否有足够的币。其他收到新区块的节点也可以这样做,完成校验后才是真正对交易记录的确认。

5、什么是6次确认

当你将交易记录发给矿工后,他先是存在本地(因为他还没有获得记账权),假设现在全网都收到了你提交的交易记录,都存在本地了。这时候某一个矿工A成功获得记账权(找到了那个10个0开头的字符串),他会将你的交易记录写入下一个区块,同时将找到的nonce和新区块信息向全网广播,其他矿工收到后会对nonce进行验证,验证OK就把这个新区块记录到本地存的链上,如果校验未通过会抛弃这个新区块,这个过程就是投票。一般来说我们认为这个过程应该是顺利的,但是保不齐有坏人,这就可能导致链的分叉。

比如某个矿工B不承认你的结果,而他自己找到了一个新的结果,他也向全网广播,这样就可能一部分节点收到了A区块的,一部分节点收到了B区块的。这时候怎么办呢?啥也不办,大家继续埋头挖矿。但链确实是产生了2个分支,我们把有你的交易记录的链称为A分支,没有你交易记录的链称为B分支,全网中各有一部分节点支持A或B。

假设现在B分支下某个矿工成功找到了新的nonce并向全网广播,由于B分支现在比A分支更长,这样全网都会以最长的链作为标准,也就是认可B分支抛弃A分支。

那么结果就是你写下的交易记录也被抛弃了。所以默认需要进过6次确认才稳妥,所谓6次不是6个节点或全网进行6次重复的确认,而是链新增了6次新的区块,这样即使产生了链的分叉,你的交易记录被写入链中也基本是无法更改的了。相对应的,如果链新增的区块数比较少,你的交易记录是有可能被抛弃的。当然6这个数也不是绝对的,有时候3次确认也OK,看你自己了。

此外能够看出由于每10分钟产生一个新区块,产生6个新区块你的记录才能稳妥(60分钟),这速度着实是慢了点。

6、手续费

前面讲过矿工通过获得记账权来收获比特币,但我们又知道比特币的总数是2100W,而且生产的速度会越来越慢(后面讲为啥),那早晚有一天会被挖完到时候没有人挖矿,也没有人有动力来记账,整个区块链网络岂不就废了?

所以还有个补充机制,那就是手续费。获得记账权的矿工除了直接获得奖励外,还能收到写交易记录需求方提供的手续费,比如你需要卖币给某人,想要矿工们帮你记录下这个交易记录,你得付出一定的币。

那这里又产生了一个知识点,其实一个区块的大小是1MB,大概能够记录2000-3000条交易记录,所以一个矿工奋力挖矿10分钟,撞大运获得了记账权,他只能记录2000多个交易记录。但全网的交易是比较活跃的,10分钟可能就有上万笔记录需求,这时候咋办?

很简单,谁给的手续费多我就记录谁。所以又产生了一个问题,那就是排队,你给的手续费少了就得排队,没有手续费可能就排到天荒地老也没人给你记录。

7、2100W与减半机制

2100W这个总数是写在源代码内的,现在链中的节点那么多,想改大这个数几乎不可能(得所有节点同意,否则会产生分支链)。

另外前面提到成功获得记账权的矿工会被奖励50个币,但随着挖出的币越来越多,达到某个量后奖励会减半,因为大概每10分钟就挖出一次币,可以简单算出每4年奖励就减半这个机制。

所以奖励是50、25、12.5.。。。依次变小一直到几乎没有,也就是挖矿不再有收益了。这个最终时间也算出来了,就是 2140 前后。

不过到时矿工还是继续挖矿,不是还有手续费嘛。

8、区块大小1MB能改吗

可以改,但是得全网同意,如果有人改了有人没改,那就会导致链分叉,事实上任何对协议的修改都可能产生分叉。比较有名的就是BCH,当时就是为了对区块进行扩容,大部分人不同意,同意的人自己开了新的分叉就是BCH。

9、比特币的最小分割单位

最小分割单位是1聪(就是中本聪的简称),1BTC=1亿聪,所以我们可以知道BTC的容量其实是2100万亿聪,这样看起来远没有2100万那么稀缺了。

10、总结

总的来说,区块链是一个多中心的记账系统,我觉得多中心比分布式能更准确描述这个架构,因为每个节点都是全量存储的,所以每一个节点就是一个中心。

使用了私钥、公钥、钱包来实现全流程的加密。

这个系统的记账频率是10分钟,为调节这个频率引入了nonce找特定数机制。

为鼓励大家来参与记账,引入了记账后奖励比特币的机制。

为避免比特币无限量增加,引入了2100万总数机制。

为避免几天就把币挖完了,引入了每4年奖励减半机制。

为避免2100万不够用,又引入了1亿聪等于1比特币的细分机制。

 

posted @ 2022-05-13 12:02  布兰姥爷  阅读(751)  评论(0编辑  收藏  举报