惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
T
Threatpost
AWS News Blog
AWS News Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
W
WeLiveSecurity
博客园 - 叶小钗
K
Kaspersky official blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
小众软件
小众软件
D
Docker
爱范儿
爱范儿
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计 鼓吹 Cursor 的人技术能力都差 关于 Code Review 的礼节 假如启动一个新的以太坊 PoS 网络 发行加密货币的最好方式 所有 BFT 共识的区块链都是中心化的 对 2025 年区块链行业的预测 Restaking 项目的经济难题 如何看懂任意区块链项目的技术架构 为什么不要做以太坊的二次开发 为什么不要做智能合约开发和 DeFi 开发 我的加密货币定投策略(一) Ethereum Casper 为什么需要 EIP-7251 区块链中的 PBFT 不需要第二次投票 开发者的思维方式 发币的核心要点 炒币投资的小 tips 为什么说 PoW 比 PoS 更加去中心化 牛市对普通人来说意味着什么 如何健康地远程工作 为什么比特币不用概率加密函数 程序员的 “服从权威” 心理 区块链技术面试题 如何区分公有链和联盟链 对 Layer 2 项目创业想法的回复 对区块链共识机制的理解 Pebbling Game 鹅卵石游戏 PDP 文件证明的局限性 不要小瞧 ChatGPT 为什么炒币不是一个好主意 一种在区块链上生成随机数的机制 为什么以太坊的私钥计算不可逆 关于以太坊的私钥碰撞 “猜均值的2/3” dApp 游戏设计 Proof of Storage/Space/Replication 的区别 Proofs of Retrievability 文件证明的含义 对 S-PDP 文件证明的示例和解释 我的加密货币交易机器人 对区块链行业的见闻 随机确认块的共识机制 VRF + BFT 共识引起交易失败的问题 为什么要重视编程思想 对 Web 3.0 的理解 GitBook 好用吗? 一种区块链节点存储扩容的方式 一种基于“自我中心主义”的共识机制 链表常见算法题及解析 基于 Multi-Linked List 的区块链设想 理解哈希函数与序列化 联盟链比公有链差在哪儿 在 Dijkstra 算法中保存路径 为什么数字货币使用区块链是政治问题 区块链:下一代数字身份认证体系的基石 网页技术能实现 3D 建模吗? 给区块链一个定义 从 Erlang 开始了解 Actor 模型 一种侧边导航栏的交互方式 Rust 的 ownership 是什么? Haskell 中的 Monad 是什么? 浅析 Libra 背后的区块链技术 对区块链的理性认识 Rust 基础语法概述 基于 Java 的爬虫框架 WebCollector Kotlin:简化版的 Scala JavaScript 有关联数组吗? 主流编程语言的异常处理机制 Go 语言基本语法 Scala 语法基础 用 Scala 改写 Java 浅度实践 Python 获取海贼王更新信息 HTML5 音乐可视化
PoS 类型的区块链如何处理分叉
2024-08-22 · via smallyu的博客

2024-08-22

主流公链从共识机制的角度基本上可以分为 3 类,分别是 PoW、PoS、PBFT。选择了不同的共识,也就很大程度上决定了网络的 TPS、去中心化程度、节点规模。

除了 PoW,另外两种共识 PoS 和 PBFT 都面临一个基本的问题,就是当网络发生了软分叉,该如何恢复?由于 PoS 和 PBFT 产生块不需要算力成本,也就不能用和 PoW 一样的最长链原则。

问题背景

共识概览

PoW 系列的链有 BTC、BCH、BSV、LTC、DOGE、ZEC 等。PoW 都使用最长链原则,节点在面对多个发生了分叉的链时,直接选择块高度最高的一条就行了。由于每产生一个块都需要庞大的算力,攻击成本比较高。

PoS 系列的链有 ETH、BNB、TRON、DOT、TON、ADA、AVAX、NEO 等。几乎目前所有智能合约平台类型的链,都属于 PoS 共识。

