第一章:区块链基本知识
1.区块链概念
顾名思义,“区块链”是一个链表,这个链表由所有人共同维护和认可。
1.1.什么是区块链
区块链(Block chain)是一种分布式共享数据库(数据分布式储存和记录),利用去中心化和去信任方式集体维护一本数据薄的可靠性的技术方案。
如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。
1.2.区块链的特点
区块结构有两个非常重要的特点:
l每个区块的块头包含了前一区块的交易信息的压缩值,因此从创始块到当前区块形成了链条。
l每个区块主体上的交易记录是前一区块创建后、该区块创建前发生的所有价值交换活动。
1.3.区块链节点(以比特币网路为例)
任何机器都可以运行一个完整的比特币节点,一个完整的比特币节点包括如下功能:
•比特币钱包:允许用户在比特币网络上进行交易;
•完整区块链:记录了比特币历史上的所有交易,通过特殊的结构保证历史交易的安全性,并且用来验证新交易的合法性;
•矿工:通过记录交易及解密数学题来生成新区块,如果成功可以赚取奖励;
•路由功能:把其它节点传送过来的交易数据等信息再传送给更多的节点。
在比特币网络中的节点,除了路由功能以外,其它的功能都不是必须的,有的节点只有钱包功能,有的节点只负责挖矿。
1.4.新区块如何产生
•网络中的所有节点都会通过解数学题争取得到创建当前区块的权利;
•当一个节点解题成功后,就会把题的答案和构建的区块通过比特币网络发送给其它节点;
•其它节点只要验证通过了这个答案,就会立刻停止自己创建当前区块的努力,把传过来的区块加到本地区块链中,然后根据这个区块的区块头的哈希值填充下一个区块的区块头中的信息,立刻开始下一个区块的构建。
这样,网络中就完成了一个区块链中新区块的构建过程。
2.区块结构
整个区块数据包结构如下图:
具体字段含义描述如下:
子结构名称 | 作用说明 | 大小 |
---|---|---|
神奇数 | 神奇数总是等于0xD9B4BEF9,作为区块之间的分隔符 | 4字节 |
区块大小 | 记录了当前区块的大小 | 4字节 |
数据区块头部信息 | 记录了当前区块的头部信息,其HASH值是下一个新区块的参数 | 80字节 |
交易计数 | 当前区块所记录的交易数 | 1-9字节 |
交易详情 | 记录了当前区块保存的所有交易细节 | 无特定参考值 |
备注:由于区块中的交易记录很多导致区块的数据很大,所以区块主体只负责记录交易信息,而区块链的大部分功能都是由区块头实现的。
2.1.区块头结构
子结构名称 | 作用说明 | 大小 |
---|---|---|
版本号 | 数据区块的版本号 | 4字节 |
前一个区块的记录 | 记录了前一个数据区块的HASH值,当前区块的HASH值一定比它小 | 32字节 |
Merkle树的根值 | 记录了当前区块中所有交易Merkle树的根节点的HASH值 | 32字节 |
时间戳 | 记录了当前区块生成的时间,按照UNIX时间格式 | 4字节 |
目标值 | 当前区块生成所达成目标值的特征,用于矿工的工作量证明 | 4字节 |
随机数 | 当前区块工作量证明的参数 | 4字节 |
2.2.交易记录结构
子结构名称 | 作用说明 | 大小 |
---|---|---|
版本 | 该比特币协议的版本号 | 4字节 |
支出交易数量统计 | 记录了当前区块中所记录的支出交易数量 | 大于1字节 |
比特币支出地址详情 | 记录了当前区块中比特币支出地址的信息 | 大于40字节 |
比特币接收地址详情 | 记录了当前区块中比特币接收地址的信息 | 大于40字节 |
接收交易数量统计 | 记录了当前区块中所记录的接收的交易数量 | 大于1字节比特 |
交易时间戳 | 以UNIX时间格式记录了当前区块中所记录交易被P2P网络确认的时间 | 4字节 |
每个区块至少有一个coinbase交易记录,用来对产生区块的奖励(挖矿奖励),如果该区块产生时还容纳了其它交易记录,则还可以得到交易佣金,在挖矿奖励每4年下降一半的情况下,交易佣金是目前挖矿者的主要收入来源。
2.3.交易地址生成规则
首先从下图了解大致步骤:
第一步,随机选取一个32字节的数、大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥。
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
第二步,使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)关于公钥压缩、非压缩的问题另文说明。
0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B
23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
第三步,计算公钥的 SHA-256 哈希值
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
第四步,取上一步结果,计算 RIPEMD-160 哈希值
010966776006953D5567439E5E39F86A0D273BEE
第五步,取上一步结果,前面加入地址版本号(比特币主网版本号“0x00”)
00010966776006953D5567439E5E39F86A0D273BEE
第六步,取上一步结果,计算 SHA-256 哈希值
445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
第七步,取上一步结果,再计算一下 SHA-256 哈希值(哈哈)
D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
第八步,取上一步结果的前4个字节(8位十六进制)
D61967F6
第九步,把这4个字节加在第五步的结果后面,作为校验(这就是比特币地址的16进制形态)。
00010966776006953D5567439E5E39F86A0D273BEED61967F6
第十步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)。
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
我们经常说的比特币公钥就是指的图中第二步所产生的结果。而HASH160指的是第四步RIPEMD160签名所产生的结果,由于RIPEMD也是一种HASH算法所以就统称为HASH160了。而我们常用的比特币地址就是经过BASE58编码后的结果。
比特币客户端和钱包也接受各种比特币地址格式,常用的格式有BASE58格式、WIF压缩格式、130位和66位公钥(Public key)格式。
2.4.交易是如何纳入一个区块中的
•新的交易向全网进行广播;
•每一个节点都将收到的交易信息纳入一个区块中;
•每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
•当一个节点找到了一个工作量证明,它就向全网进行广播;
•当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
•其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值。
3.数字签名定义
每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key) 签署一个随机散列的数字签名,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者。而收款人通过对签名进行检验,就能够验证该链条的所有者。
4.时间戳服务器
•时间戳服务器通过对以区块(block)形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播。
•时间戳能够证实特定数据必然于某特定时间存在,因为只有在该时刻存在才能获取相应随机散列值。
•每个时间戳将前一个时间戳纳入其随机散列值中,增强的时间戳形成一个链条(Chain)。
5.工作量证明
•在进行随机散列运算时,工作量证明机制引入了对某一个特定值的扫描工作,比方说SHA-256下,随机散列值以一个或多个0开始。那么随着0的数目的上升, 找到这个解所需要的工作量将呈指数增长,而对结果进行检验则仅需要一次随机散列运算。
•在区块中补增一个随机数(Nonce),这个随机数要使得该给定区块的随机散列值出现了所需的那么多个0。
•由于之后的区块是链接在该区块之后的,所以想要更改该区块中的信息,就还需要重新完成之后所有区块的全部工作量。
6.Merkle树
默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。典型应用场景:
•快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
•快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root --> N4 --> N1,可以快速定位到发生改变的 D1。
•零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知其它内容。
6.1.Merkle根计算
因为Merkle树是二叉树,所以它需要偶数个叶子节点。如果仅有奇数个交易需要归纳,那最后的交易就会被复制一份以构成偶数个叶子节点。
6.2.如何利用Merkle数回收硬盘空间
可以将不影响Merkle根生成的记录进行删除,不影响最终Merkle根的计算和验证。
7.难度值
难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
每个节点通过将记录在每个区块中的难度加总起来,得到建立这个链所要付出的工作量证明的总量。每个节点总是选择并尝试延长代表累计了最大工作量证明的区块链,也就是最长的或最大累计难度的链。
7.1.目标值
表示法:目标HASH值的压缩格式是一个特殊的浮点编码类型,首字节是指数(仅使用了5个最低位),后3个字节是尾数,它能表示256位的数值。一个区块头的SHA256值必定要小于或等于目标HASH值,该区块才能被网络所接受,目标HASH越低,产生一个新区块的难度越大。
例如,在block中被打包的target为:0x1b0404cb,那么这个十六进制的目标HASH值即是:
0x0404cb * 2^(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
尾数:0x0404cb部分是一个有符号数据,最大的合法值为0x7fffff,最小的正的合法值为0x008000。
7.2.难度值和目标值换算公式
难度值公式:
新难度值=旧难度值/(过去2016个区块花费分钟/20160分钟)
(为了防止难度变化过快,每个周期也就是2016个区块,调整幅度必须小于4倍)
目标值公式:目标值=最大目标值/难度值
挖矿机采用非截断类型,最大目标值表示为:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
比特币网络使用浮点编码类型,后面的位数被缩短:0x00000000FFFF0000000000000000000000000000000000000000000000000000
一个区块产生的时间:难度1的偏移量:0x00ffff * 2^(0xld-3),找到新区块,计算的HASH数:2^256/(0x00ffff * 2^(0xld-3))
耗时估计=难度值*2^32/hashrate (hashrate:每秒运算的hash次数)
8.区块链的分叉
节点维护三种区块:
•第一种是连接到具有最多难度的(主链)。
•第二种是从主链上产生分支的(备用链)。
•最后一种是在已知链中没有找到已知父区块的(孤块池)。
在验证过程中,一旦发现有不符合标准的地方,验证就会失败,这样区块会被节点拒绝,所以也不会加入到任何一条链中。
挖矿节点通过“投票”来选择它们想要延长的区块链,当它们挖出一个新块并且延长了一个链,新块本身就代表它们的投票。
8.1.区块链的分叉:统一状态
网络中有一个统一的区块链视角,以蓝色区块为主链的“顶点”
8.2.区块链的分叉:分叉前
两个矿工几乎同时挖到了两个不同的区块。这两个区块是顶点区块——蓝色区块的子区块,可以延长这个区块链。
8.3.区块链的分叉:定点分歧
当这个两个区块传播时,一些节点首先收到“红色”区块,一些节点收到“绿色”区块于是对于区块链的顶点产生了分歧,一派以红色区块为顶点,而另一派以绿色区块为顶点。
8.4.区块链的分叉:分叉并切换主链
网络中的一部分算力专注于“红色”区块为父区块,在其之上建立新的区块;另一部分算力则专注在“绿色”区块上。工作在“绿色”区块上的矿工找到了一个“粉色”区块延长了区块链(蓝色-绿色-粉色),他们会立刻传播这个新区块,整个网络会都会认为这个区块是有效的。
9.拜占庭将军问题
N个将军被分隔在不同的地方,忠诚的将军希望通过某种协议达成某个命令的一致(譬如进攻或后退)。但其中有F个背叛的将军会通过发送错误的信息阻挠忠诚的将军达成命令上的一致。Lamport证明了在将军总数N大于3F时,忠诚的将军可以达成命令上的一致。
•每个忠诚的将军收到相同的命令v(i),其中v(i)是第i个将军发送的命令。
•如果第i个将军是忠诚的,那他发送的命令和每个忠诚的将军收到的命令v(i)相同。
9.1.解决办法
N ≥ 3F 1
•N:计算机总数
•F:有问题计算机总数
信息在计算机间互相交换后,各计算机列出所有得到的信息,以大多数的结果作为解决办法。
9.2.解决示例1
有四部计算机,全部正常。
N = 4,F = 0:
4 ≥ 3(0) 1 是成立,故能得到一致性。
例子 1 | ||
---|---|---|
得到的信息 | 结果 | |
计算机A | O O O O | O |
计算机B | O O O O | O |
计算机C | O O O O | O |
计算机D | O O O O | O |
9.3.解决示例2
有四部计算机,其中一部是有问题的。
N = 4,F = 1:
4 ≥ 3(1) 1 是成立,故仍然能得到一致性。
例子 2 (计算机D = X) | ||
---|---|---|
得到的信息 | 结果 | |
计算机A | O O O X | O |
计算机B | O O X O | O |
计算机C | O X O O | O |
计算机D | X O O O | O |
9.4.解决示例3
有问题计算机的总数可能在交换讯息时上升,其中两部出现错误。
N = 4,F = 2:
4 ≥ 3(2) 1 是不成立,故不能得到一致性。
例子 3 (计算机C, D = X) | ||
---|---|---|
得到的信息 | 结果 | |
计算机A | O O X X | ? |
计算机B | O X X O | ? |
计算机C | X X O O | ? |
计算机D | X O O X | ? |
第二章:区块链应用场景
1.金融领域
2.非金融领域
3.行业应用比较
主要应用领域 | 应用前 | 应用后 |
---|---|---|
金融业(银行、支付转账、股票交易等) | 流程复杂;中心化数据存储;第三方担保 | 简化流程;分布式存储,安全性提升;无需第三方,降低成本 |
网络安全 | 中心服务器存储数据、转移和传递 | 信息传播路径改变,不可拦截 |
身份信息管理 | 银行、信息卡身份识别过程繁琐;身份信息易被盗用 | 简化识别过程;加强身份信息 |
公证 | 需要政府、公信力第三方提供背书 | 数字加密作信用背书,自动完成公证;永久保存资料 |
投票 | 机票可能存在伪造;选民身份信息保护环节较弱 | 过程全网公开;选票可追溯;选民身份保密性好 |
供应链 | 低效、产品做假、低质量风险高 | 供应链各环节诚信保证高;产品信息可追溯,质量可保证 |