Cosmos 基础(二)-- Ignite CLI

news2024/9/26 7:49:28

官网

DOC

GitHub

你的项目值得拥有自己的区块链。

Ignite使开发、增长和启动区块链项目比以往任何时候都更快。

Ignite CLI是一个一体化平台,可以在主权和安全的区块链上构建、启动和维护任何加密应用程序

Install Ignite

一、安装

你可以在基于web的Gitpod IDE中运行Ignite CLI,也可以在本地计算机上安装Ignite CLI

1.1 先决条件

在安装和使用Ignite CLI之前,请确保您已经满足了先决条件。

操作系统

支持以下操作系统:

  • GNU/Linux
  • macOS
  • Windows Subsystem for Linux (WSL)

Go

Ignite CLI是用Go编程语言编写的。使用实例在本地系统上使用Ignite CLI。

  • 安装Go(版本1.16或更高)
  • 确保在系统上正确地设置了Go环境变量

1.2 安装 Ignite CLI

要安装最新版本的ignite二进制文件,请使用以下命令

curl https://get.ignite.com/cli! | bash

该命令调用curl来下载安装脚本,并将输出通过管道传递给bash来执行安装。ignite二进制文件安装在/usr/local/bin

要了解更多信息或自定义安装过程,请参阅GitHub上的安装程序文档。

使用以下命令安装Ignite CLI v0.22.2:

curl https://get.ignite.com/cli@v0.22.2! | bash

验证您的Ignite CLI版本

ignite version

在这里插入图片描述

1.3 升级您的Ignite CLI安装

在安装新版本的Ignite CLI之前,请删除所有现有的Ignite CLI安装。

删除当前的Ignite CLI安装:

  1. 在你的终端窗口,按Ctrl+C停止用ignite chain serve开启的chain。
  2. 使用rm $(which ignite)删除Ignite CLI二进制文件。根据您的用户权限,使用或不使用sudo运行该命令。
  3. 重复此步骤,直到从系统中移除所有ignite

1.4 Build from source

git clone https://github.com/ignite/cli --depth=1
cd cli && make install

1.5 使用

Usage:
  ignite [command]

Available Commands:
  scaffold    Scaffold a new blockchain, module, message, query, and more
  chain       Build, initialize and start a blockchain node or perform other actions on the blockchain
  generate    Generate clients, API docs from source code
  network     Launch a blockchain in production
  node        Make calls to a live blockchain node
  account     Commands for managing Ignite accounts
  relayer     Connect blockchains by using IBC protocol
  tools       Tools for advanced users
  docs        Show Ignite CLI docs
  version     Print the current build information
  help        Help about any command
  completion  Generate the autocompletion script for the specified shell

Flags:
  -h, --help   help for ignite

Use "ignite [command] --help" for more information about a command.

二、Hello, Ignite CLI

本教程是开始 Cosmos 生态系统之旅的好地方。与其思考如何构建区块链,不如遵循以下步骤构建您的第一个区块链和您的第一个Cosmos SDK模块。

2.1 Get started

在前一章中,您已经学习了如何安装Ignite CLI,该工具为您提供了用去中心化的全球社区构建、测试和推出你的区块链所需的一切。

Ignite CLI附带了许多脚手架命令,旨在通过创建开始处理特定任务所需的一切来简化开发。

首先,使用Ignite CLI构建一个新的Cosmos SDK区块链的基础。使用Ignite CLI,您不必自己编写区块链代码。

使用默认目录结构创建区块链:

ignite scaffold chain hello

在这里插入图片描述

这个命令在hello目录中创建一个名为helloCosmos SDK区块链。hello目录中的源代码包含一个完全功能的现成的区块链。

全新区块链导入标准Cosmos SDK模块,包括:

  • staking 用于委托权益证明(delegated Proof-of-Stake, PoS)共识机制
  • bank 用于帐户之间的同质化代币(fungible token)转账
  • gov 为了链上治理
  • 和其他Cosmos SDK模块,这些模块提供了广泛的Cosmos SDK框架的好处

