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

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
美团技术团队
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
L
LangChain Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
腾讯CDC
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
博客园 - 司徒正美
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
C
Check Point Blog
小众软件
小众软件
V
Visual Studio Blog
V
V2EX
F
Full Disclosure
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
人人都是产品经理
人人都是产品经理
量子位
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
博客园_首页
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
G
Google Developers Blog
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
爱范儿
爱范儿
Jina AI
Jina AI

pseudoyu

周报 #106 - OpenClaw 实践、搬家与生活的能量 周报 #105 - 打破无聊的社会 2025 年末回顾 - Anything different is good 周报 #104 - 被遗忘的生活一隅 周报 #103 - 工作随想与被吞噬的生活 周报 #102 - 我是如何使用 AI 的 周报 #101 - 消失了三个月,我的生活发生了什么变化 周报 #100 - 过去这十年 周报 #99 - 离开 RSS3,迷茫与重启人生 周报 #98 - 生活之书与 Agentic Coding 周报 #97 - 日本旅行小记 28 岁的自白:去找寻自己 周报 #96 - 基于 Roo Code/Cursor 的 iOS 开发工作流 周报 #95 - All AI 与 No AI 周报 #94 - 生活的界限与真实感 周报 #93 - 婚礼纪录片与失落的电影院 周报 #92 - 数码产品 Porn 与断舍离 周报 #91 - 一席、消失的时代与自由意志 周报 #90 - OVH 服务器、Coolify 与对 AI Coding 的思考 周报 #89 - 博客改版与 TheWan App 发布 周报 #88 - 方大同、《回留》与人生清单 周报 #87 - 我们主持了自己的宝可梦婚礼,还为它办了一个展 周报 #86 - 用影像打败时间 周报 #85 - 京华烟云 Moment in Peking 周报 #84 - 想起他们 Echos of Reverie 周报 #83 - 年初收纳(房间、设备、服务、软件) 周报 #82 - Brand New Year 与写日记 2024 年末回顾 - 不完美的日子 周报 #81 - Engaged -> Married 与时间的尺度 周报 #80 - 关于求婚、爱情与婚姻 求婚誓言 | 爱的本质是被看见 周报 #79 - 清迈旅居、曼谷之行与 Follow RSSHub 开发实践 #01:Telegram 频道 RSS 订阅实现与部署方案 Follow —— 信息获取的另一种形态 周报 #78 - NAS、Chromebook 与 Zeabur 折腾小记 周报 #77 - 一间只属于自己的房间(对亲密关系的思考) 周报 #76 - 关于 Adulting 的思考 周报 #75 - 回答 Dayu 关于独立博客的 9 个问题 周报 #74 - 清迈异闻录 周报 #73 - 《社交网络》、Ego 与中秋的现充生活 周报 #71 - Indie App 体验计划 周报 #70 - 消失的附近,Burnout 与 Boreout 周报 #69 - AI Coding 体验与学习的源动力 周报 #68 - 关于写博客这件事与我生活的色彩 使用 GoatCounter 与 Zeabur 搭建网站数据统计系统 周报 #67 - 使用 follow 重塑我的信息输入系统 周报 #66 - 10x 工程师、技术热情与个人工具箱 从零开始搭建你的免费博客评论系统(Remark42 + fly.io) 周报 #65 - Adventure X 体验、Apple Notes 笔记实践与 EpubKit 周报 #64 - 生活在此处(《斯通纳》与《Normal People》) 使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护 当云服务器崩溃时,我是如何救援重要数据的 周报 #63 - 不愉快的订花经历、商家和消费者与日渐 AI 化的人 从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud) 2024 年了,我的博客有了什么变化 周报 #62 - 香港之行、5am club 计划与 Rust 学习 周报 #61 - 好朋友的婚礼与对婚姻的思考 27 岁的自白:成长是一件很扫兴的事 周报 #60 - 虫子旁、教育理念与 EpubKit 周报 #59 - 沙漠之行、家庭与家人 周报 #58 - 远程工作这一年 周报 #57 - 生活在别处(巴厘岛之行) 周报 #56 - 面基 Randy 与考科目二 周报 #55 - 油画体验、博客系统升级与对 self-hosting 的思考 周报 #54 - 漂流计划、钱包被盗与 Home Server 周报 #53 - 空白的三个月、生活漂流与春节 周报 #52 - 自谦型人格与感情的另一个视角 周报 #51 - 追星小鹿 Lawrence 与生病 周报 #50 - 天坛漫步、重拾阅读和费曼学习法 周报 #49 - 烧焦的键盘、庞贝神话展、健康调整与神奇的梦 周报 #48 - 内蒙之行、清迈游民、重启的周报与生活 周报 #47 - 采访、拳击与工作状态 周报 #46 - 告别长发、周报初心与合约开发 个人信息获取与知识管理系统(Heptabase + Logseq + Readwise) 周报 #45 - 读书笔记、知识管理与双城生活 周报 #44 - 静寂工人、xLog 与日常 周报 #43 - In the Mood for Love 周报 #42 - 感情观、生活状态与自我 周报 #41 - 生日的仪式感、时间管理与北京之行 26 岁的自白:推石头的人 周报 #40 - 开源之夏、代码之外与流逝的睡眠 周报 #39 - 初患新冠、过去的心绪与失而复得的分享欲 周报 #38 - Foundry、Logseq 与 Surge Ponte 周报 #37 - 浮生半月闲( 武汉 | 香港 | 五月天) 周报 #36 - 肠胃炎、捏捏近况与新的旅途 周报 #35 - 登报、搬家和生病的捏捏 周报 #34 - Don't Stop the Clocks 周报 #33 - 北京 x 故事 x 离别 周报 #32 - 武汉、久别重逢与流动的心绪 周报 #31 - 开源、前端开发与 ChatGPT 实践 周报 #30 - 开源预算、写作初心与对技术的谦卑 周报 #29 - 日语学习经验、Steam Deck 与居酒屋 周报 #28 - Mastodon、故乡与捉迷藏的猫 周报 #27 - 何以为家 周报 #26 - 博客、客制化键盘和新服务器 周报 #25 - 基于 Crossbell 的个人信息输出与同步系统(重构) 摄影集 #02 - Moment In Peking (The Autumn) 摄影集 #01 - Cat In The Box 2022 年末回顾 - 迷茫、低谷与改变 周报 #24 - Love Actually | 真爱至上
Cosmos 区块链架构与 Tendermint 共识机制
pseudoyu · 2023-02-10 · via pseudoyu

