1. 介绍
Bitcoin:一个电子现金系统
- 基于对等网络,不需要第三方中介参与,且杜绝交易回滚;
- 基于密码学原理,交易时间戳散列成一个持续的散列链的工作量证明,形成记录。而最长的链来自最大的CPU池;
- 节点是对等的,可随时加入/离开
2. 交易
电子货币:一串数字签名
- 交易发生时,当前持有者将前一个交易和下一位拥有者的公钥签署一个散列签名,并附加到电子货币货币的尾部
- 下一位拥有着使用自己的私钥验证所有者
检验之前的电子货币是否进行了双重支付:
- 引入第三方权威,每次交易后,货币被回收,并发行新货币
- 签名中包含所有的交易历史,历史唯一且被公认
3. 时间戳服务器
时间戳服务器:
- 将以区块(block)形式的一组数据进行散列,加上时间戳,并将散列进行广播
- 随后的散列时间戳都基于前一个时间戳,形成一条链
4. 工作量证明(Proof-of-Work)
基于第3节,在区块中,补增一个随机数(nonce),使得给定区块的散列值和随机数一起出现所需的多个0,随机数会多次尝试,直到满足条件为止。区块依旧是链式的。
同时,它也解决集体表决时的大多数问题,它是由一个CPU一票的,“大多数”的决定是最长的链,因为代表最大工作量。而诚实节点下,诚实的链会很以最快速度增长。
若攻击者需要修改链上的节点,则需要重新计算该节点以及之后的节点,并要赶上和超越诚实节点的工作量,速度慢,成功概率会非常低。
解决网络起伏,则会对工作证明难度进行调整(移动平均目标,控制区块生成速度为某个预定的平均数),若区块生成过快,难度就会提升。
5. 网络
步骤如下:
-
新的交易向全网广播(不需要广播到所有节点,足够多就行,区块缺失后节点会请求下载以修复区块)
-
每个节点将交易纳入一个区块中
-
每个节点尝试在自己的区块中找到一个由足够难度的工作量证明
-
当一个节点找到了一个工作证明,则向全网广播
-
当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性
-
其它节点表示接受该区块
- 表示接受的方法:在该区块的末尾,生成新的区块以延长该链条,而将被接受区块的散列值视为先于新区块的散列值
节点视最长的链为正确的链。若不同节点广播不同版本的区块,则节点先在先收到的区块上进行工作,并保留另一个链条,防止变成最长的链条。而打破僵局需要等到下一个工作量证明后,节点会切换到较长的链条上工作。
6. 激励
来源有:每个区块的第一笔交易会进行特殊化处理——会产生一枚由该区块创造者拥有的新的电子货币。(将新货币添加到系统,类似于挖矿)
另一个激励来源:交易费(即交易输出值与输入值的差值,大于0),可免于通货膨胀。
激励也能助于节点保持诚实,让攻击花费更多的资金。
7. 回收硬盘空间
若最近的交易已被纳入足够多的区块时,之前的交易可被丢弃,以回收硬盘空间。
而为了不损害区块散列值,交易信息会被构建成Merkle tree,只有它的根被纳入区块的散列值,而底下的分支可以被删除(下面的散列值不需保存),从而压缩老区块。
8. 简化支付确认
用户需要保留最长链条的区块头,可被网络发起询问,且能通过Merkle树的分支找到对应的交易。
而在攻击场景下,一个可行策略是:若发现一个无效区块,就发出警报,收到警报后,立刻下载有问题的区块信息,并对其进行判断。
9. 价值组合与分割
为使得价值易于组合和分割,交易可以有多个输入和输出,而输出最多有2个:支付、找零(如果有)。
10. 隐私
传统隐私模型需要可信任的第三方。
而Bitcoin需要将交易广播到全网,但交易信息仅包含某个人将一定货币转移给另一个人,难以将交易与特定的人联系在一起,交易双方的身份不会被暴露(公钥和具体的人的联系不会泄漏)。
11. 计算
场景:攻击者视图比诚实节点更快的产生替代的区块链
计算:攻击者能弥补/追赶上原有诚实区块链的概率
定义:
- $p$:诚实节点制造下一个区块的概率
- $q$:攻击者制造下一个区块的概率
- $q_{z}$:攻击者最终追赶上$z$个区块的概率,有$\begin{equation}q_{z}=\left{\begin{array}\1 & & {p \le q }\(q/p)^z & & {p > q}\end{array} \right.\end{equation}$
在攻击者落后诚实者$z$个区块的情况下,双方都生成新的区块:
-
攻击者的潜在进展可以是一个泊松分布,它的期望为$\lambda = z\frac{q}{p}$
-
那么为了计算攻击者追赶上诚实者的概率,将攻击者取得进展区块数量的概率密度和攻击者依然能够追赶上的概率相乘,得到:
- $P = 1-\sum_{k=0}^{z} \frac{\lambda^ke^{-\lambda}}{k!}·(1-(\frac{q}{p})^{z-k})$
可知概率会随着$z$增长而指数下降