要了解刚才使用的命令,请运行:

ignite scaffold --help

2.2 区块链目录结构

创建区块链后,切换到它的目录:

cd hello

在这里插入图片描述

hello目录包含许多生成的文件和目录,它们构成了Cosmos SDK区块链的结构。本教程中的大部分工作都在x目录中进行。下面是默认创建的文件和目录的快速概览:

File/directoryPurpose
app/将区块链连接在一起的文件。最重要的文件是app.go,它包含区块链的类型定义以及创建和初始化它的函数。
cmd/负责编译的二进制命令行的主包。
docs/项目文档目录。默认情况下,会生成一个OpenAPI规范。
proto/描述数据结构的Protocol buffer文件 。
testutil/用于测试的辅助函数。
vue/Vue 3 web应用模板。
x/Cosmos SDK模块和自定义模块。
config.yml开发中用于定制链的配置文件。
readme.md自主的应用程序特定的区块链项目的自述文件。

现在您可以在单个节点上启动区块链并在本地运行。

2.3 启动区块链

你已经有了一个功能齐全的区块链。要在开发机器上启动链,在hello目录中运行以下命令

ignite chain serve

这个命令下载依赖项并将源代码编译成一个名为hellod的二进制文件。默认情况下,二进制名称是repo + d的名称。从现在开始,使用这个hellod二进制来运行您的所有链命令。例如,初始化一个验证器节点并启动一个节点。

当链运行时,请保持此终端窗口打开。

在这里插入图片描述

2.4 HTTP API控制台

默认情况下,验证器节点公开两个API端点:

  • http://localhost:26657 for the low-level Tendermint API
  • http://localhost:1317 for the high-level blockchain API

现在你已经启动了hello链,使用web浏览器查看高阶hello区块链APIhttp://localhost:1317:
在这里插入图片描述

2.5 停止区块链

当你想停止你的区块链时,在它运行的终端窗口中按Ctrl+C

在开发环境中,您可以进行试验并立即看到更新。您不必在进行更改后重新启动区块链。热重新加载会自动检测您在hello目录文件中所做的所有更改。

2.6 Say “Hello, Ignite CLI”

让你的区块链说"Hello, Ignite CLI ",你需要做这些更改:

  • 修改protocol buffer文件
  • 创建一个返回数据的keeper查询函数
  • 注册查询函数

protocol buffer文件包含定义Cosmos SDK查询和消息处理程序的 proto rpc调用,以及定义Cosmos SDK类型的proto messages。rpc调用还负责公开 HTTP API

对于每个Cosmos SDK模块,Keeper都是修改区块链状态的抽象。Keeper函数允许您查询或写入状态。将第一个查询添加到链后,下一步是注册查询。您只需要注册查询一次。

典型的区块链开发人员工作流是这样的:

  • 从proto文件开始定义Cosmos SDK消息
  • 定义和注册查询
  • 定义消息处理程序逻辑
  • 最后,在keeper函数中实现这些查询和消息处理程序的逻辑

2.7 创建一个查询

对于所有后续命令,使用不同于您在其中启动区块链的窗口的终端窗口。

在另一个终端窗口中,hello目录中运行命令。
创建一个hello查询:

ignite scaffold query hello --response text

query 接受查询的名称(在本例中为hello)、一个可选的请求参数列表(在本例中为空)和一个可选的--response指定的以逗号分隔的响应字段列表(在本例中为text)。

query命令已经创建并修改了几个文件:

在这里插入图片描述

让我们来看看其中的一些变化。为了清晰起见,下面的代码块没有显示Ignite CLI用于生成脚手架代码的占位符注释。不要删除这些占位符,因为他们需要继续使用Ignite CLI的脚手架功能。

注意:建议在搭建之后将更改提交给版本控制系统(例如Git)。这使得其他人可以很容易地区分Ignite生成的代码和手工编写的代码。

git add .
git commit -am "Scaffolded a hello query with Ignite CLI"

在这里插入图片描述

2.7.1 Updates to the query service

proto/hello/query文件中,Hello rpc已添加到Query服务中。

