9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

深度剖析区块链跨链技术 Cosmos(上篇)

  • 2020-02-24
  • 本文字数:5207 字

    阅读完需:约 17 分钟

深度剖析区块链跨链技术Cosmos(上篇)

区块链的公链项目越来越多,每个项目都是一个孤立的网络体系,因此区块链项目之间的互联互通能力也是技术发展的大方向。这其中 Cosmos 项目是其中的优秀代表。本文作者从 Cosmos 核心技术 Tendermint 开始,深度剖析 Cosmos 项目,让大家对跨链技术将一个比较深入的了解。

导读

2017 年以来,区块链项目出现了井喷式地上升,然而在喜人增长态势的背后,人们也注意到大部分项目都缺乏与其它区块链项目互连互通的能力而成为孤立的网络体系。因此,跨链技术也逐渐进入了大家的视野,本文将为大家解读一个跨链项目 Cosmos,看看它是如何做到让不同区块链的价值网络实现互通的。通过对该项目的解读,让大家对跨链项目有个初步的了解。同时受限于篇幅,我们会分为上下两篇,上篇带大家先了解 Cosmos 的核心技术 Tendermint,下篇会着重介绍 Cosmos。

Tendermint 概述

提到区块链,大家想必已然不陌生了,不过更多人想到的可能会是众所周知的 Bitcoin 和 Ethereum。的确,两者分别是区块链技术的起源和发展的代表,也是大家广泛传播和深入研究的对象。但是随着 Bitcoin 的不断推进,比特币工作量证明共识机制在速度和扩展性上的不足也逐步展现出来。


Cosmos 的开发团队 Tendermint 其实早在 2014 年就开始意识到了其不足,并持续专注于寻求不依赖挖矿等高电力消耗的共识机制,提供快速的交易处理能力,它们的目标是为全世界所有的区块链提供速度、安全和可扩展性。目前,Tendermint 加入了微软 Azure 区块链即服务平台,也成为了以太坊区块链联盟成员之一,同时 Tendermint 也是跨链技术 Cosmos 的核心技术。两者大致的关系如下:



图中可以轻松看出 Cosmos 就是在 Tendermint 基础上添加一些插件功能来实现的,上篇暂不对 Cosmos 做过多阐述,先来认识一下 Tendermint。

Tendermint 是什么

首先让我们来看看官方定义:


Tendermint is software for securely and consistently replicating an application on many machines. By securely, we mean that Tendermint works even if up to 1/3 of machines fail in arbitrary ways. By consistently, we mean that every non-faulty machine sees the same transaction log and computes the same state. Secure and consistent replication is a fundamental problem in distributed systems; it plays a critical role in the fault tolerance of a broad range of applications, from currencies, to elections, to infrastructure orchestration, and beyond.


Tendermint consists of two chief technical components: a blockchain consensus engine and a generic application interface. The consensus engine, called Tendermint Core, ensures that the same transactions are recorded on every machine in the same order. The application interface, called the Application BlockChain Interface (ABCI), enables the transactions to be processed in any programming language. Unlike other blockchain and consensus solutions, which come pre-packaged with built in state machines (like a fancy key-value store, or a quirky scripting language), developers can use Tendermint for BFT state machine replication of applications written in whatever programming language and development environment is right for them.


上面的定义有点长,总结下有以下几点:


1.Tendermint 是一个能够在不同机器上,安全一致复制应用的软件,其中安全性和一致性也是分布式账本的关键概念。


2.Tendermint 具备拜占庭容错能力,是一种拜占庭容错共识算法。


3.Tendermint 主要有两部分组成:


  • Tendermint Core:区块链共识引擎,负责节点之间数据传输以及拜占庭共识。

  • ABCI:区块链应用程序接口,也是一个协议,支持任何语言的交易处理实现。


总体来讲,Tendermint 可以理解为一个模块化的区块链软件框架,支持开发者个性化定制自己的区块链,而又不需要考虑共识以及网络传输的实现。

Tendermint 设计原则

先简单说说区块链的概念,区块链是一个具备确定性的状态机,可以在不信任的节点之间进行状态复制,包括应用的状态和改变状态的交易。从架构的层面上,区块链可以简单分为三个概念层:


  • 网络层(Networking):负责交易和数据传输和同步。

  • 共识算法(Consensus):负责不同的验证节点处理完交易后,保证状态的一致,也就是将交易打包到区块中。

  • 应用程序(Application):交易的真正执行者。