PBFT 系列的链有 ATOM、SOL、TON、ONT、APT、SUI 等。其中 Cosmos 最为知名,Solana 有超越以太坊的势头,The Open Network 今年也发展的很好。

这里可能会觉得有点奇怪,怎么把 SOL 归类到 PBFT 上了?SOL 不是 PoH 共识吗?SOL 不也有质押的功能,比如在 Solflare 钱包上还可以质押获得收益的吗?TON 也有质押和收益啊?

这里是两个问题。

首先 Solana 的确开发和使用了 BFT 类的共识,叫 Tower BFT,PoH 是用来解决 Solana 链上的时钟问题的,而不是一种完整的共识机制。

其次是 PoS+BFT 类共识,算 PoS 还是 BFT?上面提到的分类,PoS 主要指 PoS、dPoS、PoS Casper 这些,凡是用到 BFT 的都归类为 PBFT 作为区分。最明显的就是 Cosmos 也有质押和收益功能,但很少有人会说 Cosmos 用的是 PoS。

关于分叉

PoS 共识和 PBFT 共识面对分叉问题的时候,有两个方面。

一方面是质押者列表(以太坊叫 Validators,Cardano 叫 Stakeholders)是否一致,因为 PoS 和 PBFT 大都是使用 VRF 从一组候选列表中选择出一个节点作为出块节点,那么 PoS 和 PBFT 类共识在处理这个问题的时候有哪些异同?

另一方面是当网络分叉后,在选择链的规则(以太坊叫 Forkchoice,Cardano 叫 Chain selection rule)方面有什么异同?

质押者列表不一致

联盟链

从最简单的联盟链开始分析。联盟链的特点是没有 coin,也就完全没有质押方面的内容,只是单纯的 PBFT。

联盟链顾名思义,有非常高的准入门槛,需要经过审核或者某种授权也能够成为联盟成员。具体到技术层面,就是想要加入网络,需要在其他节点都知道的情况下,比如所有节点的配置文件里,都包含一个网络成员的列表,列表里定义了网络的节点公钥以及对应的 index,想要增加节点就需要其他所有节点都改一下配置文件。

节点在出块的时候,就会从这个列表中使用 VRF 随机选择一个作为出块节点。一般 VRF 返回的是一个简单的数字,对应公钥列表的 index,出块节点用这个公钥来对块签名。

这样的做法比较笨拙,但也是联盟链的特点。在这种模式下,节点的质押着列表不太可能不一致,如果不一致就是配置文件写错了。而且配置错误的情况下,它将永远是错误的,排查起来很简单。

Cosmos

Cosmos Hub 用的共识叫 CometBFT,基本流程是花费不少于 180 个 ATOM 注册成为 Validaotr,然后就有可能会选为出块节点。

由于 BFT 类共识在出块之前就需要投票,所以假如网络中真的出现了质押者列表不一致的情况,在同一个块高度会有两个节点产生出两个块,此时网络中的其他节点会对这两个块进行投票。

这个时候也分两个场景,就是网络正常和网络异常的情况。

在网络正常的情况下,现在有两个块,一定只能有一个块收到大于 2/3 的投票,不可能两个块都收到大于 2/3 的投票。所以在出块之前,就已经把质押者列表和其他节点不一致的节点排除在外了,不会影响后续流程。

在网络异常的情况下,节点感知不到其他节点的存在,即使当前节点的质押者列表正好是当前子网络中的有限几个节点,其他几个节点也不会把票投过来。除非整个子网络都断网了、质押者列表还发生了一样的错误,那这个自网络就自己在局域网玩吧。网络异常本身就是一种异常情况了,与外界隔绝。

Cardano

Cardano 的 PoS 是最纯粹的 PoS,没有投票机制。Cardano 的共识经历了很多次演进(内容很多很复杂,我没看完)。