service Query {
    rpc Hello(QueryHelloRequest) returns (QueryHelloResponse) {
        option (google.api.http).get = "/hello/hello/hello";
    }
}

下面是Query服务的Hello rpc的工作原理:

  • 负责返回一个text 字符串
  • 接受请求参数(QueryHelloRequest)
  • 返回类型为QueryHelloResponse的响应
  • option定义gRPC用于生成HTTP API的端点

2.7.2 Request and reponse types

现在,看看下面的请求和响应类型:

message QueryHelloRequest {
}

message QueryHelloResponse {
  string text = 1;
}

QueryHelloRequest消息是空的,因为这个请求不需要参数。
QueryHelloResponse消息包含从链返回的文本text

2.8 Hello keeper function

x/hello/keeper/grpc_query_hello.go文件包含处理查询并返回数据的Hello keeper函数。

func (k Keeper) Hello(goCtx context.Context, req *types.QueryHelloRequest) (*types.QueryHelloResponse, error) {
    if req == nil {
        return nil, status.Error(codes.InvalidArgument, "invalid request")
    }
    ctx := sdk.UnwrapSDKContext(goCtx)
    _ = ctx
    return &types.QueryHelloResponse{}, nil
}

Hello函数执行以下操作:

  • 对请求进行基本检查,如果为nil则抛出错误
  • 将上下文存储在包含请求环境信息的ctx变量中
  • 返回QueryHelloResponse类型的响应

现在响应是空的。

2.8.1 Update keeper function

query.proto文件,响应接受text

  • 使用文本编辑器修改包含keeper函数x/hello/keeper/grpc_query_hello.go文件
  • 在keeper函数的最后一行,将该行更改为返回“Hello, Ignite CLI!”:
func (k Keeper) Hello(c context.Context, req *types.QueryHelloRequest) (*types.QueryHelloResponse, error) {
    if req == nil {
        return nil, status.Error(codes.InvalidArgument, "invalid request")
    }
    ctx := sdk.UnwrapSDKContext(goCtx)
    _ = ctx
    return &types.QueryHelloResponse{Text: "Hello, Ignite CLI!"}, nil // <--
}
  • 保存文件以重新启动区块链。
  • 在web浏览器中,访问hello端点http://localhost:1317/hello/hello/hello
    因为查询处理程序还没有向gRPC注册,所以您会看到一个未实现或本地主机不能连接的错误。此错误是预期的行为,因为您仍然需要注册查询处理程序。
    在这里插入图片描述

2.9 注册query 处理程序

x/hello/module.go文件进行必要的更改。

1、 在import语句的包列表中添加“context”。

import (
    // ...

    "context"

    // ...
)

还没有保存文件,您需要继续进行这些修改。

2、搜索RegisterGRPCGatewayRoutes。
3、注册query 处理程序:

func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
    types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
}

4、链启动后,访问http://localhost:1317/hello/hello/hello,看到你的文字显示:

{
  "text": "Hello, Ignite CLI!",
}

在这里插入图片描述

query 命令也有脚手架
x/hello/client/cli/query_hello.go实现了一个相当于CLI中的hello查询,并将该命令挂载在x/hello/client/cli/query.go中。执行以下命令,得到相同的JSON响应:

hellod q hello hello

在这里插入图片描述

[root@localhost hello]# hellod -h
Stargate CosmosHub App

Usage:
  hellod [command]

Available Commands:
  add-genesis-account Add a genesis account to genesis.json
  collect-gentxs      Collect genesis txs and output a genesis.json file
  config              Create or query an application CLI configuration file
  debug               Tool for helping with debugging your application
  export              Export state to JSON
  gentx               Generate a genesis tx carrying a self delegation
  help                Help about any command
  init                Initialize private validator, p2p, genesis, and application configuration files
  keys                Manage your application's keys
  migrate             Migrate genesis to a specified target version
  query               Querying subcommands
  rollback            rollback cosmos-sdk and tendermint state by one height
  start               Run the full node
  status              Query remote node for status
  tendermint          Tendermint subcommands
  tx                  Transactions subcommands
  validate-genesis    validates the genesis file at the default location or at the location passed as an arg
  version             Print the application binary version information