大致框架如下:



目前大部分的区块链实现都是采用上面的框架,实现成单一的程序,但是这就很容易出现两个问题:


1.代码复用困难,代码库的分支管理变得复杂。


2.限制了应用开发的语言。


如何去规避这两个问题呢?Tendermint 设计了自己的一套框架,其设计原则是易使用,易理解,高性能,适用于各种分布式应用。它的创新之处在于,将区块链应用(状态)与底层共识进行了分离,将共识引擎和 P2P 网络层封装组成 Tendermint Core。同时提供 ABCI 接口与应用层进行交互,应用逻辑可以用任何语言编写,应用做的事情实际上就是状态机控制。基于这种架构,应用的开发者可以方便地实现自己的区块链。



Tendermint 的框架总体来讲分为 ABCI Application 以及 Tendermint Core 两部分,两者通过 ABCI 连接。下面会对这两部分依次展开介绍。


  • Tendermint 核心模块


ABCI Application


开发者定制开发的区块链应用,开发语言不受限制,可以使用任何语言进行开发,但是必须实现为一个 ABCI Server,即需要满足以下几点:


1.是一个 Socket Server,需支持 TSP 或 GRPC 两种方式之一。


2.能够处理 ABCI Message。所有的 ABCI 消息类型都是通过 protobuf 来定义的,具体的消息格式可 3.参考https://github.com/tendermint/abci/blob/master/types/types.proto


实现区块链应用接口(ABCI)。ABCI 是 Tendermint 中定义的一套 Application 与 Tendermint Core 之间交互的协议。详细定义如下(版本:0.10.3):



ABCI 接口可以分为三类:信息查询、交易校验以及共识相关处理。而 Tendermint Core 作为 ABCI Client 在启动时,会与 ABCI Server 建立三个连接,分别用于这三类接口消息的处理。


在 Tendermint Core 与 Application 交互的所有消息类型中,有 3 种主要的消息类型:


1.CheckTx 消息用于验证交易。Tendermint Core 中的 mempool 通过此消息校验交易的合法性,通过之后才会将交易广播给其它节点。


2.DeliverTx 消息是应用的主要工作流程,通过此消息真正执行交易,包括验证交易、更新应用程序的状态。


3.Commit 消息通知应用程序计算当前的世界状态,并存在下一区块头中。


Tendermint Core


Tendermint 共识引擎,包含区块链需要大部分功能实现,主要有:


  • 共识算法:拜占庭 POS 算法。

  • P2P:采用 gossip 算法,默认端口是 46656。

  • RPC:区块链对外接口,默认端口是 46657。支持三种访问方式:URI over HTTP、JSONRPC over HTTP、JSONRPC over websockets。详细的 RPC 接口定义列表可以参考 https://tendermint.github.io/slate

  • 其它:交易缓存池、消息队列等。


共识算法


Tendermint 是一个易于理解的 BFT 共识协议。协议遵循一个简单的状态机,如下:



协议中有两个角色:


  • 验证人:协议中的角色或者节点,不同的验证者在投票过程中具备不同的权力(vote power)。

  • 提议人:由验证人轮流产生。


验证人轮流对交易的区块提议并对提议的区块投票。区块被提交到链上,且每个区块就是一个区块高度。但区块也有可能提交失败,这种情况下协议将选择下一个验证人在相同高度上提议一个新块,重新开始投票。


从图中可以看到,成功提交一个区块,必须经过两阶段的投票,称为 pre-vote 和 pre-commit。当超过 2/3 的验证人在同一轮提议中对同一个块进行了 pre-commit 投票,那么这个区块才会被提交。


由于离线或者网络延迟等原因,可能造成提议人提议区块失败。这种情况在 Tendermint 中也是允许的,因为验证人会在进入下一轮提议之前等待一定时间,用于接收提议人提议的区块。


假设少于三分之一的验证人是拜占庭节点,Tendermint 能够保证验证人永远不会在同一高度重复提交区块而造成冲突。为了做到这一点,Tendermint 引入了锁定机制,一旦验证人预投票了一个区块,那么该验证人就会被锁定在这个区块。然后:


1.该验证人必须在预提交的区块进行预投票。


2.当前一轮预提议和预投票没成功提交区块时,该验证人就会被解锁,然后进行对新块的下一轮预提交。


