区块链共识机制和架构以及比特币体系结构
发布于 3 个月前 作者 赞比社区 251 次浏览 来自 比特币

一、区块链的定义及共识机制 区块链就是数据库或者说区块链就是用来存储数据的一个处理系统。区块链也常被称为账本。 而这个账本是人人都可以参与的,你只要有一台服务器,连入区块链网络,这台服务器就成为了区块链的一个节点,通过这个点可以连接到其它的节点。区块链中的所有节点地位都是平等的,没有孰轻孰重,孰高孰低。区块链中的任一节点发生数据的变动,其它的节点也会同步发生改变。这样就保证了所有节点的数据都是一致的。 区块链里的一个新数据是如何同步到所有节点上的呢?一条新的数据同步到所有的节点上,那又以哪个节点的数据为准呢,矿工要争夺的就是记账权。区块链引入了共识机制。目前主要的共识机制有PoW、PoS、dPoS。 PoW(工作量证明)矿工通过把网络尚未记录的现有交易打包到一个区块,然后不断遍历尝试来寻找一个随机数,使得新区块加上随机数的哈希值满足一定的难度条件,例如前面10位是零。找到满足条件的随机数,就相当于确定了区块链最新的一个区块,也相当于获得了区块链的本轮记账权。矿工把满足挖矿难度条件的区块在网络中广播出去,全网其他节点在验证该区块满足挖矿难度条件,同时区块里的交易数据符合协议规范后,将各自把该区块链接到自己版本的区块链上,从而在全网形成对当前网络状态的共识。 PoS权益证明,要求节点提供拥有一定数量的代币证明来获取竞争区块链记账权的一种分布式共识机制。 dPoS(股份授权证明)机制,类似于董事会投票。 区块链技术的特征: 1、开放、共识 只要能连入区块链网络,任何人都是可以参与的。通过共识机制,区块链里的每一个节点都会对新的节点达成共识,你要不就遵守规则,要不就不要参与。即使其中的1个节点离开了区块链网络,其他的节点还是可以按照规则继续进行。 2、去中心、去信任 在区块链中,不存在中心节点,所有的节点都存储有整条区块链的数据。区块链信任的是共识下的规则,而不是人。所有的节点只需要达成共识就可以,不需要哪个节点信任哪个节点。 3、交易透明、双方匿名 所有的交易记录在区块链上都可以查询,但是查询到的只是每个地址上的交易记录,而这个地址所对应的物理世界中的所有者是查询不到的。 4、不可篡改、可追溯 修改区块链上的交易数据,必须同时修改51%节点上的数据。但是要同时修改51%节点上的数据几乎是不可能的。发生的交易记录都存储在区块链上,每个区块中都有区块高度和时间戳,方便查询交易的来龙去脉。 二、区块链架构模型 区块链架构模型分为六层:数据层、网络层、共识层、激励层、合约层、应用层。 数据层、网络层、共识层是构成区块链应用的必要因素,否则就不能称为真正意义上的区块链。而激励层、合约层、应用层就不是每个区块链应用都必须要有的。

数据层:区块链中的区块是按照时间顺序排列的,这种机制在区块链中叫作时间戳。可以把每个区块生成的时间计算成一个特殊的数字,这个数字可以逆向的计算出区块生成的时间。这是一种算法,我们称之为哈希函数。哈希函数的主要作用是不管你写入任何数据,它通过一堆极度复杂的算法计算完成后,它会输出一个完全看不懂的字母组合,这个组合称为哈希值。 哈希函数的特点:1、不论你写入的数据是多长,计算出的哈希值的长度都是固定的。2、只要你把数据写入函数,就会得出哈希值。但是根据哈希值是推算不出写入的数据的。3、写入的数据只要有1个字节的改变,得出的哈希值和之前的哈希值也是不一样的。 Merkle根