Flags:
  -h, --help                help for hellod
      --home string         directory for config and data (default "/root/.hello")
      --log_format string   The logging format (json|plain) (default "plain")
      --log_level string    The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")
      --trace               print out full stack trace on errors

Use "hellod [command] --help" for more information about a command.

祝贺您,您已经构建了您的第一个区块链和您的第一个Cosmos SDK模块。继续学习,了解更多关于搭建Cosmos SDK消息、协议缓冲区文件中的类型、保存器(keeper)等的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23种设计模式(七)——桥接模式【单一职责】

文章目录 意图什么时候使用桥接真实世界类比桥接模式的实现桥接模式的优缺点亦称:Bridge 意图 桥接模式是将抽象部分与实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 什么时候使用桥接 1、如果一个…

详解MySQL数据库索引实现机制 - B树和B+树

详解MySQL数据库索引实现机制 - B树和B树1.索引的出现2.hash算法的缺点3.二叉排序树BST4.平衡二叉树AVL5.红黑树6.B树诞生了7.B树1.索引的出现 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。…

(Netty)Handler Pipeline

Handler & Pipeline ChannelHandler 用来处理 Channel 上的各种事件&#xff0c;分为入站、出站两种。所有 ChannelHandler 被连成一串&#xff0c;就是 Pipeline 入站处理器通常是 ChannelInboundHandlerAdapter 的子类&#xff0c;主要用来读取客户端数据&#xff0c;写…

【嵌入式处理器】CPU、MPU、MCU、DSP、SoC、SiP的联系与区别

1、CPU(Central Processing Unit) CPU(Central Processing Unit)&#xff0c;是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。众所周知的三级流水线&#xff1a;取址、译码、执行的对象就是CPU&#xff0c;差…

重学Android之View——TabLayoutMediator解析

重学Android之View——TabLayoutMediator解析 1.前言 在使用TabLayoutViewPager2Fragment的时候&#xff0c;查询别人的使用例子&#xff0c;看到了 TabLayoutMediator这个类&#xff0c;撰写此文&#xff0c;仅当学习思考&#xff0c;本文是在引用material:1.7.0的版本基础…

记2022年秋招经历

自我介绍求职体验求职心得 一、自我介绍 学历普通本科&#xff0c;专业是网络工程&#xff0c;在校期间学习主要的是计算机体系方面的知识&#xff0c;根据课程&#xff0c;自学过前端、后端等内容。包括前端三板斧(htmlcssjs)、常用的前端框架(bootstarp/Vue等&#xff09;&am…

Android项目接入React Native方案

本篇文章主要介绍在现有的Android项目中接入React Native的接入过程&#xff0c;分析接入过程中的一些问题和解决方案&#xff0c;接入RN的平台为Android&#xff0c;开发环境为Mac&#xff0c;开发工具为Android Studio。 一、环境配置 1、Android配置 因为是现有的Android项…

Vue实现DOM元素拖放互换位置

一、拖放和释放HTML 拖放接口使得 web 应用能够在网页中拖放文件。这里将介绍了 web 应用如何接受从底层平台的文件管理器拖动DOM的操作。拖放的主要步骤是为 drop 事件定义一个释放区(释放文件的目标元素) 和为dragover事件定义一个事件处理程序。触发 drop 事件的目标元素需要…

day20IO流

1.字符流 1.1为什么会出现字符流【理解】 字符流的介绍 由于字节流操作中文不是特别的方便&#xff0c;所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时&#xff0c;文本文件也会有中文&#xff0c;但是没有问题&#xff0c;原因是最…

数学建模-分类模型(SPSS)

目录 1.简介 2.样例-二元 1.对于预测结果不理想&#xff0c;在logistics模型里加入平方项交互项等。 2.如果自变量有分类变量&#xff08;如男女&#xff0c;行业有互联网行业、旅游行业……&#xff09; 3.分训练集、测试集 4.fisher线性判别分析 3.样例-多元 注意&…