可以看到,Tendermint 共识算法和 PBFT 时非常相似的,可以说是 PBFT 的变种,那我们来比较一下:


相同点:


1.同属 BFT 体系。


2.抗 1/3 拜占庭节点攻击。


3.三阶段提交,第一阶段广播交易(区块),后两阶段广播签名(确认)。


4.两者都需要达到法定人数才能提交块。


不同点:


1.Tendermint 与 PBFT 的区别主要是在超过 1/3 节点为拜占庭节点的情况下。当拜占庭节点数量在验证者数量的 1/3 和 2/3 之间时,PBFT 算法无法提供保证,使得攻击者可以将任意结果返回给客户端。而 Tendermint 共识模型认为必须超过 2/3 数量的 precommit 确认才能提交块。举个例子,如果 1/2 的验证者是拜占庭节点,Tendermint 中这些拜占庭节点能够阻止区块的提交,但他们自己也无法提交恶意块。而在 PBFT 中拜占庭节点却是可以提交块给客户端。


3.另一个不同点在于拜占庭节点概念不同,PBFT 指的是节点数,而 Tendermint 代表的是节点的权益数,也就是投票权力。


3.最后一点,PBFT 需要预设一组固定的验证人,而 Tendermint 是通过要求超过 2/3 法定人数的验证人员批准会员变更,从而支持验证人的动态变化。


P2P 网络

Tendermint 的 P2P 网络协议借鉴了比特币的对等发现协议,更准确地说,Tendermint 是采用了 BTCD 的 P2P 地址簿(Address Book)机制。当连接建立后,新节点将自身的 Address 信息(包含 IP、Port、ID 等)发送给相邻节点,相邻节点接收到信息后加入到自己的地址薄,再将此条 Address 信息,转播给它的相邻节点。


此外为了保证节点之间数据传输的安全性,Tendermint 采用了基于 Station-to-Station 协议的认证加密方案,此协议是一种密钥协商方案,基于经典的 DH 算法,并提供相互密钥和实体认证。大致的流程如下:


1.每一个节点都必须生成一对 ED25519 密钥对作为自己的 ID。


2.当两个节点建立起 TCP 连接时,两者都会生成一个临时的 ED25519 密钥对,并把临时公钥发给对方。


3.两个节点分别将自己的私钥和对方的临时公钥相乘,得到共享密钥。这个共享密钥对称加密密钥。


4.将两个临时公钥以一定规则进行排序,并将两个临时公钥拼接起来后使用 Ripemd160 进行哈希处理,后面填充 4 个 0,这样可以得到一个 24 字节的随机数。


5.得到的随机数作为加密种子,但为了保证相同的随机数不会被相同的私钥使用两次,我们将随机数最后一个 bit 置为 1,这样就得到了两个随机数,同时约定排序更高的公钥使用反转过的随机数来加密自己的消息,而另外一个用于解密对方节点的消息。


6.使用排序的临时公钥拼接起来,并进行 SHA256 哈希,得到一个挑战码。


7.每个节点都使用自己的私钥对挑战码进行签名,并将自己的公钥和签名发给其它节点校验。


8.校验通过之后,双方的认证就验证成功了。后续的通信就使用共享密钥和随机数进行加密,保护数据的安全。


应用示例

Tendermint 官方项目里内置了 ABCI Application 的两个简单实现 counter 以及 kvstore。这个两个 Demo 逻辑非常简单,运行起来也非常简单,以 kvstore 为例,只需要下面三条简单的指令就可以轻松的跑起来:

tendermint init

abci-cli kvstore

tendermint node


复杂一点,假设想使用 Tendermint 实现一套类似 Ethereum 的应用,最终应该是这样:



由 Tendermint Core 负责交易和区块的共享以及共识处理,开发者只需将 go-ethereum 和 ABCI Server 集成一个 ABCI 应用。Ethermint 项目就是 Tendermint 团队开发的一个类似应用,大家可以参考,遗憾的是目前 Ethermint 目前只支持低版本的 abci 和 go-ethereum。

Tendermint 工作流


上图简单描述了 Tenermint 的工作流。大致为:


1.client 通过 RPC 接口 broadcast_tx_commit 提交交易;


2.mempool 调用 ABCI 接口 CheckTx 用于校验交易的有效性,比如交易序号、发送者余额等,同时订阅交易执行后的事件并等待监听。


