区块链基础讲座3系统构架数据结构及运行机制详解5章15节Word文件下载.docx
- 文档编号:22553911
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:21
- 大小:504.89KB
区块链基础讲座3系统构架数据结构及运行机制详解5章15节Word文件下载.docx
《区块链基础讲座3系统构架数据结构及运行机制详解5章15节Word文件下载.docx》由会员分享,可在线阅读,更多相关《区块链基础讲座3系统构架数据结构及运行机制详解5章15节Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
一般来说,用户不需要关注这些底层的构造,只需要熟悉应用的产品便可。
在区块链的这一系统构架中,各个层次以交易为中心构建起一个完整的循环体系,相互关联,绝非单独割裂。
这一循环模式是这样的:
首先,应用层的诸如数字货币、智能合约等产品,对于底层网络来说,传输的全是数据,即所用应用层相当于数据层的数据输入源。
这些数据必须进入数据层,按照区块链的格式进行封装。
其次,在数据封装完成后,就进入分布式(P2P)网络进行广播,由全网节点通过一定机制(如比特币采用POW的矿工机制)进行确认。
最后,当全网达成共识之后,区块构建完成并连接到主链之上,完成一次交易的流程,开始下一次交易的循环。
这一循环过程,从技术上的角度来讲,是这样的:
区块链中的区块是一种记录交易的数据结构,反映了一笔交易的资金流向。
系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的信息是区块所承载的任务数据,具体包括交易双方的私钥、交易的数量、电子货币的数字签名等;
前一个区块形成的哈希散列用来将区块连接起来,实现过往交易的顺序排列;
随机数是交易达成的核心,所有矿工节点(如比特币)竞争计算随机数的答案,最快得到答案的节点生成一个新的区块,并广播到所有节点进行更新,如此完成一笔交易。
然后开始新的循环。
这个技术的过程对初学者来说,可能是一头雾水。
不过没关系,继续读下去,将会慢慢明白。
1.2数据层、网络层与共识层
1.2.1区块链的数据层
区块链的数据层封装了底层数据区块的链式结构,以及相关的非对称公私钥数据加密技术和时间戳等技术,这是整个区块链技术中最低层的数据机构,其中大多数级技术都已被发明数十年,并在计算机领域使用了很久,无须担心其中的安全性,因为如果这些技术出现安全问题,则意味着全球金融技术都会出现严重问题。
中本聪在设计比特币时,为每个区块设置了1MB(兆)大小的容量限制,但由于目前比特币的交易量迅速提升,1MB的区块空间能够容纳的交易数量有限,所以要考虑扩容区块链来突破这个限制。
1.2.2区块链的网络层
区块链的网络层包括分布式组网机制、数据传播机制和数据验证机制等,由于采用了完全P2P的组网技术,也就意味着区块链是具有自动组网功能的。
这种P2P组网技术,在早先应用于BT(比特流)和eMule(电驴)之类的P2P下载软件中,也是一种相对于来说非常成熟的技术。
1.2.3区块链的共识层
区块链的共识层主要封装网络节点的各类共识机制算法。
共识机制算法是区块链技术的核心技术,因为这决定了到底由谁来进行记账,记账者选择方式将会影响整个系统的安全性和可靠性。
目前已经出现了十余种共识机制算法,其中最为知名的有工作量证明机制、权益证明机制、股份授权证明机制等。
1.3激励层、合约层与应用层
1.3.1区块链的激励层
区块链的激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制,该层主要出现在公有链中,因为在公有链中必须激励遵守规则参与记账的节点,并且惩罚不遵守规则的节点,才能让整个系统朝着良性循环的方向发展。
所以激励机制往往也是一种博弈机制,让更多遵守规则的节点愿意进行记账。
而在私有链中,则不一定需要进行激励,因为参与记账者的节点往往是在链外完成了博弈,也就是可能有强制力或者有其它需求来要求参与者记账。
1.3.2区块链的合约层
区块链的合约层主要封装各类脚本、算法和智能合约,是区块链可编程特性的基础。
以以太坊为首的新一代区块链系统试图完善比特币的合约层。
比特币尽管也包含了脚本代码,但并不是图灵完备的,即不支持循环语句;
以太坊在比特币结构基础上,内置了编程语言协议,从而在理论上可以实现任何应用功能。
如果把比特币看成是全球账本的话,那么就可以把以太坊看作是一台“全球计算机”---任何人都可以上传和执行任意的应用程序,并且程序的有效执行能够得到保证。
1.3.3区块链的应用层
区块链的应用层则封装了区块链的各种应用场景和案例,比如搭建在以太坊上的各类区块链应用就是部署在应用层,所谓可编程货币和可编程金融也将会搭建在应用层。
该模型中,基于时间戳的链式区块结构、分布式节点的共识机制、基于共识机制的经济激励和灵活可编程的智能合约是区块链技术最具代表性的创新点。
其中数据层、网络层和共识层是构建区块链应用的必要因素,否则将不能称之为真正意义上的区块链。
而激励层、合约层和应用层则不是每个区块链应用的必要因素,有部分的区块链应用并不完整的包含着这三层结构。
第2章区块概念及识别
2.1区块与区块头
2.1.1区块及其数据结构
区块是区块链的基本组成单元,它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。
区块不断地被各个矿工节点(如比特币)计算出来并链接到区块链上,从而构成了区块文件,一旦键接成功,就再也不能改变和删除。
一个区块的基本数据结构如表1-1:
表1-1:
区块的基本数据结构
大小
字段
描述
4字节
区块大小
用字节表示的该字段之后的区块大小
80字节
区块头
区块头的组成字段
1〜9字节
交易计数器
交易的数量(可变整数)
可变的
交易
记录在区块里的交易详细信息
2.1.2区块头及其数据结构
在区块的数据结构中,能够与其他区块联系和链接起来的信息存放在“区块头”中。
区块头由三组区块元数据(Blockmeta)组成。
首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。
第二组元数据,即难度、时间戳和随机数(Nonce),与挖矿竞争相关。
第三组元数据是Merkle树根,一种用来有效地总结区块中所有交易的数据结构(后面章节将详细讲解)。
区块头的基本数据结构如表:
表:
区块头的数据结构
版本
用以跟踪软件或协议的更新
32字节
父区块哈希值
引用上一区块的哈希值
Merkle根
该区块中交易的Merkle根的哈希值
时间戳
该区块产生的近似时间(精确到秒的UNIX时间戳)
难度目标
该区块工作量算法的难度目标
随机数(Nonce)
用于工作量证明算法的计数器
2.2区块的识别
2.2.1区块哈希值及其识别
区块可以通过两种方式被识别:
区块哈希值或者区块高度。
所以区块哈希值和区块高度是区块的识别符。
区块主标识符是它的加密哈希值,是一个通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。
产生的32字节哈希值被称为区块哈希值。
实际上,由于只有区块头被用于计算,所以区块哈希值严格的名称是区块头哈希值。
如第一个比特币区块的区块哈希值为:
000000000019d6689c085ae165831e934ff763ae46a2a6ce72b3f1b60a8ce26f。
区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。
注意,在区块的数据结构里并不包含区块哈希值,不管是该区块作为区块链的一部分被永久性地存储在某节点上,抑或是该区块在网络上传输。
区块的哈希值可能会作为区块元数据的一部分被存储在一个独立的数据库表中,以便于索引和更快地从磁盘检索区块,它是当该区块从网络被接收时由每个节点计算出来的。
2.2.2区块高度及其识别
通过区块在区块链中的位置即“区块高度(BlockHeight)”也可以识别区块,比如第一个比特币区块的高度为0,对应的哈希值为:
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3feb60a8ce26f。
区块高度表明:
后一个被存储在前一个区块之上的区块在区块链中都比前一个区块“高”出一个位置,就像砌围墙,砖块一个接一个堆叠在其他砖块之上一样。
和区块哈希值不同的是,虽然一个单一的区块总会有一个固定、明确的区块高度,但是,反过来却并不成立。
两个或两个以上的区块也可能有相同的区块高度,在区块链里争夺同一位置。
所以,一个区块的区块哈希值总是能唯一地识别出一个特定的区块,但是,一个区块高度虽然能够识别区块,但是却不一定能识别出唯一的特定区块。
当然,区块高度也不是区块数据结构的一部分,它并不被存储在区块里。
当节点接收来自比特币网络的区块时,会动态地识别该区块在区块链里的位置(区块高度)。
区块高度也可作为元数据存储在一个索引数据库表中以便快速检索。
第3章创世区块与区块的连接
3.1创世区块及其数据
3.1.1创世区块的诞生
2008年10月31日,纽约时间下午2点10分,在一个普通的密码学邮件列表中,几百个“密码朋克”成员均收到了自称是中本聪的人的电子邮件:
“我一直在研究一个新的电子现金系统,这完全是点对点的,无需任何可信的第三方”。
然后他将他们引向一个9页的白皮书,其中描述了一个新的货币体系。
同年11月16日,中本聪发放出了比特币代码的先行版本。
2009年1月3日,中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出了比特币的第一个区块——创世区块(GenesisBlock),并获得了50个比特币的“首矿”奖励。
3.1.2创世区块的数据与信息
创世区块是区块链里面所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将到达创世区块。
每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。
因此,每个节点都把该区块作为区块链的首区块,从而构建了一个安全的、可信的区块链的根。
所以每一个节点都永远包含创世区块,这个不会被改变。
在chainparams.cpp里可以看到创世区块被编入比特币核心客户端里。
该创世区块的哈希值为000000000019d6689c085ael65831e934ff763ae46a2a6cl72b3flb60a8ce26f。
我们可以在任何网站(如blockchahi.info)搜索这个区块哈希值,就会发现描述这一区块内容的页面:
https:
//blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
在命令行使用比特币核心客户端:
$bitcoindgetblock000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
"
hash"
:
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
"
confirmations"
308321,
size"
285,
height"
0,
version"
1,"
merkleroot"
4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
tx"
["
],"
time"
1231006505,
nonce"
2083236893,
bits"
1d00ffff"
difficulty"
1.00000000,"
nextblockhash"
00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
}
创世区块在其币基(CoinBase)交易的输入中,中本聪当时写下了这样一句话:
“TheTimes03/Jan/2009Chancelloronbrinkofsecondbailoutforbanks(2009年1月3日,财政大臣正处于实施第二轮银行紧急援助的边缘)。
”
这句话是当天泰晤士报头版头条的标题。
当时正是英国的财政大臣达林被迫考虑第二次出手纾解银行危机的时刻。
这句带有时间戳的话不但清晰地展示了比特币的诞生时间,还表达着对旧有金融体系的嘲讽和宣战,非常耐人寻味。
3.2区块的连接
3.2.1区块的连接
以比特币的区块为例,来说明这一问题。
比特币完整节点保存了区块链从创世区块起的一个本地副本。
随着新的区块的产生,该区块链的本地副本会不断地更新用于扩展这个链条。
当某个节点从网络接收到传入的区块时,它会验证这些区块,然后链接到现有的区块链上。
为建立这个连接,该节点将检查传入的区块头并寻找该区块的“父区块哈希值”。
例如,某个节点在区块链的本地副本中有277,314个区块。
该节点知道最后一个区块为第277,314个区块,这个区块的区块头哈希值为:
00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249。
然后该比特币节点从网络上接收到一个新的区块。
对于这一新的区块,节点会在“父区块哈希值”字段里找出包含它的父区块的哈希值。
这是节点已知的哈希值,也就是第277314块区块的哈希值。
所以,这个区块是这个链条里的最后一个区块的子区块,于是现有的区块链得以扩展。
节点将新的区块添加至链条的尾端,使区块链变长到一个新的高度277,315。
图:
显示了通过“父区块哈希值”字段进行连接的三个区块的链。
图区块的连接方式
3.2.2区块链的构造及过程
以比特币为例,换一角度来说明区块链构造过程,如图1-1:
平均每10分钟由“矿工”竞争而产生一个新的区块,并把这段时间内的多笔事务记录到这个新区块中。
单笔事务写入比特币区块链至少需要10分钟。
目前每个区块大小限制为1MB,最多能记录约4000笔的事务。
比特币区块链最大写入性能大约只有7笔/秒。
为了防止该区块因为子链太短而被其它节点抛弃,需要等待产生6个新的后续区块,才能最终确认该事务已经被可靠地写入区块链中。
确保可靠写入需要约60分钟。
每个参与节点都可以保存整个区块链的副本。
只要有参与节点存在,区块链数据就不会丢失。
图1-1:
区块链的构造示意
区块链上的每个区块都可以用来记录货币、股权、债券、数字签名、数字合约,或其它任何数字化内容。
在全球网络下,由无数独立的计算机来维护、更新和核查,确保记账结果的公平、公正和公开透明,而无需任何中心化机构的审核和维护。
第4章区块链的数据结构
4.1结构基础及其讲解思路
4.1.1区块链的数据结构基础
区块链的数据结构是在哈希算SHA-256的算法(将专章讲述)支持下实现的;
而在进行区块对交易的封装过程中,采用高效的梅克树(MerkleTree)算法(将专章讲述)一步一步地将繁杂的信息进行归纳和简化;
同时,为了保证区块的顺序链接,需要采用“时间戳(TimeStamp)机制”在区块中写人时间参数;
最后,为了保证共识机制达成,使全网参与的“挖矿”工作顺利进行,系统在共识机制PoW下采用了难度目标(DifficultyTarget)和随机数(Nonce)两种设计,保证系统在一个可靠的区间内运转。
如图1-1:
图1-1:
区块链数据结构的基础
由于区块链的数据结构是由一些基础技术形成的元数据组成的,要想真正深入了解区块链,需要进人到每一个基础技术模块,了解其概念和来源。
以下将分别对每一模块进行讲解。
本章涉及哈希值(对其形成的哈希算法,将在“密码机制与算法”模块部分详解),梅克尔根(对其形成的梅克尔树及机制,将在“密码机制与算法”模块部分详解),时间戳、难度目标(即难度)。
这些数据都储存在区块头中。
4.2哈希值、Merkle根等数据及作用
4.2.1哈希值及其构成区块链的数据结构
区块链数据结构中的重要内容之一。
这里必须提到哈希算法(将在区块链密码算法中用一章内容来专门讲述)。
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。
哈希值是一段数据唯一且极其紧凑的数值表示形式。
如果一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。
也就是说,要找到哈希值相同的两个不同的输人,在计算上是不可能的。
哈希值就是有如文件的身份证,不过比身份证还严格,所以数据的哈希值可以检验数据的完整性。
哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据,由此,哈希算法和哈希值一般用于快速查找和加密算法。
在区块链的比特币运用中,使用的是SHA-256的哈希算法。
在区块链技术中,包括文档、图片、视频、音频等原始的任意长度的数据文件,经过哈希算法后,便可以压缩成为固定长度的二进制值,所以,哈希算法本质上是一个数据压缩的过程,而且其具有不可逆性,即可以通过哈希值访问到原来的数据。
哈希算法应用在区块中,既减小了区块存储的数据量,同时也不影晌对数据的链接访问,所以成为区块链中的一项重要基础技术。
4.2.2Merkle根及其构成区块链的数据结构
Merkle根是区块链数据结构的重要组成部分,这是因为:
在区块链中,每个数据区块包含区块头和区块体。
区块头封装了当前版本号、前一区块哈希值、当前区块PoW要求的随机数(Nonce)、时间戳以及Merkle根信息。
其中的Merkle根就与区块体中梅克尔树联系上了。
区块体则包括当前区块经过验证的、区块创建过程中生成的所有交易记录。
这些记录就是通过Merkle树的哈希过程生成唯一的Merkle根后,并记入到了区块头中。
Merkle根,是指梅克尔数(Merkletree)的根,因为梅克尔树在计算的过程中主要用到哈希算法,或又可称之为MerkleHashTree的根。
要理解Merkle根,先要理解Merkletree这个将在密码算法章节详细讲述。
4.3难度确认、运行及其作用
4.3.1区块链数据结构中的难度目标及作用
区块头中的难度目标与工作量证明机制(pow)有关,这一机制本书将在“共识机制与算法”部分用一章来详细讲解。
这里只谈其余难度目标的关系。
在区块链中,工作量证明机制(pow)是一个可以让每个参与的节点共同参与交易验证的方式,来实现一个多方共同维护并共享同一份记录交易的账本,以形成一个基于零信任基础、去中心化的P2P网络系统。
工作量证明是让任一参与的节点,花费时间和运算资源来计算出一组数学公式的结果,一旦这个数值被计算出来,其他参与节点也可用相关的数学公式,便能很容易去验证这个值是否有效。
进行PoW计算的过程也被形象地称作“挖矿”,参与的节点被称作“矿工”,其过程如下:
每个区块的区块头中会包含许多固定值,其中只有随机数(Nonce)值为随机值。
因此每个节点进行PoW计算时,通过不断替换这个Nonce值,来让这个区块的区块头哈希值,小于一个被设定好的难度目标值(小于这个目标值的原因是为了使每个区块在理论上可以完成计算)。
当最接近难度目标值的哈希值产生后,该矿工可以向全网广播,如果同一时间获得超过51%的节点认可,意味着该矿工完成了一个新区块,可以将其链接到区块链上。
其他矿工再以这一个区块为父区块,进行下一个区块的运算。
这就是难度目标的意义与作用。
4.3.2区块链数据结构中的难度值及其作用
区块链中的难度值,是指节点要运算出低于难度目标值的哈希值,平均需花多长时间,也就是平均要完成一次PoW所用的时间。
如区块链最初的运用比特币,目前设定为平均每10分钟,节点会成功算出新的区块。
当然,这10分钟仅仅只是个理论平均值,而实际中每个新区块产生的时间是不一样的,比如第407068个区块的实际产生时间是20分钟以上,而第407062个区块的实际产生时间只需要17秒。
比特币的难度值是可以动态调整的,目前每产生2016个区块会调整一次难度,以每10分钟产生一个区块估算,大约是每两周会调整一次难度。
难度的调整是在每个完整节点中独立自动发生的,每达到2016个区块后,所有节点都会按统一的公式自动调整难度。
这个公式是由最新2016个区块的花费时长与期望时长比较得出的。
期望时长按每个区块10分钟计算,总时长为20160分钟,相当于两周。
根据实际“挖矿”时长与10分钟的期望时长的比值,对运算的难度进行相应调整(或变难或变易)。
如果2016个区块中每个区块产生的速率比10分钟慢的话,说明运算的难度过大,需降低难度,反之,每一个产生的速率比10分钟快,说明运算难度小,需要增加难度。
通过动态调整难度,既可以保证不会大批量的区块产生,又保证了交易所需的区块数量。
4.3.3难度目标与新难度值的计算
公式的形式如下:
新难度值=旧难度值x(20160分钟/过去2016年区块花费时长)
工作量证明需要有一个目标值。
比特币工作量证明的目标值(Target)的计算公式如下:
目标值=最大目标值/难度值
其中,最大目标值为一个恒定值:
=0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 区块 基础 讲座 系统 构架 数据结构 运行机制 详解 15