前言

工作中我主要参与的是跨链项目的方案架构设计与实现,因为公司既有方案是基于 Cosmos 区块链的,我在一年多的项目中基于 Cosmos SDK 作了一些底层链开发改造,对其技术实现有了一些了解,但由于开发周期比较赶,一直没能对 Cosmos 的架构设计与 Tendermint 共识机制有一个系统的了解。

项目结束后,终于得闲读了一下《区块链架构与实现:Cosmos 详解》,本文则是我自己对 Cosmos、Tendermint 的理解和总结。

区块链技术发展

在讲具体的 Cosmos 区块链之前,我们先梳理一下区块链发展的历程,以及目前业界主流的区块链技术。

技术限制

区块链发展至今已经有十几年的历程,从最开始的比特币,到红极一时的 EOS,再到后来渐渐成为主流的以太坊,各有特色却也都有其限制之处。

  • 基于比特币或以太坊的方式由于需要实现 p2p 网络、密码学、共识算法等,需要相对比较高的技术门槛;
  • 基于 PoW(工作量证明)机制的底层链对于算力(电力)消耗也越来越大,对于资源与环境并不友好;
  • 随着链上应用数量与规模的不断增加,链的性能瓶颈越来越明显;
  • 随着业务场景复杂度提升与需求不断增加,链的共识算法也需要根据具体场景而变化;
  • 不同链的底层架构差异较大,不同链之间也是孤岛,难以互相通信,跨链技术方案落地也是一个难题。

技术发展

为了解决上述问题,业界也有不少的技术方案。

  • 由于 PoW 对于资源的大量消耗,许多链采用了 PoS(权益证明)机制,如 EOS 的 DPoS 与以太坊刚升级不久的 PoS,发展也日益成熟;
  • 为了解决底层链限制问题,从类似比特币这样为单个应用构建单独链的模式也渐渐发展到了利用智能合约构建 ÐApp;
  • 对于性能限制问题,比特现金采用了增加区块容量的方案,EOS 采用提升 TPS 的方案(号称百万 TPS),而以太坊则通过分片(Sharding)的方式对链上交易进行并行处理;
  • 跨链技术方面,哈希锁定(散列锁)的方式在比特币与 Algorand 项目中有应用,除此之外还有公证人、中继链等方案。

Cosmos 区块链框架

概述

Cosmos 是一个由 Tendermint 公司开发构建的开源区块链底层框架项目,其目标是为了解决区块链技术发展过程中遇到的各类问题,提供一个高性能、高可扩展、易于开发的区块链框架,其开源地址如下:

Cosmos 可以看作一种多链网络,旨在实现“互链网”远景,而 Tendermint 和 Cosmos SDK 则是其技术手段与实现路径。

对于资源消耗与交易问题,Cosmos 采用了 BFT(拜占庭容错) + PoS(权益证明)的方式来解决;同时,为了降低区块链搭建与基于区块链的应用开发门槛,Cosmos 采用了较为通用的项目构建方式,使基于 Cosmos 进行链开发更加模块化与工程化,其主要由 Tendermint Core、IBC、Cosmos SDK 三部分组成。

Cosmos SDK 组件

虽然名称叫作“SDK”,容易引起一些误解,认为其仅仅是与链交互的一个库/组件,但其实 Cosmos SDK 可以说是一个完整的架构,开发者可以通过其来快速搭建自己的区块链,是 Cosmos 生态体系中的重要组成部分的。其开源地址如下:

