区块链100问之数据结构
文章目录
区块链的宏观架构是什么?
答:架构通常被分为6层:
数据层;网络层;共识层;激励层;合约层;应用层
区块链的链式结构有什么特点?
答:区块链是包含交易信息的区块,并且后一个区块有前一个区块的信息(通俗的说,后一个区块指向前一个区块)
- 不可篡改性:一旦数据被记录在区块中,就很难被修改或删除。链条中的每个块都包含前一个块的哈希值,因此任何对先前数据的更改都会导致后续区块的哈希值变化。
- 分布式存储:区块链的数据不是保存在单一的中心服务器上,而是分散在多个节点上,每个节点都有一份完整的数据副本。
- 去中心化:区块链的每个节点都保留一份完整的账本副本,不依赖于中心化服务器。
- 透明性:所有交易记录对网络中的所有参与者可见。任何人都可以查看区块链上的交易历史。
如何区分不同的区块?
答:可以通过比特币高度和区块头哈希值
-
height≈index:指该区块在区块链中的位置
-
One block has one height 单一的区块总是会有一个明确的、固定的区块高度,但反过来却并不成立,一个区块高度并不总是识别一个单一的区块
-
二般情况在一段时间内,两个或两个以上的区块可能有相同的区块高度,在区块链里争夺同一位置。
-
创世区块高度:0
-
-
Hash:SHA256(SHA256(区块头))
二次哈希计算而得到的数字,区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。
区块的内部结构是什么?
答:
区块是区块链的基本组成单元,包含:区块大小(4B)+交易数量(1-9B)+区块头(80B)+区块体(1MB)
其中十分重要的区块头包含:
字段 | 大小 | 说明 |
---|---|---|
父区块哈希值Pre Hash | 32 | 上一区块的哈希值 |
版本号Version | 4 | 区块头的版本号(存在相应协议) |
时间戳TimeStamp | 4 | 区块创建的时间戳1970-1-1 |
难度值 Bits | 4 | 记录了该区块PoW的难度 |
随机数Nonce | 4 | 用于PoW的计数器 |
默克尔树Merkle-root | 32 | 记录交易的Merkle root的哈希值 |
注:Bits是难度的简易计法。通过Bits的拆分可以算出Target_Hash,进一步计算Difficulty。下文会详细说明。
挖矿有什么奖励?
答:Block reward 静态奖励(第一笔交易)
- 铸币交易generation transaction
- 币基交易
区块链的难度值怎么变化的?由什么决定的?
答:首先解决上文的问题:Difficulty的算式为:(与创世区块难度有关)
D
i
f
f
i
c
u
l
t
y
=
D
i
f
f
i
c
u
l
t
y
_
1
_
T
a
r
g
e
t
_
H
a
s
h
T
a
r
g
e
t
_
H
a
s
h
Difficulty=\frac{Difficulty\_1\_Target\_Hash}{Target\_Hash}
Difficulty=Target_HashDifficulty_1_Target_Hash
T a r g e t _ H a s h = C o f f c i e n t × 25 6 E x p o n e n t − 3 B i t s = 0 X ( 19 ) ( 03 a 30 c ) 16 进制 C o f f c i e n t = 1 9 16 进制 E x p o n e n t = 03 a 30 c 16 进制 Target\_Hash=Coffcient\times{256^{Exponent-3}}\\ Bits=0X(19)(03a30c) _{16进制}\\ Coffcient=19 _{16进制}\\ Exponent=03a30c _{16进制} Target_Hash=Coffcient×256Exponent−3Bits=0X(19)(03a30c)16进制Coffcient=1916进制Exponent=03a30c16进制
从上式可以看出:
- 区块的Bits字段提供了16进制的因数coff和exp指数
- 通过压缩的Bits字段可以求出目标哈希值
- 进一步就可以知道难度值
三者之间的定性关系为:
B
i
t
s
↑
T
a
r
g
e
t
_
H
a
s
h
↑
D
i
f
f
i
c
u
l
t
y
↓
B
i
t
s
⇔
T
a
r
g
e
t
_
H
a
s
h
Bits↑Target\_Hash↑Difficulty↓\\ Bits⇔ Target\_Hash
Bits↑Target_Hash↑Difficulty↓Bits⇔Target_Hash
随着全网算力的增大,难度值也应该有所调整,这样才能保证平均10min出一个区块不变,如何调整Difficulty?
-
每2016个区块/2周难度调整
-
2016/(6×24)=14天=2周
-
回忆: 每4年/2100万区块比特币奖励减半
N e w D i f f i c u l t y = D i f f i c u l t y × 挖出 2016 区块的理论时间 最近挖出 2016 区块的实际时间 = D i f f i c u l t y × 20160 m i n 最近挖出 2016 区块的实际时间 ( m i n ) New \ Difficulty=Difficulty×\frac{挖出2016区块的理论时间}{最近挖出2016区块的实际时间} =Difficulty×\frac{20160min}{最近挖出2016区块的实际时间(min)} New Difficulty=Difficulty×最近挖出2016区块的实际时间挖出2016区块的理论时间=Difficulty×最近挖出2016区块的实际时间(min)20160min
怎么就算挖矿成功?需要满足什么条件?
答:核心就是计算出的哈希值<目标哈希值
H
a
s
h
=
S
H
A
256
(
S
H
A
256
(
V
e
r
s
i
o
n
+
P
r
e
_
H
a
s
h
+
M
e
r
k
l
e
_
r
o
o
t
+
t
i
m
e
+
D
i
f
f
i
c
u
l
t
y
+
N
o
n
c
e
)
)
<
T
a
r
g
e
t
_
H
a
s
h
Hash=SHA256(SHA256(Version+Pre\_Hash+Merkle\_root+time+Difficulty+Nonce))<Target\_Hash
Hash=SHA256(SHA256(Version+Pre_Hash+Merkle_root+time+Difficulty+Nonce))<Target_Hash
其中:
Target Hash = Maximum Hash / Difficulty
Maximum Hash = 2^256 - 1
目标哈希值越小,挖矿难度越大。
区块出块的过程是什么?
答:某区块加入区块链后,所有矿工立即开始下一个区块的生成工作:
- 把在本地内存中的交易信息记录到区块体中
- 在区块体中生成此区块中所有交易信息的Merkle 树,把Merkle 树根的值保存在区块头中
- 把上一个刚刚生成的区块的区块头的数据通过SHA256算法生成一个哈希值填入到当前区块的父哈希值中
- 把当前时间保存在时间戳字段中,版本号也保存。
- 难度值字段会根据之前一段时间区块的平均生成时间进行调整以应对整个网络不断变化的整体计算总量
- 生成随机数,计算哈希值是否小于目标哈希值
区块链如何实现防篡改的?
- 链式结构:每一个区块都记录父区块的哈希值,当前的字段哈希受到父哈希的影响,任何篡改本区块数据的操作都需要将子区块的数据进行重新计算哈希并修改。(瀑布效应/链式反应)
- 分布式存储:区块链的数据不单一的存储在一个中心服务器上,而是多个节点上,每个节点都有一份完整的数据备份,如果要修改就要修改各个节点上的数据。
- 共识机制:区块链的数据是由网络中的节点共同验证和确认的,每个节点都需要通过一定的算法竞争打包区块的权利。只有当超过51%的节点认同一条数据时,该数据才能被确认并添加到区块链上。因此,想要篡改区块链上的数据,必须攻击至少51%的节点,这种攻击成本极高。
区块链的分叉是永久的吗?什么是分叉fork?
答:
分叉是什么?
分叉是分布式共识系统进行升级时,可能存在共识机制的改变,社区成员存在意见的分歧。
软分叉 是什么?
区块链或中心化网络向前兼容的分叉,未升级的节点仍旧能接受新的规则(强化规则)。新的节点需要满足更细化的新规则。
硬分叉是什么?
区块链或去中心化网络中不向前兼容的分叉,影响较大。未升级的 节点将新区块看做无效。
经典案例
-
比特币分叉:2017年8月,为解决比特币交易拥堵、手续费奇高等问题,比特币核心开发团队bitcoincore提出“隔离见证 + 闪电网络”的扩容方案,但另一派则认为应该直接在链上扩容,支持大区块(将区块大小提升至8M),由于扩容方案理念不一致分裂为比特币(BTC)以及比特币现金(BCH)。目前BCH已稳踞全球加密货币第四名的位置。
-
以太坊分叉:因黑客盗取了大概6kw美元的合约币,以太坊开发团队修改源码,强行把第1920000个区块的资金转移到另一个地址,“夺回”黑客控制的合约币。大部分矿工认同这个修改,但也有一部分矿工不认同这个修改,于是形成了两条链,新链是以太坊(ETH),原链是以太经典(ETC)。
比特币如何扩容?
答:
为什么要扩容?:
试计算比特币区块的交易频率:(性能)
区块交易数
=
一个区块大小
一笔交易大小
=
1
M
B
250
B
=
1
×
2
20
250
=
4194.304
笔
区块交易数=\frac{一个区块大小}{一笔交易大小}=\frac{1MB}{250B}=\frac{1×2^{20}}{250}=4194.304笔
区块交易数=一笔交易大小一个区块大小=250B1MB=2501×220=4194.304笔
T P S = 一个区块的交易数 一个区块挖出的时间 = 4194.304 10 × 60 = 6.9905 笔 / s TPS=\frac{一个区块的交易数}{一个区块挖出的时间}=\frac{4194.304}{10×60}=6.9905笔/s TPS=一个区块挖出的时间一个区块的交易数=10×604194.304=6.9905笔/s
-
链上扩容:
- 隔离见证:SegWit有效容量提升到4MB
- 增加区块链容量:提高新能降低验证速度
-
链下扩容:
-
闪电网络:通过建立一个二层网络来处理大量的小额交易,将它们批量结算,从而减轻主链的负担。这种方案适用于微小额度的支付场景。
-
侧链:通过将部分交易转移到侧链或跨链,减轻主链的网络负担。这样可以提高主链的性能并扩展区块链网络的容量。
-