Cardano 网络的规则是,任何人都可以质押任意金额到 Stake pools 中成为 Delegator,这些 Delegator 按照质押金额的比例共享矿池的收益,但是不会有出块的资格。

在 Cardano 网络中真正有出块权限的是 Stake pools,也就是说有可能被选为出块节点的节点,都在 矿池列表上 了,数量不多,目前大概 300 个左右,每个 solt 将从中随机选择一个来产生块。

那么 Stake pools 节点注册之后,如果节点之间出现 Stake pools 列表不一致的情况怎么办?Cardano 的文档中有 描述,当遇到同一 slot 产生了两个块的时候,就开始启用链选择的规则(Chain Selection Rule)了。也就是说,实际上当第二个块被产生出来,链就已经分叉了,然后所有节点都启用链选择的规则,来进行恢复。

Ethereum

以太坊要成为 Validator 需要花费 32 个 ETH 把节点信息注册到 质押合约 上,然后其他所有的 Validator 都会从质押合约获取质押者列表的信息。

那怎么确定其他 Validators 都已经把质押者信息从合约同步到本地了?你可以在 Beacon Chain 浏览器的任意一个 块信息 上,找到一个叫 Eth Data 的字段,这个字段对于质押者列表非常重要,当一个 validator 被选为出块节点时,它会把当前节点同步到的质押者列表信息,一起打包进块里,包括质押者的总数以及 Deposit root 信息。

以太坊网络大概每 17 个小时进行一次 质押者列表的更新。在这个周期中,只有超过半数区块的 Eth Data 包含了新增的 validator,新的 validator 才会真正加入到网络中。

所以以太坊要加入 validators 的过程是漫长而且严格的,首先要确认其他 proposer 已经同步了相关信息,才会真正更新质押者列表。在这样的规则模式下,质押者列表很难不一致。

分叉链选择

Ethereum

以太坊中如果出现了多条分叉的链,选择起来时相对容易的,因为以太坊有投票机制,每一个块上都包含了有多少个 validators 对块进行了投票。可以猜想到,在发生分叉时,只要不断选择投票数多的块就可以了。

而实际上以太坊的分叉选择基于 checkpoint 机制,每个块是一个 slot,每 32 个 slot 是一个 epoch,每个 epoch 都是一个检查点。一个检查点收到大于 2/3 的投票,就进入了 justified 的状态,当一个检查点的下下个检查点也进入 justified 状态,当前检查点就认为是 finalized 状态了。所以在以太坊中,一笔交易最终被标记为 finalized 需要 15 分钟。

这里提到的检查点,也就是 FFG 进行 forkchoice 的依据,每条链会选择 checkpoint 多的链。所以以太坊的共识不是选择 “有最多块的链” 原则,而是选择 “有最多检查点的链” 原则,检查点最多的链就是主链。

Cardano

Cardano 最新在使用 Chain selection rule,是由 Ouroboros Genesis 版本提供的。

Ouroboros Genesis 的上一个版本是 Ouroboros Praos,Praos 版本中提出了一套叫 maxvalid 的规则,Genesis 版本基于 maxvalid 做了一点改进,把 moving checkpoint 的特性结合了进来,形成了新版本叫做 maxvalid-mc 的规则。

移动检查点简单理解就是,本地链在面对多条分叉链时,如果没有超过 k 个块,就选最长的链,如果超过了 k 个块,就直接不选它。也就是说本地链只会在 k 个块的范围内,选择链最长的一个。而 k 个块的范围就是所谓的移动检查点(moving checkpoint)。加了这样限制的好处就是可以避免最长链攻击。当然 Cardano 制定这样的规则经过了一系列学术上的推演以及实际场景的检验。

Cosmos

PBFT 链在网络正常的情况下,只要保证质押者列表一致,就不会分叉。

总结

总的来说,每种共识的具体实现,都包含了详细的处理分叉的规则,而且这些老牌公链都经过了实际运行的检验。具体如何实现与链的设计理念有关。