Cosmos SDK 主要实现了区块链中的一些通用模块,如账户体系、交易、链上治理等,开发者又可以便捷地基于其快速构建新的功能模块。

其主要模块如下:

  • 账户与交易相关模块
    • auth:系统账户管理
    • bank:链上资产转移
  • 辅助功能模块
    • genutil:创世区块
    • supply:资产总量管理
    • crisis:所有模块不变量管理
    • params:所有模块的参数管理
  • 链上治理模块
    • gov:链上治理机制
    • upgrade:链升级
  • PoS 模块
    • staking:链上资产抵押
    • slashing:对验证者的被动作恶进行惩罚
    • evidence:对验证者的主动作恶进行惩罚
    • mint:链上资产铸造
    • distribution:区块奖励管理
    • IBC 协议模块
    • ibc/core:跨链通信功能

可以看到,Cosmos SDK 框架设计出于 Object-Capability Model 安全理念的考量,设计高度模块化,每个模块都有自己的存储空间且对外仅暴露必要接口。

Cosmos SDK 中有一个特定的 Keeper 角色,用于维护更新状态。通过这种管理方式,模块之间彼此隐藏了具体实现细节,而仅仅通过 keeper 来互相调用,且每个模块内部也都只会被 keeper 进行更新,有效保障了链上状态的一致性。

Tendermint 组件

Tendermint 是 Cosmos 的核心组件,是一个高性能的区块链底层共识引擎,从架构上来说,其主要分为对等网络通讯层、共识协议层与上层应用层三大部分,其中共识协议层是其关键部分。

Tendermint 在共识时并不关心具体交易细节,而只是将交易当作字节打包成区块,然后通过各节点之间的的机制达成共识。其要求上层应用状态更新为确定性过程,即从相同初始状态开始,在全网环境下交易顺序达成一致(即对于一个序列的消息所有的正常节点都会以相同的顺序进行处理),上层应用的状态在全网之间也应保持一致,区块链会包含上层应用的数字指纹来进行验证。

Tendermint 共识可以支持在上百个节点规模的区块链网络中实现秒级出块,其提供了逐块最终化(Finality)的特性,即一个块确认后可以保障其之前的所有块都不会被修改,保障了区块链网络安全性。

区块提交后,Tendermint 共识协议层通过 ABCI(应用层与共识层交互所抽象出来的接口)与上层进行互动,完成交易处理并返回结果。其将区块执行过程划分为多个步骤,上层应用拥有自主权来定义业务交互逻辑,通过特定接口进行开发与实现(如可以实现筛选验证者逻辑或复用 Tendermint Core 的共识协议与对等网络通信来实现链业务需求)。

关于 Tendermint 共识算法具体机制可以阅读以下论文进行了解:

其特有的一些机制带来了区块链共识过程中的显著优势。

首先,Tendermint 源于 PBFT SMR(State Machine Replication)算法,但对其机制进行了简化,其共识主要基于区块而不是用户请求,并且在机制上将 PBFT 常规流程与视图切换流程进行了统一,使其更容易理解与实现。

它提供了坚实的基础设施与良好的用户体验,是较早能够支持在上百个节点规模的区块链网络中支持秒级出块的底层,同时也通过逐块最终化(Finality)的方式确保之前的所有块都不会被修改,保障区块链网络安全性。

其节点之间通过 Gossip 协议进行通讯交互,不要求节点之间的全连接,而是通过 gossip 对等网络进行通信,这样可以有效降低节点之间的通讯成本,同时也可以有效提高网络的容错性。

Tendermint 算法实现细节与机制将在之后的系列文章中具体讲解。

IBC 协议组件

IBC 协议属于 Cosmos SDK 中一个特殊的模块,其主要为 Cosmos 提供了区块链之间的跨链能力,其主要原理是通过密码学技术来向其他链证明自己的链上事件,可以理解为跨链双方彼此为对方的一个轻节点(轻客户端),而两条链的通讯则是通过 relayer 实现,从而实现跨链通讯/交易。

这一部分细节较多,且与跨链较为相关,会单独出文章进行详细讲解。

总结

本文为 Cosmos 及 Tendermint 共识系列第一篇,主要介绍了区块链的技术发展、Cosmos 区块链框架中的 Tendermint 和 Cosmos SDK 等核心组件,并对 Tendermint 共识协议的原理和各机制进行了一些概述。受限于篇幅,主要以概念讲解与流程梳理为主,未涉及具体的技术实现细节与代码讲解,将会在后续的系列文章中对 Tendermint 共识算法/机制及 Cosmos SDK 代码实现进行补充。

参考资料

  1. 区块链架构与实现:Cosmos 详解 - 温隆/贾音

  2. Cosmos: The Internet of Blockchains

  3. Whitepaper - Resources - Cosmos Network

  4. 分布式系统与区块链共识机制 · Pseudoyu

  5. 走进 Cosmos 之 Tendermint

  6. 走进 Cosmos 之 Cosmos SDK