一种拜占庭共识协议-Byzantine Agreement,Made Trivial

本文深入探讨了Silvio Micali提出的拜占庭共识协议,该协议在33%的容错率下实现了全网节点共识。文章详细介绍了协议的基本原理、关键步骤及其背后的数学逻辑,并对比了与其他共识协议的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

周六看了几遍Silvio Micali的论文Byzantine Agreement,Made Trivial, 理解上比以前深刻了一些。今天准备把论文叙述一遍,不会一字一句翻译,基本是自己的理解。文字记录下来理解会更深一点, 也做为接下来和守敬老师讨论的基础。

介绍

拜占庭共识在几十年间已经吸引了众多前辈投入研究, 本论文提供了一种简单可操作的拜占庭共识协议, 容错率大概在33%(1/3), 在可预期的9轮(round)之内全网节点可以达成共识。

  • 容错率: 作恶节点最大所占比例。
  • 作恶节点: 可以装死/发送错误消息的节点。

n>=3t+1>=3

  • n: 全网节点总数。
  • t: 网络中坏节点总数。

后续文中拜占庭共识用 BA代替。


一些定义

论文描述的BA会使用两个工具:

  • 数字签名: 保证点对点消息传递的可靠。
  • 哈希函数: 生成随机位 c(r)。(BBA*中着重解释)

接下来我们要对弈的是这样一个对手(adversary):

  • 对手的能力:

    • 控制全网t个作恶节点(malicious)收集(receive)和发送(send)消息的内容。
    • 在每一轮(round)开始的时候, 可以在全网任意指定t个作恶节点(malicious)。
    • 无法影响诚实节点(honest)。
ps: 如果不太了解BA,可能对receive和send的具体含义不太理解,下面协议描述中会有说明。

BA描述

  • 定义若干变量:

    • 全网节点总数: n
    • 作恶节点总数: t
    • 节点i向其他节点广播的消息: out(i)
    • 节点i初始化值: v(i)
    • v(i),out(i)是V的元素。 V={0,1}
    • n>=3t+1>=3

    我的以为: 原论文中的soundness应该不是概率,是?

  • 定义两条规则:

    • 如果节点i和节点j都是诚实节点, out(i)=out(j)
    • 如果诚实节点i初始化值v(i)=v, 则诚实节点j的out(j)=v

  • 定义几个标示符号:

    • 节点i对字符串x的签名: sig(x)
    • 节点i在第r轮(round)收到来自节点j的消息: m(j)
    • 节点i在第r轮收到值v的个数: #(v)

一种二进制拜占庭共识协议: BBA*

Dolev and Strong[4]第一次提出了容错50%的BA 协议; Katz and Koo[10]接下来也提出了容错50%,且在有限轮数内全网可以到达共识的BA协议。他们的协议很完善但是太过复杂,可操作性比较低。
基于本论文的BBA*, Vinod Vaikuntanathan 和作者一起发现了容错在50%的协议方法, 后续会写出来, 本论文描述的还是容错33%的协议。


本论文基于二进制数值达成共识(0 或 1), 定义b(i)为节点i的初始化二进制数值。

下面是三个演化过程:

1.理想化(借助天空)

  • 节点i广播b(i)到所有节点,包括自己。
  • 一个随机独立的二进制变量 c(r)出现在天空,所有节点可见。
  • 节点i更新自己的b(i)按照如下规则:

    • 如果: #(0)>=2t+1, 节点i将b(i)设置为0.
    • 如果: #(1)>=2t+1, 节点i将b(i)设置为1.
    • 否则设置b(i)为c(r).

    Ps: 诚实节点个数>=2t+1; 诚实节点出现的概率: 2/3.

    下面快速分析三点:

  • 如果在协议执行之前诚实节点对 b 已经达成共识,则执行之后还是共识状态。
  • 如果在协议执行之前诚实节点对 b 没有达成共识,则执行之后共识概率是1/2。
  • 如果所有诚实节点的初始值都是 b, 则他们后续动作仍然会在b上共识。

上述三点不难理解, 对于第二点概率1/2的原因, 我个人认为因为共识数值集合是{0,1}, 所以概率是50%.


2.改进版

//TODO: 未完全领会,稍后补充


3.确定版

接下来抛开天空给我们的帮助,通过规则构造具体的c(r):

确定的随机值(0 或 1)的构造方式:

  • 节点i向外广播 v(i), v(i)是节点i在r轮对随机字符串R的数字签名。
  • 所有节点收到来自其他节点的v(?), 通过哈希函数计算出最小的值, 对所有节点j: H(v(m))<=H(v(j))。 则m是最小的那个节点。
  • 对于节点i, H(v(m))的最低有效位(0 或 1)就是 c(r)了。
  • 问题: 每轮协议执行之后,全网达到共识的概率是 1/3.

    • 概率1/3的原因: 上一节有描述。//TODO
  • 解决办法:

    • 方法1: 执行次数足够多,次数提高总概率。(太浪费,很笨拙)
    • 方法2: 规则改进,拆分为3步循环:

      • 第一步: 强制c(r)为0.
      • 第二步: 强制c(r)为1.
      • 第三步: 正常产生c(r)=lsb(H(v(m))).

详细描述和证明过程如下:


分析和证明过程

