• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
fyyy94
博客园    首页    新随笔    联系   管理    订阅  订阅
比特币学习之共识协议

1. 双重支付问题

数字货币和纸质货币的区别

  1. 物理上的交易,纸质货币无法复制,spend以后就再也没有了
  2. 数字货币可以复制,因此交易时需要验证货币的所有权

中心化数字货币的问题

  1. 发行量受中心化机构控制
  2. 效率问题,每一笔交易都需要中心机构核验

所有中心化的问题,都会在中心化的数字货币中有所体现

区块链中双重支付防范:
avatar
如图所示,区块链中的每个交易都包含输入和输出两部分,交易的输入是一个或者一组hash指针,指明输入来源, 指向前面的交易输出。图中第一个拥有铸币权的节点通过铸币交易,产生一个给A的10个btc, 然后A 发起交易,向B 和C 转入5比特币,此交易的输出是B和C的公钥的hash,表示要向B和C转钱。同理B向C和D在分别转入3 和 2个比特币,这些都是合法交易

观察方块外侧的非法交易,B 向 F 转入5个比特币,但是该交易输入来源是第二个交易的输出,该交易输出已在第三个交易中被引用且花完了,因此这个交易是无效的,会被系统拒绝,这个就是双花(双重支付)防范

具体到实现层面可能有所区别,但是原理类似

交易链条中药care的问题:

  1. 交易中的公钥如何分发?
    • 要由交易发起方提供
  2. 交易双方需要知道彼此的公钥
    • 发起方需要指明转入账户
    • 接收方需要验证发起方的身份
  3. 防范伪造攻击

假设上图中的第二个交易,由T伪造了一个交易,其宣称自己是A,用自己私钥对交易签名,分别给B C 转账,但其在交易输入中指明的公钥的hash与其引用的来源(铸币交易中的输出,A的公钥的hash)对应不上,则同样无法被验证通过

这里要注意,区块形成区块链,交易本身也可以形成一个可回溯的交易的链条

区块结构

bitcoin的区块结构
Header 中的内容(Check):

  1. version
  2. hash of prev block header
  3. target
    • 挖矿难度目标值
  4. nonce
    • 与挖矿有关
  5. root hash of merkle tree
  6. nbits

Body 中的内容:

  1. 交易列表 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

比特币共识,假设前提是系统中大部分节点是好的,恶意节点只占少数
比特币要取得的共识是:唯一合法的区块链

  1. 基于投票的共识方案,即某个节点提出候选区块后,所有节点参与投票确认该节点是否加入链
    • 需要确定投票权,如符合条件的节点、或者账户、或者算力
      • 女巫攻击:产生大量账户,达到总数一半时,就拥有决定权,这里应当衍生一下,即可以生成大量节点(透过一些方法减轻节点成本),再按节点投票的情况下,就能取得控制权。用IP投票也是
  2. 比特币的投票方案:依据算力投票
    • 即挖矿过程中,组装好区块后,尝试各种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)
如前所属,基于算力的投票使得投票相对公平,算力较强的节点拥有更多的机会加入区块。

posted on 2025-09-01 18:36  feiyangyy94  阅读(14)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3