Cosmos 基础教程(一) -- 不可不知的开发术语
CometBFT
DOC
您可以在本节中找到几个技术术语的概述,包括每个术语的解释和进一步资源的链接——在使用Cosmos SDK进行开发时,所有这些都是必不可少的。
在本节中,您将了解以下术语:
-
Cosmos and Interchain
-
LCD
-
RPC
-
Protobuf -协议缓冲区
-
gRPC, gRPC-web和gRPC- gateway
-
Amino
所有这些术语都与如何在Cosmos SDK区块链中进行节点交互有关。
一、Cosmos and Interchain
Cosmos指的是特定于应用程序的区块链网络,由链间(Interchain )栈构建,并通过区块链间通信协议(Inter-Blockchain Communication Protocol,IBC)相互连接。然而,Cosmos 将很快被称为 Interchain
。术语“Cosmos”、“Cosmos 生态系统(Cosmos Ecosystem)”和“ Interchain ”可以理解为同义词。
二、Interchain 栈
Interchain 开发人员可用的各种工具可以统称为 Interchain 栈。
Tools within the Interchain Stack, which contain “Cosmos” in their name will remain unchanged by current terminology changes, such as the Cosmos SDK and CosmWasm. Any chain built with the Cosmos SDK can typically be referred to as “a Cosmos chain” or “appchain”.
名称中包含“Cosmos”的Interchain Stack中的工具将不会因当前的术语变化而改变,例如 Cosmos SDK 和 CosmWasm。任何使用Cosmos SDK构建的链都可以被称为“Cosmos链”或“应用链(appchain)”。
三、Cosmos Hub
Cosmos Hub是一个链,作为 Interchain 的经济中心和其他 Cosmos链的服务提供商。该中心使用Interchain Stack构建,是ATOM令牌、链间安全(Interchain Security)以及Cosmos SDK、Tendermint和IBC构建器的所在地。
四、Light client daemon (LCD)
与完整节点相比,轻客户端(light client
)只跟踪区块链上的某些信息片段。轻客户端不跟踪区块链的整个状态,也不包含链的每个交易/区块。
在Tendermint的共识中,轻客户端协议允许客户端受益于完整节点受益的相同程度的安全,同时带宽需求被最小化。客户端可以接收区块链状态和事务的加密证明,而无需同步所有块甚至它们的头。
查看Ethan Frey在Tendermint共识中的轻客户端(打开新窗口),了解更多关于轻客户端如何在Tendermint共识中使用的信息。
因此,轻客户端对于区块链间通信协议(IBC)如何跟踪时间戳、根哈希和下一个验证器集哈希等信息也至关重要。这节省了空间并提高了状态更新处理的效率。
light client daemon (LCD)是Cosmos SDK公开的HTTP1.1服务器,其默认端口是1317
。它为链公开了一个REST API,这意味着一个 representational state transfer
应用程序编程接口——这个API允许与RESTful web服务进行交互。传统上,每个查询都为LCD重新实现,并在幕后路由到RPC。
为什么称为
light client daemon(LCD)
?
在SDK v0.40之前,要获得REST API,必须打开新窗口运行另一个后端服务(或 daemon,一个继承自Unix的术语),例如使用gaiacli rest-server --laddr 0.0.0.0:1317 --node localhost:26657
。在Cosmos SDK v0.40中,REST被移动到节点服务(node service)中,使其成为Cosmos SDK的一部分,但术语“daemon”仍然存在,导致了light client daemon(LCD)的名称。
五、Remote procedure call (RPC)
远程过程调用(emote procedure call,RPC)是一种软件通信协议。这个术语经常出现在分布式计算中,因为RPC是一种实现进程间通信(IPC)的技术,它允许程序在不同的地址空间(不同的机器)中执行子例程过程。
RPC可以理解为客户端-服务器交互,其中“调用者”是客户端,更具体地说是请求程序,而“执行者”是服务器,更具体地说是提供服务的程序。交互是通过请求-响应消息传递系统(request-response message-passing)实现的。
简而言之,RPC是一种请求-响应协议,由客户机向远程服务器发送请求以执行子例程发起。
RPC允许调用不同的地址空间的函数。通常,被调用的函数在与调用它们的计算机不同的计算机上运行。然而,使用RPC,开发人员编码时就好像子例程是本地的一样;开发人员不必为远程交互编写详细的代码。因此,使用RPC意味着所有的调用过程基本上是相同的,不管它们是本地调用还是远程调用。
由于RPCs 实现了远程请求-响应协议,需要注意的是,如果出现网络问题,远程过程调用可能会失败。
六、RPC请求是如何工作的?
通常,当调用远程过程调用时,**过程参数(procedure parameters)**将通过网络传输到执行过程的执行环境。一旦完成,被调用的过程调用的结果将被转移到调用环境。然后在调用环境中恢复执行,就像在常规的本地过程调用中一样。
一个循序渐进的RPC请求可能如下所示:
- 客户端调用客户机存根——一段转换参数的代码,该代码在RPC期间在客户端和服务器之间传递。该调用是一个本地过程调用。
存根是代替较长程序的小程序例程。这使得机器的行为就像远程机器上的程序在本地操作一样。客户端有一个与远程过程接口的存根,而服务器有一个与原始请求过程接口的存根。
在RPC中,客户端存根替代了提供请求过程的程序。存根接受并将请求转发给远程过程。一旦远程过程完成请求,它将结果返回给存根,而存根又将结果传递给请求过程。
服务器还有一个与远程过程接口的存根。
- 客户端存根将过程参数打包到消息中。
Packing procedure parameters is called marshaling.
打包(Packing)过程参数称为封送处理(marshaling)。
具体来说,这是从一个或多个应用程序收集数据、将数据块放入消息缓冲区以及将数据组织成规定的数据格式的过程。
封送处理对于将用一种语言编写的程序的输出参数作为输入传递给用另一种语言编写的程序至关重要。
- 客户端存根然后发出一个系统调用来发送消息。
- 客户端的本地操作系统(OS)通过相应的传输层将消息从客户端(机器A)发送到服务器(机器B)。
- 服务器操作系统将传入的数据包传递给服务器存根。
- 服务器存根将消息及其所包含的过程参数解包(unpacks )——这称为解封送(
unmarshaling
)。 - 服务器存根调用服务器过程并执行该过程。
- 一旦过程完成,输出就返回到服务器存根。
- 服务器存根将返回值打包到消息中。
- 消息被发送到传输层,传输层将消息发送到客户端的传输层。
- 客户端存根对返回参数进行解封送,并将它们返回给原始调用客户端。
七、RPC and Cosmos
在Cosmos中,命令行界面(CLI)以及其他使用 RPCs 访问链。一个节点公开几个端点——gRPC、REST和Tendermint 端点(Tendermint endpoint)。
由Tendermint公开的Tendermint RPC端点是一个HTTP1.1服务器。默认端口号为 26657。gRPC服务器的默认端口为9090,REST服务器的默认端口为1317。Tendermint RPC独立于Cosmos SDK,可以进行配置。它使用HTTP POST和JSON-RPC 2.0进行数据编码。
有关Tendermint RPC、gRPC和REST服务器的更多信息,建议仔细查看Cosmos SDK文档。
Cosmos暴露了Tendermint RPC 和 Cosmos LCD。例如,CosmJS使用RPC来实现JSON-RPC API。
八、Protobuf
Protobuf(Protocol Buffers, 即“协议缓冲区”)是谷歌开发的一种开源、跨平台的数据格式。它帮助序列化结构化数据,并帮助网络中的程序通信或存储数据。
如果你想学习 Protobuf,看看官方文档可以帮助你深入了解,并提供指南和教程。
也可以看看关于这个平台上Protobuf的部分。
在Cosmos中,Protobuf是开发人员用来描述消息格式的数据序列化方法。在Cosmos应用程序中有很多内部通信,而Protobuf是如何完成通信的核心。
随着Cosmos SDK v0.40, Protobuf开始取代Amino作为链状态和交易的数据编码格式,部分原因是Protobuf的编码/解码性能比Amino更好。此外,开发人员工具也更适合Protobuf。切换的另一个好处是促进了gRPC
的使用,因为Protobuf自动定义和生成gRPC函数。因此,开发人员不再需要为RPC、LCD和CLI实现相同的查询。
九、gRPC
gRPC是一个开源、高性能的远程过程调用(RPC)框架。它由谷歌开发用于处理rpc,并于2016年发布。gRPC可以在任何环境中运行,并支持多种编程语言。
有关gRPC的更多信息和非常有用的入门信息,请参阅gRPC文档
gRPC使用HTTP2进行传输,使用协议缓冲区(Protobuf)对数据进行编码。gRPC有一个单一的规范,这使得所有的gRPC实现一致。
十、gRPC and Cosmos
在 Cosmos 中,gRPCs 是使用Protobuf提供服务的传输控制协议(TCP) ,也用于数据编码。默认端口号为9090
。
传输控制协议(TCP)是一种主要的互联网协议,它允许在客户端和服务器之间建立连接以发送数据。TCP使应用程序与internet协议(IP)之间的通信成为可能。
在Cosmos SDK中,Protobuf是主要的编码(encoding )库。
在Cosmos SDK中的编码
连线编码协议(wire encoding protocol)是定义数据如何从一点传输到另一点的协议。连线协议(Wire protocols)描述了在应用程序级别交换信息的方式。因此它是应用层协议中的通信协议,而不是传输协议。为了定义数据交换,连线协议需要以下特定属性:
- Data types(数据类型) – 数据单位、消息格式等。
- Communication endpoints (通信端点)
- Capabilities (能力)——交付保证、沟通方向等等。
有线协议可以是基于文本的协议,也可以是二进制协议。
在Cosmos SDK中,有两类二进制连线编码类型(binary wire encoding types):客户端编码和存储编码。客户端编码处理的是交易处理和交易签名,而存储编码处理的是状态机交易以及Merkle树中存储的内容。
Cosmos SDK使用两种二进制连线编码协议:
Amino: 一个对象编码规范。每个Cosmos SDK模块都使用氨基编解码器来序列化类型和接口。
协议缓冲区(Protocol Buffers,Protobuf):一种数据序列化方法,开发人员使用它来描述消息格式。
由于诸如性能缺陷和缺乏跨语言/客户端支持等原因,协议缓冲区比氨基越来越多地使用。
有关Cosmos SDK中编码的更多信息,请参考 Cosmos SDK documentation
十一、gRPC-web
gRPC支持不同的软件和硬件平台。gRPC-web
是针对浏览器客户端的gRPC的JavaScript实现。gRPC-web
客户端通过一个特殊的代理连接到gRPC
服务。
关于
gRPC-web
的更多信息,建议仔细查看gRPC存储库。
要深入研究如何使用gRPC-web进行开发,文档的快速入门和基础教程是非常有价值的资源。
与一般的gRPC一样,gRPC-web使用带有Protobuf的HTTP2进行数据编码。默认端口号为9091
。
Secret.js
is a JavaScript SDK used to write applications interacting with the Secret Network, which usesgRPC-web
.
十二、gRPC-gateway
gRPC-gateway
是一种将gRPC
端点公开为REST端点的工具。它帮助提供 RESTful 风格的APIs,读取gRPC
服务定义并生成反向代理服务器,可以将RESTful JSON API转换为gRPC。对于Protobuf Query
服务中定义的每个gRPC端点,Cosmos SDK提供了相应的REST端点。
gRPC- gateway
的目标是“为您的gRPC服务提供HTTP+JSON接口”。有了它,开发人员可以从gRPC
的所有优势中受益,同时,仍然提供一个 RESTful API——例如,当你想开发一个 web 应用程序,但浏览器不支持 HTTP2 时,这是一个非常有用的工具。这有助于确保向后兼容性和多语言、多客户端支持。
如果您想探索
gRPC-Gateway
,建议仔细查看gRPC-Gateway文档。
在Cosmos SDK中,gRPC-Gateway
提供了一个带有REST API的HTTP1.1服务器和一个base64编码的Protobuf用于数据编码;它将gRPC端点公开为REST端点。它在服务器上路由到gRPC
并与LCD
连接,因此它也在端口1317
上。
例如,如果由于浏览器不支持HTTP2而不能在应用程序中使用gRPC
,那么仍然可以使用Cosmos SDK
。SDK通过gRPC-Gateway
提供REST路由。
Terra.js , a JavaScript SDK for applications interacting with the Terra blockchain, uses gRPC-gateway.
十三、Amino
Amino是一个对象编码规范。在Cosmos SDK中,每个模块都使用Amino 编解码器(Amino codec)来帮助序列化类型和接口。Amino通过在具体类型(concrete type )前加上字节前缀来处理接口。
通常,Amino 编解码器类型和接口被注册在模块的域中。
具体类型是实现已注册接口的非接口类型。当类型存储在接口类型字段中或存储在带有接口元素的列表中时,需要注册类型。
作为最佳实践,初始化时请确保:
- 注册接口。
- 实现具体类型
- 检查问题,如冲突的前缀字节。
每个模块公开一个函数RegisterLegacyAminoCodec
。有了它,用户可以提供一个编解码器和注册所有类型。应用程序为必要的模块调用此方法。
使用Amino,当模块没有基于protobuf的类型定义时,原始线字节被编码并解码为具体的类型或接口。
要了解更多关于Go的Amino规范和实现,请参阅Tendermint Go Amino文档
Amino基本上是经过一些修改的JSON。例如,JSON规范没有定义大于2^53的数字,所以在Amino中编码大于uint64/int64的类型时使用字符串。
要了解更多关于Amino类型及其在JSON中的表示,请参阅Secret.js文档
相关文章:
Cosmos 基础教程(一) -- 不可不知的开发术语
CometBFT DOC 您可以在本节中找到几个技术术语的概述,包括每个术语的解释和进一步资源的链接——在使用Cosmos SDK进行开发时,所有这些都是必不可少的。 在本节中,您将了解以下术语: Cosmos and Interchain LCD RPC Protobuf -协议缓冲…...