图中的交易1、交易2、交易3、交易4 是数据层最底层的数据,称为叶子节点。首先把叶子节点进行一次哈希计算得到一个哈希值,这是第一轮,然后进入第二轮把得到的哈希值(如图中Hash1、Hash2、Hash3 、Hash4)两两合并并进行哈希计算,得到下一轮的哈希值(如图中Hash12、Hash34),重复这种两两合并的哈希计算,最后我们得到最上层的唯一哈希值叫作Merkel根。 Merkel根的作用:Merkel根是由底层的叶子节点先计算出哈希值,然后再两两合并计算哈希值最后得出的唯一的哈希值。如果其中的任何一个数据被篡改,则计算出的哈希值就会和之前的不一样。区块链中某个节点上的某个区块和其他节点上这个区块的Merkel根不一样,就说明那个节点的数据被篡改了。 网络层:区块链是建立在点对点网络基础上的一个分布式系统。每台连入区块链的电脑就是一个节点,节点之间地位平等的,功能是对等的。节点和节点之间就是点对点的关系。这些节点构成的网络,我们就称为点对点网络。 一台安装了区块链程序的电脑接入区块链网络中之后,这个程序就会根据自己在网络里的地址去寻找整个区块链网络里其它和自己一样安装了同样程序的电脑,根据自己的属性比如IP地址、国家信息等等找到邻近的节点,因为邻近的节点也安装和自己一样的程序,所以这些程序可以彼此通话,把邻近的节点当作自己的邻居,然后它们之间就建立去了桥梁,彼此发生了关系,然后整个区块链网络上这个时候就多出了一个新的节点,整个网络是连通的而不是孤立的,以此类推区块链网络的节点就变得越来越多,而整个过程都是节点上的程序自动构建起来的通信机制,所以这个过程就称为点对点自动组网过程,也称为P2P自动组网过程。 网络层里消息如何验证?消息的传递过程首先消息接收方要先和消息发送方进行确认,确认无误,消息接收方会把消息往外扩散,在区块链里这些过程都有非常详细和严谨的算法来保证数据的正确性和安全性。 共识层:保证大家对传递的消息达成最后的意见一致性的认识。目前为止,所有类型的区块链网络都是通过这样那样的方式找出全网里一个独特的节点,让所有的节点都相信它说的话,当然,这个节点是根据规则选出来的,并且是一直变化的。 三、比特币区块链的体系结构:

区块体就是区块的主体,主体里面储存的是交易数据。区块头存储的就是其他杂七杂八的东西,有版本号、上一区块哈希值、Merkle根节点、时间戳、难度值、随机数。 创世区块:第一个被构建出来的区块。创世区块拥有一个唯一的ID标识号,除了创世区块,每一个后续建立的区块都会包含两个ID,一个是区块链自身的ID,另一个是前面的区块链ID,第一个创世区块因为没有前后关系所以就只有一个ID。 在比特币网络里,它规定每10分钟会生成一个新的区块,而以太坊平均每5秒就会产生一个新的区块,EOS因为做了大量的改进和优化,出块的时间达到了逆天的0.5秒产生一个新的区块,我们就称之为出块。当然,不是所有的情况下出块时间越短就说明这个区块链越好,不一样的机制导致的出块时间不同,安全、去中心化、效率它们之间常常要有平衡和取舍。 头哈希值指的是当前我们这个区块的哈希值,我是区块头,我有一个头哈希值,我的地方还有一个父哈希值。 父哈希值就是上一区块哈希值,我是后面的一个区块,那我的上一个区块就是我父亲,父哈希值就是上一个区块哈希值,所以在区块链数据结构的这一条链条上通过后面的区块可以定位去找到前面的一个区块,这样的话就形成了前后定位的关系。 每一个区块都记录了自己的头哈希值和上一区块的哈希值,由此来实现相邻两个区块的串联,最终得到一条有序连接的区块链,通过区块链中的任意区块都可以追溯这个区块之前或者之后的所有区块。 版本号:标识软件及协议的相关版本信息 哈希散列:哈希就是散列,哈希是Hash的音译,哈希算法是一种单向加密,明文通过哈希算法加密成密文,密文是不能反向推出明文的。 时间戳:就是记录区块产生的时间,精确到秒 随机数:矿工要获得记账权,就需要计算随机数。所有的矿工都需要计算随机数,而且计算随机数很难,没有碰运气就能解出的可能性,需要一个一个的试,那么第一个算出正确答案的人就拥有记账权。 难度值:计算随机数,需要设置一个难度值。太难了大家都算不出来,但也不能太简单了。所以要控制难度在一个合适的范围,这个难度一直在波动中。

