PKU-Blockchain - Lecture 2
How to design a crypto-currency
double spending attack
假设央行发行数字货币的方式是:用自己的私钥签名一个文件,老百姓可以使用央行的公钥来验证,也可以用于日常生活交易中。
由于此时每张货币只是一个文件(可复制),所以可以不止被使用一次。
Improvement:对每张签名后的货币进行编号,且央行设立一个数据库,里面记录着每张货币目前绑定在谁的名下。每当 A 与 B 发生交易(假设 A 给 B 一个编号为 1 的数字货币),B 需要去向央行确定这个数字货币的归属权现在是否还是 A,若没有问题则交易可以成立,但央行的相关数据库也需要对参与交易的数字货币的归属权进行更改。
这个方法理论上可以成立,也可以用于实践中,但需要一个中心化机构管理。
区块链就是一个去中心化的数据结构,用户共同来维护交易信息系统。
下图构造了一个简单的区块链。每一个块是一个交易,块间用哈希指针链接,还有一种哈希指针链接是为了确认货币来源(防止 double spending attack)。
比特币系统中的地址(账户),是公钥经过哈希后的结果。(这块有点没听懂,有关块的输入输出部分)
区块分为两部分(block header
和 block body
)。区块间通过 header
的连接而相连,计算哈希指针的时候也是只将前一块的 header
进行哈希的计算(Merkle tree
的根哈希值能确保 block body
中的交易信息们没有被篡改)。
block header:版本信息、前一个 blcok header
的哈希指针、Merkle tree
的根哈希值、挖矿相关参数。
block body:交易记录。
区块链中的节点可以分为全节点(full node
)和轻节点(light node
),区块链中的全节点个数很少。
full node:保存全部信息,验证每一个交易。
light node:只保留 block header
,无法独立进行交易合法性的验证。
Consensus in Bitcoin
通过投票的方式来确定是否更新区块链,关键在于投票权在哪些区块手里。
女巫攻击(sybil attack
):Bitcoin 中创建账户很简单,攻击者可以创建大量的账户,创造某次投票过程中一半以上的账户数即可。
Bitcoin 系统中用算力来投票。每个节点都能在本地组装出一个候选区块(选择自己认为合法的交易),然后尝试计算出合法的 nonce
,使得 $H(block \ header) \leq target$。找到 nonce
者获得记账权。
分叉攻击(forking attack
):由于区块链验证交易的合法性只会向前验证,则攻击者可以通过往链上加块来回滚某个已经发生过的交易(如图)。为防止这类攻击,比特币协议中规定:添加块应该是为了构建最长合法链,才能允许添加。
若两个矿工几乎同时计算出了合法的 nonce
,则会出现短暂的分叉。此时将会继续进行“竞争”,若谁先算出了后一个 nonce
,则最长合法链就被更新为这条,另一条则被丢弃(块变成 orphan block
)。
为什么大家都要去竞争“记账权”:block reward
作为获得记账权的奖励(比特币协议允许在区块中加入给自己发币的交易,这也是比特币发行的唯一方式),在之前讲到的 orphan block
在自己发布的区块中的奖励,会随竞争的失败而失效。
投票数竞争记账权 $\Rightarrow$ 算力竞争记账权,可以避免女巫攻击(在一台服务器上建立大规模的账户毫无意义,不会影响算力)。
竞争记账权的过程也叫挖矿(mining),争夺记账权的节点称为矿工(miner)。
找 nonce
就像淘金一样,过程艰辛,但一旦找到就能获得很大的收获。
PKU-Blockchain - Lecture 2