JAVA JDK 常用工具类和工具方法
目录 Pair与Triple Lists.partition-将一个大集合分成若干 List集合操作的轮子 对象工具Objects 与ObjectUtils 字符串工具 MapUtils Assert断言 switch语句 三目表达式 IOUtils MultiValueMap MultiMap JAVA各个时间类型的转换(LocalDate与Date类型&a…...

Spring Bean循环依赖
解决SpringBean循环依赖为什么需要3级缓存?回答:1级Map保存单例bean。2级Map 为了保证产生循环引用问题时,每次查询早期引用对象,都拿到同一个对象。3级Map保存ObjectFactory对象。数据结构1级Map singletonObjects2级Map earlySi…...

Hive 2.3.0 安装部署(mysql 8.0)
Hive安装部署 一.Hive的安装 1、下载apache-hive-2.3.0-bin.tar.gz 可以自行下载其他版本:http://mirror.bit.edu.cn/apache/hive/ 2.3.0版本链接:https://pan.baidu.com/s/18NNVdfOeuQzhnOHVcFpnSw 提取码:xc2u 2、用mobaxterm或者其他连接…...
IPD术语表
简称英文全称中文ABPannual business plan年度商业计划ABCactivity -based costing基于活动的成本估算ABMactivity -based management基于活动的管理ADCPavailability decision check point可获得性决策评审点AFDanticipatory failure determination预防错误决定AMEadvanced ma…...
目标检测损失函数 yolos、DETR为例
yolos和DETR,除了yolos没有卷积层以外,几乎所有操作都一样。 HF官方文档 因为目标检测模型,实际会输出几百几千个“框”,所以损失函数计算比较复杂。损失函数为偶匹配损失 bipartite matching loss,参考此blog targe…...

linux系统编程2--网络编程socket
在linux系统编程中网络编程是使用socket(套接字),socket这个词可以表示很多概念:在TCP/IP协议中,“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址端口号”就称为socket。在TCP协议中&#…...

FPGA纯Verilog实现任意尺寸图像缩放,串口指令控制切换,贴近真实项目,提供工程源码和技术支持
目录1、前言2、目前主流的FPGA图像缩放方案3、本方案的优越性4、详细设计方案5、vivado工程详解6、上板调试验证并演示7、福利:工程源码获取1、前言 代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植; 图…...
华为OD机试题 - 最长合法表达式(JavaScript)| 代码+思路+重要知识点
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...
L1-005 考试座位号
L1-005 考试座位号 每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试…...
Obsidian + remotely save + 坚果云:实现电脑端和手机端的同步
写在前面:近年来某象笔记广告有增无减,不堪其扰,便转投其它笔记,Obsidian、OneNote、Notion、flomo都略有使用,本人更偏好obsidian操作简单,然其官方同步资费甚高,囊中羞涩,所幸可通…...

对比学习MoCo损失函数infoNCE理解(附代码)
MoCo loss计算采用的损失函数是InfoNCE: 下面是MoCo的伪代码,MoCo这个loss的实现就是基于cross entropy loss。 将k作为q的正样本,因为k与q是来自同一张图像的不同视图;将queue作为q的负样本,因为queue中含有大量…...

logd守护进程
logd守护进程1、adb logcat命令2、logd守护进程启动2.1 logd文件目录2.2 main方法启动3、LogBuffer缓存大小3.1 缓存大小优先级设置3.2 缓存大小相关代码位置android12-release1、adb logcat命令 命令功能adb bugreport > bugreport.txtbugreport 日志adb shell dmesg >…...

【汽车雷达通往自动驾驶的关键技术】
本文编辑:调皮哥的小助理 现代汽车雷达装置比手机还小,能探测前方、后方或侧方的盲点位置是否存在障碍物,但这还不百分之百实现全自动驾驶的。传统的汽车雷达分辨率都不高,只能“看到”一团东西,可以检测到汽车周围存在…...
2023实习面经
实习面经 秋招笔试面试全记录 字节-电商 字节实习一面: 二分类的损失函数是什么,怎么算?多分类的损失函数怎么算?如果文本分类的标签有多个,比如一个文本同时属于多个label那怎么办?如果文本分类里面的…...
linux shell 入门学习笔记2shell脚本
什么是shell脚本 当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序就称之为shell脚本。 有了shell脚本肯定是要有对应的解释器了,常见的shell脚本解释器有sh、python、perl、tcl、php、ruby等。一般这种使用文…...

Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误
前言想必大家曾经被各种Native Crash折磨过,本地测试没啥问题,一到线上或者自动化测试就出现各种SIGSEGV、SIGABRT、SIGILL、SIGBUS、SIGFPE异常,而且堆栈还是崩溃到libc.so这种,看起来跟我们的代码没啥关系,关键还不好…...
HyperOpt-quniform 范围问题
在使用 quniform 的时候,可能会出现超出指定范围的值,例如对于 GBDT 设置参数空间为 learning_rate:hp.quniform(learning_rate,0.05,2.05,0.2),但是仍然会报错 ValueError: learning_rate must be greater than 0 but was 0.0,但…...

Pycharm搭建一个Django项目
File->new project 点击create, 等待一下即可 查看安装 Django 版本: 在 Pycharm 底部选择 Terminal 然后在里面输入:python -m django --version 启动项目: 在 Terminal 里面输入: python manage.py runserver 查看文件目…...
浅析前端工程化中的一部曲——模块化
在日益复杂和多元的 Web 业务背景下,前端工程化经常会被提及。工程化的目的是高性能、稳定性、可用性、可维护性、高效协同,只要是以这几个角度为目标所做的操作,都可成为工程化的一部分。工程化是软件工程中的一种思想,当下的工程…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...