过程描述:

  • Step1:

    • 1.1 如果 #(0)>=2t+1,节点i设置: b(i)=0, out(i)=0, 向其他节点广播0*, 退出循环.
    • 1.2 如果 #(1)>=2t+1,节点i设置: b(i)=1.
    • 1.3 否则: 节点i设置: b(i)=0.
  • Step2:

    • 2.1 如果 #(1)>=2t+1,节点i设置: b(i)=1, out(i)=1, 向其他节点广播1*, 退出循环.
    • 3.2 如果 #(0)>=2t+1,节点i设置: b(i)=0.
    • 2.3 否则: 节点i设置: b(i)=1.
  • Step3:

    • 3.1 如果 #(0)>=2t+1,节点i设置: b(i)=0.
    • 3.2 如果 #(1)>=2t+1,节点i设置: b(i)=1.
    • 3.3 否则: 产生c(r)=lsb(H(vm)), 节点i设置: b(i)=c(r), r(i)自增1, 返回Step1循环.

三点证明:

  • A: 如果在Step3执行的开始,没有节点退出循环,全网也没有达成共识;则在Step3结束时有1/3概率全网达成共识.

假设最小节点(lsb(H(v(m))))节点m是诚实节点, 全网通过节点m的签名消息可以唯一确定c(r).
最小节点是诚实节点的概率是: 2/3(这个比较明显,因为n>=3t+1,所以诚实节点数>=2t+1).

对于Step3的三个小步: 3.1, 3.2, 3.3会出现5种情况:

  • 可能情景1: 所有节点满足了3.1.
  • 可能情景2: 所有节点满足了3.2.
  • 可能情景3: 所有节点满足了3.3.
  • 可能情景4: 部分节点满足3.1,其余满足3.3.
  • 可能情景5: 部分节点满足3.2,其余满足3.3.

很显然,不可能出现 部分节点满足3.1,其余满足3.2的情况。

对于情景1~3, 节点在Step3结束时达成共识的概率都为1.
对于情景4和情景5, 着重说明一下:

  • 情景4: 3.3中c(r)=0的概率是1/2(因为只有1或0的可能).
  • 情景5: 3.3中c(r)=1的概率是1/2.

综上, 5种场景在Step3结束时达成共识的概率最小为1/2, 而节点m是诚实节点的概率是2/3,所以Step3结束时有(1/2*2/3=1/3)的概率达成共识。

我的疑问: 和m是否为诚实节点有什么关系呢? lsb(H(v(m)))为0或1对于m是否为诚实节点无关吧? 所以A的概率应该为1/2 ?

----

  • B: 如果在某一步,在b上达成共识,则共识的b在接下来的执行中不会被改变。

假设在某个Step的开始对b达成了共识, 则所有诚实节点(>=2t+1)都会广播这个b, 所以#(b)>=2t+1对所有诚实节点都是成立的, 后续协议执行并不会改变b。

这个比较好理解,不用过多说明。

----

  • C: 如果在某一步,有一个诚实的节点退出循环,则共识会在这步结束时达成。

诚实节点数>=2t+1, 作恶节点数<=t

以Step0为例, 如果某节点满足#(0)>=2t+1而退出了循环则说明至少有 t+1个诚实节点在Step0开始前全网广播了0。
对于其余节点j有两种情况:

  • #<j,1>(0)>=2t+1 (满足了退出循环条件且达成共识)
  • t+1<=#<j,1>(0)<2t+1

//TODO: 未完全领会,后续补充...


二进制BA向任意值BA的转化

参见附录[5]的论文.


最后

论文中两部分没有完全吃透,后续找时间更新:

  • Frequently magic coins的具体用意。
  • If at some step, a honest player i halts, then agreement will hold at the end of the step. 后半段的证明过程。

2017-01-07

### SBFT 实现与应用场景 #### 定义与特性 简单拜占庭容错共识协议(Simple Byzantine Fault Tolerance, SBFT)旨在解决分布式系统中的拜占庭将军问题,即在网络中存在恶意节点的情况下达成一致。SBFT 是一种改进型 BFT 协议,在设计上简化了传统 BFT 的复杂度并提高了效率。 在不可信的分布式环境中,SBFT 可以确保即使部分节点失效或行为异常,整个系统仍能正常运作并保持一致性[^1]。这种机制特别适用于区块链和其他分布式账本技术平台。 #### 工作原理 SBFT 通常采用三阶段提交模型来处理提案: 1. **预准备(Pre-Prepare)** 主节点向其他副本发送带有编号的新区块提议消息。 2. **准备(Prepare)** 副本接收到有效预准备消息后回复确认给主节点及其他副本。 3. **提交(Commit)** 当超过三分之二以上的副本次数同意某个特定高度上的区块,则认为此区块被最终确定下来,并通知所有参与方完成提交过程。 ```python class SimpleByzantineFaultTolerance: def __init__(self): self.primary_node = None self.replicas = [] def pre_prepare(self, block_height, proposed_block): # Primary node sends Pre-Prepare message to replicas pass def prepare(self, replica_id, prepared_message): # Replicas respond with Prepare messages upon receiving valid Pre-Prepare pass def commit(self, committed_message): # Once a supermajority of Prepares are received, finalize the block pass ``` #### 应用案例分析 ##### Hyperledger Fabric 中的应用 Hyperledger Fabric 提供了一个灵活的设计架构,允许开发者根据不同业务需求选择合适的共识算法。对于那些追求高效且具备一定容忍度的企业级联盟链而言,SBFT 成为了理想的选择之一。它不仅能够降低通信开销至 O(n)[^2],而且还能提供良好的扩展性和安全性保障[^4]。 ##### 政府公共服务领域 政府机构可以通过部署基于 SBFT 构建的私有链或联盟链来进行电子政务管理。例如土地登记、身份认证等敏感信息存储于不可篡改的数据结构之中,从而增强公众信任感的同时也提升了行政效率[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值