3.共识从 mempool 中获取交易开始共识排序,打包区块,确定之后依次调用 ABCI 相关接口更新当前的世界状态,并触发事件。


4.最终将交易信息返回 client。

总结

本文从概念、设计原则以及架构等方面对 Tendermint 做了详细的介绍,让大家可以直观了解到 Tendermint 的设计思想和实现原理。了解 Tendermint 之后,方便大家:


1.可以快速开发出自己的区块链应用而无需关注共识和 P2P 网络。


2.能够很好的兼容到 Cosmos 跨链生态中,因为 Tendermint 是 Cosmos 的核心技术。


3.开发支持任何编程语言的区块链。


本文转载自美图技术公众号。


原文链接:https://mp.weixin.qq.com/s/5Eej8usYtdKLCXdgCRiVmA


活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2020-02-24 19:161540

评论

发布
暂无评论
发现更多内容

中国特色新基建可视化,工程监控画面还能这么美?你绝对没见过

一只数据鲸鱼

物联网 新基建 数据可视化 绿色工业

一份阿里Java学习路线出现“病毒式”传播,导致44人秋招同时拿到offer

Java架构师迁哥

OVS 设计与实现阅读笔记,五年前的这篇论文里这些问题已经明了

York

Kubernetes k8s Kube-OVN

Kube-OVN再更新! v0.8.0 支持网关高可用以及网络监控集成

York

灵雀云 Kubernetes k8s Kube-OVN

Kube-OVN v0.9.0更新,网络可视化和控制平面稳定性提升

York

灵雀云 Kubernetes k8s Kube-OVN

“58同城”架构师分享:联盟广告平台架构及实践

Java架构师迁哥

视频课程|Kube-OVN 入门与应用实战 (第1期)

York

灵雀云 Kubernetes k8s Kube-OVN

即时通讯是怎么做到的?

v16629866266

微信沟通小技巧

熊斌

远程办公 职场成长 远程协作 28天写作

20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

Serverless Devs

Python 人工智能 Serverless 云原生

一个20年技术老兵的 2020 年度技术总结

万俊峰Kevin

微服务 go-zero Go 语言

2021年阿里巴巴面试参考指南泰山版开源(Java版)

Java架构追梦

Java 架构 面试 分布式 微服务

视频课程|Kube-OVN 入门与应用实战 (第2期)

York

灵雀云 Kubernetes k8s Kube-OVN

架构师训练营技术知识点

三板斧

架构师训练营第 1 期

教小师妹快速入门Maven,嘿嘿嘿...

田维常

maven

腾讯大佬亲自总结出“Java知识地图+学习路线”从点到面一应俱全!不看血亏

比伯

Java 编程 架构 程序人生 计算机

Yarn RM写ZNode超数据量限制bug修复

笨小康

大数据 zookeeper YARN

灵雀云开源项目 Kube-OVN 亮相开源基础设施峰会

York

灵雀云 Kubernetes k8s Kube-OVN

电商后链路如何做好私域运营?

Linkflow

客户数据平台 CDP 客户画像

性能压测工具-JAVA

Kube-OVN v 0.7.0 发布,IPAM、子网和安全功能增强

York

灵雀云 Kubernetes k8s Kube-OVN

剖析JDK:强引用、软引用、弱引用、虚引用有何区别?

后台技术汇

28天写作

28 天写作营 Day 1--120%的技术人员体系

张老蔫

28天写作

Python进阶系列文章汇总

Kaito

Python 爬虫

代码整洁之道

田维常

代码

Spring Cloud(零)《总有一偏概述告诉你SpringCloud是什么》

小傅哥

小傅哥 springboot 28天写作

同城快递系统-大作业

三板斧

极客时间架构师一期

2021年的28天写作,从微信视频号开始

赵新龙

法庭上的CTO 28天写作

区块链多币种钱包系统软件开发|区块链多币种钱包APP开发

系统开发

“持证”就能上岗 京东绿色内推招聘通道开启

京东科技开发者

云计算 大数据 程序人生

容器网络方案调研:都是网络插件,Kube-OVN凭啥脱颖而出?

York

灵雀云 Kubernetes k8s Kube-OVN

  • 扫码添加小助手
    领取最新资料包
深度剖析区块链跨链技术Cosmos(上篇)_行业深度_美图技术_InfoQ精选文章