区块链自问自答 day1
区块链自问自答 day1
简要介绍区块链是什么?
区块链(Blockchain)是一种对等网络下的分布式数据库系统
数据结构中的单向链表是通过每个节点包含一个节点的指针实现”链“结构,区块链中是通过后一个区块包含上一个区块的的信息形成”链“式结构,因此若想修改链中的区块内容就需要同时修改此区块所链接的之后所有区块,导致了想修改链中的区块内容难度巨大,难度随后续链接的区块数量增加。
区块链的结构是什么样的?
区块链中的单个区块结构主要分为两个部分:
- 区块头
- 版本号
- 上一个区块散列值
- 时间戳
- 随机数
- 目标值
- Merkle根
- 区块体
- 交易个数
- 交易信息和Merkle树
# 比特币区块结构
class 区块的数据结构:
神奇数 = 4 byte # 区块之间的分割符
区块大小 = 4 byte # 记录当前区块的大小
数据区块头部信息 = 80 byte # 记录当前区块的头部信息,其Hash值是下一个新区块的参数
class 区块头数据结构:
版本号 = 4 byte # 数据块的版本号
前一个区块的信息 = 32 byte # 记录前一个数据区块的Hash值,当前区块的Hash值一定比它小
Merkle树的根值 = 32 byte # 记录当前区块中所有交易Merkle树根节点的Hash值
时间戳 = 4 byte # 记录当前区块的生成时间,按照Unix时间格式
目标值 = 4 byte # 当前区块生成所达到目标值的特征,用于矿工的工作量证明
随机数 = 4 byte # 当前区块工作量证明的参数
交易计数 = 1~9 byte # 当前区块所记录的交易数
交易详情 = 变长 # 记录当前区块保存的所有交易细节
中本聪最初将区块的容量上限设定为1 MB,1 MB大小相当于平均每秒可以处理7次交易,每一个区块可以容纳4000余次交易。
另外每个区块都有区块高度和区块散列,不过这两个标识并不储存在区块结构中,每个区块只存储父区块的散列,新区块生成后,节点才会计算上一个区块的散列和高度,并将这两个数据维护在单独的表中。
交易中保存了什么信息?
每一笔交易记录包含:
- 交易生成时间
- 引用交易的散列值
- 交易记录索引号
- 比特币支出地址内容
- 支出地址数量
- 。。。。。。
每笔交易记录各自有一个Merkle节点值,是整个Merkle树的一部分,决定了每一个地址都不能重复交易和被伪造。
什么是神奇数?
在比特币区块链中,多个区块存放在同一个文件中,使用神奇数作为区块数据的分隔符。每个区块数据都是以神奇数开始,这个数值在正式网络中是0xD9B5BEF9,测试网络中是0x0709110B。
为什么需要版本号?
一条区块链上的区块随着版本升级会存在不同版本的区块,比特币的版本号2中的Coinbase加入了块高度,这样就保证接下去的每一个块的散列是唯一的,因为每个区块的高度不同直接导致了散列值不同。
什么是Coinbase?
Coinbase是每个区块都有的一笔初始交易,是给矿工挖出此区块的奖励。
什么是散列值?
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。——维基百科
散列函数的性质:
- 单向性。即不可逆,给定明文可以计算出散列值,但是给定散列值不能计算出明文。
- 抗碰撞。不同明文使用同一种散列函数很难得到相同的散列值。
- 抗篡改。两个不同明文只要有很小的区别,得出的散列值差别也会很大。
- 散列值长度固定。不同散列函数计算出的散列值都是有固定长度的。
比特币中使用什么hash算法?
比特币常用SHA-256是安全散列算法2(Secure Hash Algorithm 2,SHA-2)的一种算法标准,后缀256代表散列值的长度是256bit。在比特币中常连续使用两次SHA256算法处理数据,因此称作double-SHA256。
什么是Merkle树?
梅克尔(Merkle)树是一种散列二叉树,它是一种用作快速归纳和校验大规模数据完整性和数据结构。在比特币中Merkle树用来归纳一个区块中的所有交易,然后生成整个交易集合的数字指纹(散列值,root)。Merkle树还可以高效地校验区块中是否存在某笔交易。
在比特币中Merkle树的叶子节点是每笔交易信息的散列值的散列值,若有一笔交易信息TxA则该笔交易信息在Merkle树中的散列值为Hash(TxA)=SHA256(SHA256))。之后将相邻叶子节点的散列值串联再次进行double-SHA256。循环往复直到计算出最后的Merkle树的根(root),若叶子节点(交易数)为奇数则复制最后一个叶节点,再同偶数形式一样,逐层计算。
为什么要使用Merkle树?
使用Merkle树能够实现中本聪描述的简化支付验证(SPV)这个概念:无须下载每一笔交易以及每一个区块,一个轻客户端(Light Client)仅需下载链的所有区块头,即可确定一笔交易的状态。
通过Merkle树对交易信息进行了压缩,可以快速的确认接受的数据是否是虚假的或损坏的。如从一个节点获取了一笔交易信息,我们就能够向保存了完整区块的可信节点申请传输Merkle计算过程中会使用到的散列值,就能确定这笔交易是否真的存在。
当我们拿到了交易K的数据要验证K是否存在,就只需向全节点请求图中橙色节点散列值,验证流程
KL = hash(K,L)
IJKL = hash(IJ,KL)
IJKLMNOP = hash(IJKL,MNOP)
ABCDEFGHIJKLMNOP = hash(ABCDEFGH,IJKLMNOP)
if ABCDEFGHIJKLMNOP == Merkle root:
return 交易存在
如存在16笔交易信息,需要验证其中一笔交易是否存在只要请求log16=4个散列值即可。因此使用Merkle树结构大大减少了要达到证明数据完整性所需的数据量,减少了维护一致性、数据校验以及数据同步所需的网络I/O数据包大小。
区块链的特点有什么?
区块链具有去中心化、有限透明、分布的可靠数据库、自治性、记录难以更改、准匿名性等特点,其说明如下。
去中心化:区块链数据的存储、传输、验证等过程均基于分布式的系统结构,整个系统中不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等的,系统中的数据块由整个系统中具有维护功能的节点共同维护。
有限透明:系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用。
分布的可靠数据库:区块链系统的数据库采用分布式存储,任意参与的节点都可以拥有一份完整的数据库复制,每一方都可以直接验证交易各方的记录。
自治性:区块链采用一种基于协商一致的规范和协议(如一套公开透明的算法)使整个系统中的所有节点能够在去信任的环境下自由安全地交换数据,这使对”人“的信任变成对机器和算法的信任,无须人为干预。
记录难以更改:一旦信息经过验证并添加至区块链,账户信息就会相应进行更新,记录就再难改变,因为这些信息和此前的所有交易记录相互关联(即术语”链“的来源)。系统中采用的各种计算算法和方法用来确保数据库中的记录是永久存在的、按照时间顺序排序,并且网络中的所有其他人都是可以看到的,除非能够同时控制系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,参与系统的节点越多,数据库的安全性就越高。并且,区块链数据的存储还带有时间戳,从而为数据添加了时间维度,具有极高的可追溯性。因此,区块链的数据稳定性和可靠性极高。
准匿名性:区块链系统采用与用户公钥挂钩的地址作为标识,不需要传统的基于公钥基础设施(Public Key Infrastructure,PKI)的第三方认证中心(Certificate Authority,CA)颁发数字证书来确认身份。通过在全网节点运行共识算法,建立网络中诚实节点对全网状态的共识,间接地建立了节点间的信任。用户只需要公开地址,不需要公开真实身份,而且同一个用户可以不断变换地址。因此,在区块链交易上的交易不和用户真实身份挂钩,只和用户的地址挂钩,具有交易的准匿名性。