目录
上节课回顾
SHA256
-
碰撞阻力(Collision Resistance):找到两个不同的输入
a
和b
,使得H(a) = H(b)
是非常困难的。 -
隐秘性(Pre-image Resistance):给定一个输出
H(a)
,找出输入a
是非常困难的。 -
谜题友好(Puzzle Friendliness):“矿工公平”,找到一个特定的
X
以使得H(X)=Y
是一个没有捷径的任务。这有助于确保矿工公平竞争。
数字签名
-
私钥签名:只有拥有私钥的人才能生成一个有效的数字签名。
-
公钥验证:任何人都可以使用公钥来验证签名是否有效。
区块“链”
是一个单向链表,链表的头是第一个区块。
-
创始区块(Genesis Block):这是区块链中的第一个区块。
-
区块结构:
- 区块头(Block Header):包含该区块的元数据,如前一个区块的哈希值、时间戳等。
- 区块体(Block Body):包含实际的交易数据。
-
哈希指针:每个新区块都有一个哈希指针,该指针是前一个区块头的哈希值。
- Hash Pointer *ptr := H(header):
ptr
是指向前一个区块头哈希的指针。 - Hash Pointer = { pointer_to_data, hash_value },既包含了指针,又包含了哈希值
- Hash Pointer *ptr := H(header):
-
为什么只哈希区块头而不是整个区块(Header 和 Body)?
- 因为区块头中通常包括一个字段,叫做Merkle Tree(默克尔树),它已经考虑了区块体中所有交易的哈希值。这样只需哈希区块头,就能确保整个区块(包括其交易)的完整性。
区块头的数据结构
在区块链中,区块头通常包含以下几个主要元素:
-
版本(Version):用于跟踪区块链软件的版本。
-
上一个区块的哈希(Previous Block Hash):这确保了区块之间的连续性。
-
默克尔树根(Merkle Root):一个用于验证交易集合完整性的数据结构。
-
时间戳(Timestamp):标记该区块创建的时间。
-
难度目标(Difficulty Target):这与挖矿过程中需要解决的数学问题有关。
-
随机数(Nonce):一个随机数,用于挖矿。
默克尔树(32Bytes)
H(H(H(T1) + H(T2)) + H(H(T3) + H(T4)))
/ \
H(H(T1) + H(T2)) H(H(T3) + H(T4))
/ \ / \
H(T1) H(T2) H(T3) H(T4)
用于储存在区块头里以验证所有交易的完整性。
默克尔根(Merkle Root):上图中的最顶层哈希值。它由下面所有的交易哈希值通过特定的组合和哈希运算得到。
为何区块链可以防篡改?
-
原理:碰撞阻力(Collision Resistance)、
-
不可更改历史记录(Immutability):
-
篡改之前的区块是不可能的:每一个区块都包含前一个区块的哈希。因此,更改旧区块将导致后续所有区块的哈希值都发生变化。
-
篡改最新区块也几乎是不可能的:尽管理论上最新的区块最容易受到攻击,但实际上由于网络的分布式验证和工作量证明(Proof of Work)机制,篡改也是极其困难的。
-
PoW使得篡改区块链非常困难。为了改变已经添加到区块链的信息,攻击者需要重新进行所有相关区块的PoW计算,这几乎是不可能的。
-
但是,那个puzzle的答案是公布的,如果攻击者先拿到这个答案,再广播篡改后的区块怎么办?
-
- 两步发布机制:
-
第一步是广播区块头:这一步已经包括了默克尔根(Merkle Root),确保交易的完整性。
-
第二步是广播区块体:这一步是在验证区块头后进行的,进一步确保数据的不可篡改性。
节点类型
- 全节点(Full Nodes):
-
有完整的账本:存储整个区块链的所有信息,包括每个区块头和区块体。
-
更高的安全性:由于全节点存储所有信息,它们能进行更全面的验证。
- 轻节点(Light Nodes):
-
只有所有区块头的信息:不存储区块体的信息,只存储区块头。
-
资源需求较低:由于只保存区块头,轻节点占用的存储空间和处理能力要远低于全节点。
-
又叫“手机钱包”,可以支撑手机中的转账。
Merkel Proof
如何验证交易存在?
例如:别人给我转了五个比特币,我怎么知道他真的转了?
验证Merkel根是否和手机中的相同即可。
假设交易是随机排列的,所以确认一个交易是否在树中的时间复杂度是O(n)还是O(1)?
如果找merkel path,那就是(logn),如果逐个比对哈希,那就是O(n),O(1)应该搞不定
如何证明不存在?
(如果先对下面的交易排序了)
用默克尔证明(Merkle Proof)。也是找merkel path,详见下面的链接