【Nginx】使用Docker完成Nginx反向代理

本机是在CentOS7上面进行操作的 1.首先安装好Dokcer&#xff0c;这里不再赘述 2.Docker安装Nginx容器 2.1首先需要创建Nginx配置文件&#xff0c;之后完成挂载 启动前需要先创建Nginx外部挂载的配置文件&#xff08; /home/nginx/conf/nginx.conf&#xff09; 之所以要先创建…

Redis - Redis 6.0 新特性之客户端缓存

1. 为什么需要客户端缓存 antirez 写了一篇有关客户端缓存设计的想法&#xff1a;《Client side caching in Redis 6》。antirez 认为&#xff0c;Redis 接下来的一个重点是配合客户端&#xff0c;因为客户端缓存显而易见的可以减轻 Redis 的压力&#xff0c;速度也快很多。实…

Android从开机到APP启动流程——基于Android9.0

Android从开机到APP启动流程——基于Android9.0 一、 Zygote进程启动流程 二、 System Server启动流程 三、 ActivityManagerService启动流程 四、 Launcher App (Home Activity)启动流程 五、 Zygote fork()子进程&#xff0c;子进程入口为ActivityThread.main() 六、 Acti…

第02讲:使用kubeadm搭建k8s集群的准备工作

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/ kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具&#xff0c;这个工具能通过两条指令完成一个 kubernetes 集群的部署: 第1步、创建一个 Master 节点 kubeadm init第2步&#x…

记录一次mysql慢查询的优化过程

前言 业务上线后经常报查询超时&#xff0c;数据库使用的是阿里云的RDS&#xff0c;mysql版本是5.6.16-log&#xff0c;有几条统计数据的查询语句执行很慢&#xff0c;有的甚至执行一次需要10多秒&#xff0c;简直无法忍受。 查看了超时时间&#xff0c;默认为0 show variables…

【微信小程序-原生开发】实用教程03-自定义底部导航(含自定义tabBar导航高亮需点击两次的解决方案)

开始前&#xff0c;请先完成底部导航的开发&#xff0c;详见 【微信小程序-原生开发】实用教程02-添加全局页面配置、页面、底部导航 https://sunshinehu.blog.csdn.net/article/details/128705866 显然&#xff0c;纯文字的底部导航有点low&#xff0c;还是需要有图标的才酷…

新手编写IntelliJ IDEA插件

需求目的可能你会想什么场景会需要用到插件开发&#xff0c;其实插件开发算是一种通用的解决方案&#xff0c;由服务平台定义标准让各自使用方进行自需的扩展。这就像我们非常常用的 P3C 代码检查插件、代码审计插件、脚手架工程创建插件、自动化API提取插件、单元测试统计插件…

TOF相机国产、非国产统计参数对比分析

TOF相机国产、非国产统计参数对比分析 Kinect v2 Kinect v2是Microsoft在2014年发售的&#xff0c;如图1-1所示。相比于Kinect v1在硬件和软件上作出了很大的进化&#xff0c;且在深度测量的系统和非系统误差方面表现出更好的性能。 Kinect v2中一共有三个摄像头&#xff0c…

Linux学习笔记【part2】网络配置与远程登录

Linux基础篇学习笔记 1.网络连接模式 VMware 提供了三种网络连接模式&#xff1a; ① 桥接模式 桥接模式&#xff1a;虚拟机直接连接外部物理网络的模式&#xff0c;主机起到了网桥的作用。在这种模式下&#xff0c;虚拟机可以直接访问外部网络&#xff0c;并且对外部网络是…

vue3利用keepAlive缓存页面

场景介绍 项目中经常会有这么一个需求&#xff0c;一个表单页面&#xff0c;可能需要跳转其他页面拿到对应的数据&#xff0c;再跳回表单页面&#xff0c;但是之前填写过的数据还在。而某些页面跳这个表单页面的时候&#xff0c;是不需要缓存&#xff0c;因为他是新增&#xf…