1. 双重支付问题
数字货币和纸质货币的区别
- 物理上的交易,纸质货币无法复制,spend以后就再也没有了
- 数字货币可以复制,因此交易时需要验证货币的所有权
中心化数字货币的问题
- 发行量受中心化机构控制
- 效率问题,每一笔交易都需要中心机构核验
所有中心化的问题,都会在中心化的数字货币中有所体现
区块链中双重支付防范:

如图所示,区块链中的每个交易都包含输入和输出两部分,交易的输入是一个或者一组hash指针,指明输入来源, 指向前面的交易输出。图中第一个拥有铸币权的节点通过铸币交易,产生一个给A的10个btc, 然后A 发起交易,向B 和C 转入5比特币,此交易的输出是B和C的公钥的hash,表示要向B和C转钱。同理B向C和D在分别转入3 和 2个比特币,这些都是合法交易
观察方块外侧的非法交易,B 向 F 转入5个比特币,但是该交易输入来源是第二个交易的输出,该交易输出已在第三个交易中被引用且花完了,因此这个交易是无效的,会被系统拒绝,这个就是双花(双重支付)防范
具体到实现层面可能有所区别,但是原理类似
交易链条中药care的问题:
- 交易中的公钥如何分发?
- 要由交易发起方提供
- 交易双方需要知道彼此的公钥
- 发起方需要指明转入账户
- 接收方需要验证发起方的身份
- 防范伪造攻击
假设上图中的第二个交易,由T伪造了一个交易,其宣称自己是A,用自己私钥对交易签名,分别给B C 转账,但其在交易输入中指明的公钥的hash与其引用的来源(铸币交易中的输出,A的公钥的hash)对应不上,则同样无法被验证通过
这里要注意,区块形成区块链,交易本身也可以形成一个可回溯的交易的链条
区块结构
bitcoin的区块结构
Header 中的内容(Check):
- version
- hash of prev block header
- target
- 挖矿难度目标值
- nonce
- 与挖矿有关
- root hash of merkle tree
- nbits
Body 中的内容:
- 交易列表 tx list
比特币中形成链表的是block
轻节点:只保存block header信息和与自己有关的交易信息,一般不能进行独立验证
全节点:保存、构造、维护区块链信息,能够进行完整的交易验证
区块链结构
digraph demo{
subgraph cluster_n1 {
node[shape="box"]
blk_h1[label="header"];
blk_body[label="body"];
}
subgraph cluster_n2 {
node[shape="box"]
blk_h2[label="header"];
blk_body2[label="body"];
// blk_h2->blk_h1
}
subgraph cluster_n3 {
node[shape="box"]
blk_h3[label="header"];
blk_body3[label="body"];
// blk_h3->blk_h2
}
blk_h3->blk_h2;
blk_h2->blk_h1
}
这个结构中区块头部形成链条,body中存储的是交易,header中保存的信息如前文所述。
共识问题
两个或者多个全节点产生区块时,可能会产生一致性问题,比如节点A B 打包了不同的交易,准备放到区块链的尾部上,此时两个本地链就产生了差异
分布式共识(consensus)/分布式一致性:
1. 不可能结论1. FLP 不可能结果,异步系统中,如果有一个成员是有问题的(faulty), 那么该分布式系统不可能取得共识
2. CAP理论(CAP 不可能三角):
* Consistency 一致性,即所有节点维持的数据都是最新的,且一致的
* Avalibility 可用性,即可靠性
* Partition Tolerance 分区容忍性,部分节点出问题的情况下仍然可以工作
* CAP 理论支出以上三者不可能同时满足,在系统设计中只能综合考虑
3. 著名协议,Paxos
比特币共识,假设前提是系统中大部分节点是好的,恶意节点只占少数
比特币要取得的共识是:唯一合法的区块链
- 基于投票的共识方案,即某个节点提出候选区块后,所有节点参与投票确认该节点是否加入链
- 需要确定投票权,如符合条件的节点、或者账户、或者算力
- 女巫攻击:产生大量账户,达到总数一半时,就拥有决定权,这里应当衍生一下,即可以生成大量节点(透过一些方法减轻节点成本),再按节点投票的情况下,就能取得控制权。用IP投票也是
- 需要确定投票权,如符合条件的节点、或者账户、或者算力
- 比特币的投票方案:依据算力投票
- 即挖矿过程中,组装好区块后,尝试各种nonce值,直到满足指定条件的hash
- 如果找到了,即拥有了记账权,就可以将候选区块放入区块链中
- 其他节点,需要验证区块是否合法,验证区块中的交易是否合法(合法签名、未花费过)
- 算力投票来说相对比较公平,在女巫攻击的模式下,不会对算力产生影响,算力有时候被称为hash rate(hash 计算次数/sec)
区块认可:加入本地区块链,扩展。后续说矿工挖矿的时候会详细说明这个过程
最长合法链,Q:非最长合法链如何产生的?
比特币的系统是一个分布式系统,并且是异步的,那么就有部分节点信息有所滞后, 如下图所示:
digraph demo{
subgraph cluster_n1 {
label="blk1"
node[shape="box"]
blk_h1[label="header"];
blk_body[label="body"];
}
subgraph cluster_n2 {
label="blk2"
node[shape="box"]
blk_h2[label="header"];
blk_body2[label="body"];
// blk_h2->blk_h1
}
subgraph cluster_n3 {
label="blk3"
node[shape="box"]
blk_h3[label="header"];
blk_body3[label="body"];
// blk_h3->blk_h2
}
subgraph cluster_n4 {
label="blk4"
node[shape="box"]
blk_h4[label="header"];
blk_body4[label="body"];
// blk_h3->blk_h2
}
blk_h4->blk_h3
blk_h3->blk_h2;
blk_h2->blk_h1
subgraph cluster_n5 {
label="blk1"
node[shape="box"]
blk_h5[label="header"];
blk_body5[label="body"];
// blk_h3->blk_h2
}
subgraph cluster_n6 {
label="blk2"
node[shape="box"]
blk_h6[label="header"];
blk_body6[label="body"];
// blk_h3->blk_h2
}
subgraph cluster_n7 {
label="blk3'"
node[shape="box"]
blk_h7[label="header"];
blk_body7[label="body"];
// blk_h3->blk_h2
}
blk_h7->blk_h6
blk_h6->blk_h5
}
图中左侧是系统中大多数节点的状态,即1->2->3->4已经形成了链,而右侧是某些迟滞节点的状态,它成功挖出了一个新的区块blk3', 并且其prev_blk_hash 指向 blk2。这种情况下,区块链相当于产生了分叉,比特币的系统设计要求最长合法链才是有效的,图中右侧的状态会被丢弃(blk3' 及其产生的区块奖励都会被丢弃)
上图中的blk3' 叫做orphan block(孤儿区块)
分叉攻击:区块链中插入区块,从而回滚交易
投票权:算力(hash rate)
如前所属,基于算力的投票使得投票相对公平,算力较强的节点拥有更多的机会加入区块。
浙公网安备 33010602011771号