矿工:打包区块的人。

矿机:用来计算随机数的机器。 在区块结构里,我们在区块头存放了Merkle根,在区块中就存放了各种交易的数据,我们为什么要用Merkle根这种技术呢,它有什么用处?

在比特币网络中,一个节点可以看做接入了比特币网络的任何一台电脑或者存储设备。矿工就是在比特币网络里通过大量计算来算出随机数的那个人,计算随机数是借助一种称为矿机的设备,它具备了强大的计算能力来进行计算,矿机具有的计算能力我们就称为算力。 在比特币网络里每一个区块里所有的的交易都生成了一棵Merkle树,比如一个区块有2000笔交易,那么两两算哈希值就可以生成一棵二叉树,然后节点可以根据自身情况判断是否需要保存整棵树,普通电脑的容量是不够的,所以这个时候我们可以选择之保存区块头,区块头的数据就少多了。 相比较于保存区块的数据我们更多的是选择保存区块头,因为通过区块头我们首先知道了每个区块和其它区块的关系,也就是链条的关系可以得到维持。另外区块里的Merkle根根本上保证了所有节点的账本中的交易不能被篡改,以某个节点的账本被篡改,它的Merkle根和其它节点账本上的Merkle根是对不起来的,它的篡改就会被视为无效。有了这两点的保证我们只需要在自己的节点上保存账本的区块头就能保证我们的账本是否和其它节点的账本是一致的,账本中的交易是不是被篡改过,这样做的好处就是极大降低了节点上的存储空间。 钱包:可以理解为一个节点,钱包软件可以用来提币、充币、查看交易记录,它们要与其它钱包软件或交易平台互换区块数据和交易数据。保存了全部大账本的钱包软件称为全节点钱包,全节点钱包一般都是官方钱包,币种单一,并且需要同步链上所有信息,占用资源大,而只保存了部分账本数据的钱包称为轻钱包,它只同步和自己相关的数据,更轻便。 新区块产生的过程:

在当前区块加入到区块链以后这时所有的矿工就要立即开始下一个区块的生成工作了。 1、把本地的交易信息记录到区块主体中,比如说有多笔交易已经形成,那么当矿工发现多笔交易形成以后,就会把这些交易写到一个区块的主体里去。 2、在区块主体生成此区块中所有交易的Merkle树,通过连续的两两哈希计算,把算出的Merkle根保存在区块头中。 3、把上一个刚刚生成的区块的区块头数据通过哈希算法生成一个哈希值填入到当前区块的父哈希值这一栏中 4、把当前的时间保存在时间戳这个字段里 5、难度值字段会根据之前一段时间区块的平均生成时间进行调整来应对整个网络不断变化的整体总量,以比特币和以太坊为例,难度值的大小影响最为直接的就是矿工挖矿时间的长短,难度值越大,挖矿时间就越长。 比特币区块链的区块容量是1mb,平均的出块时间是10min,1笔交易大概是250b 1mb=1024kb 1kb=1024b 1mb=1048576b 每个区块最多能容纳4000笔交易 1048576/250≈4000 每秒钟最多可以处理7笔交易 4000/600≈7 来自:https://zanbtc.com/thread-11687-1-1.html 参考:https://zanbtc.com/forum-2-1.html

回到顶部