Cosmos 基础 -- Ignite CLI(一)

Ignite CLI v0.26.1

官网

DOC

GitHub

Try Ignite CLI online

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

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

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

Install Ignite

开发教程

开发教程提供了一步一步的指导,帮助您建立区块链开发技能。

通过遵循这些开发教程,您将学习如何:

  • 在本地机器上安装Ignite CLI
  • 创建一个新的区块链并在本地启动一个用于开发的节点
  • 让你的区块链说“Hello, World!”
    • 为一个Cosmos SDK查询生成一个脚手架
    • 修改keeper方法以返回静态字符串
    • 通过区块链CLI查询
  • 在博客教程中为你的链写和读博客文章
    • 为一个Cosmos SDK查询生成一个脚手架
    • 在协议缓冲区文件中定义新类型
    • 写入keeper方法将数据写入存储
    • 从存储区读取数据,并将其作为查询结果返回
    • 使用区块链CLI广播交易
  • 在Nameservice教程中构建一个用于买卖名称的区块链
    • 使用map为CRUD逻辑生成一个脚手架
    • 使用自定义模块中的其他模块方法
    • 在地址之间发送代币
  • 创建一个带有奖励的猜谜游戏
    • 使用托管账户来存储代币
  • 使用区块链间通信(IBC)协议
    • 构建一个启用IBC的模块
    • 发送和接收IBC报文
    • 配置并运行内置IBC中继器
  • 建立一个去中心化的订单簿代币交易所
    • 构建一个支持IBC的高级模块

一、安装

你可以在基于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

二、ignite CLI 命令使用

三、入门指南

在本教程中,我们将使用 Ignite CLI 创建一个新的区块链。Ignite CLI是一个命令行界面,允许用户快速轻松地创建区块链网络。通过使用Ignite CLI,我们可以快速创建一个新的区块链,而无需手动设置所有必要的组件。

一旦我们用Ignite CLI创建了我们的区块链,我们将看一下创建的目录结构和文件。这将使我们了解区块链是如何组织的,以及区块链的不同组成部分是如何相互作用的。

在本教程结束时,您将基本了解如何使用Ignite CLI创建一个新的区块链,并且您将对组成区块链的目录结构和文件有一个很好的理解。当您继续探索区块链开发世界时,这些知识将非常有用。

3.1 创建新的区块链

要使用Ignite创建一个新的区块链项目,您需要运行以下命令:

$ ignite scaffold chain example

ignite scaffold chain命令将在一个新的目录示例中创建一个新的区块链。

新的区块链使用Cosmos SDK框架构建,并导入几个标准模块以提供一系列功能。这些模块包括股权(staking),它实现了委托的股权证明(Proof-of-Stake)共识机制,bank 用于促进账户之间的可同质化代币转移,以及gov用于链上治理。除了这些模块,区块链还从Cosmos SDK框架导入其他模块。

example 目录包含生成的文件和目录,它们组成了Cosmos SDK区块链的结构。此目录包括链的配置、应用程序逻辑和测试等文件。它为开发人员提供了一个快速设置新的Cosmos SDK区块链并在此基础上构建所需功能的起点。

默认情况下,Ignite在x/目录中创建一个新的空自定义模块,其名称与正在创建的区块链(在本例中为example)相同。这个模块本身没有任何功能,但可以作为构建应用程序特性的起点。如果你不想创建这个模块,你可以使用--no-module标志来跳过它。

3.2 目录结构

为了理解Ignite CLI为你的项目生成了什么,你可以检查example/目录的内容。

app/目录包含连接区块链的不同部分到一起的文件。这个目录中最重要的文件是app.go,其中包括区块链的类型定义和创建和初始化它的函数。该文件负责将区块链的各种组件连接起来,并定义它们将如何相互作用。

cmd/目录包含负责编译二进制文件的命令行界面(CLI)的主包。这个包定义了可以从CLI运行的命令以及应该如何执行这些命令。它是区块链项目的重要组成部分,因为它为开发人员和用户提供了一种与区块链交互并执行各种任务的方法,例如查询区块链状态或发送事务。

docs/目录用于存储项目文档。默认情况下,该目录包含一个OpenAPI规范文件,该文件是一种机器可读的格式,用于定义软件项目的API。OpenAPI规范可以被用于为项目自动生成人类可读的文档,并为其他工具和服务提供一种与API交互的方法。docs/目录可用于存储与项目相关的任何其他文档。

proto/ 目录下包含协议缓冲区文件,用于描述区块链的数据结构。协议缓冲区是一种与语言和平台无关的机制,用于序列化结构化数据,经常用于分布式系统的开发,例如区块链网络。proto/目录中的协议缓冲文件定义了区块链使用的数据结构和消息,并用于为可用于与区块链交互的各种编程语言生成代码在Cosmos SDK的上下文中,协议缓冲文件用于定义区块链可以发送和接收的特定类型的数据,以及可用于访问区块链功能的特定RPC端点

testutil/目录包含用于测试的辅助函数这些函数提供了一种方便的方式来执行为区块链编写测试时所需的常见任务,例如创建测试帐户、生成事务和检查区块链的状态。通过使用testutil/目录中的辅助函数,开发人员可以更快速、更有效地编写测试,并可以确保他们的测试是全面和有效的。

x/目录包含已添加到区块链的自定义Cosmos SDK模块。标准Cosmos SDK模块是预先构建的组件,为基于Cosmos SDK的区块链提供通用功能,例如支持押注和治理。另一方面,自定义模块是专门为区块链项目开发的模块,并提供特定于项目的功能。

config.yml文件是一个配置文件,可用于在开发过程中自定义区块链。该文件包括控制区块链各个方面的设置,例如网络的ID、帐户余额和节点参数。

.github目录包含一个GitHub Actions工作流,可用于自动构建和发布区块链二进制文件。GitHub Actions是一个允许开发人员自动化软件开发工作流程的工具,包括构建、测试和部署项目。.github目录中的工作流用于自动化构建区块链二进制文件并发布它的过程,这可以为开发人员节省时间和精力。

readme.md文件是一个自述文件,提供了区块链项目的概述。该文件通常包括项目名称和用途等信息,以及关于如何构建和运行区块链的说明。通过阅读readme.md文件,开发人员和用户可以快速了解区块链项目的目的和功能,并开始使用它。

3.3 启动区块链节点

启动正在开发中的区块链节点,可以执行如下命令:

ignite chain serve

ignite chain serve命令用于启动开发模式下的区块链节点。它首先使用ignite chain build命令编译并安装二进制文件,然后使用ignite chain init命令为单个验证器初始化区块链的数据目录。之后,它在本地启动节点并启用自动代码重新加载,以便对代码的更改可以反映在正在运行的区块链中,而不必重新启动节点。这样可以更快地开发和测试区块链。

恭喜你!🥳你已经使用Ignite CLI成功地创建了一个全新的 Cosmos 区块链。这个区块链使用委托权益证明(DPoS)共识算法,并附带一组用于代币转移、治理(governance)和通货膨胀(inflation)的标准模块。现在您已经对Cosmos区块链有了基本的了解,是时候开始构建自定义功能了。在以下教程中,您将学习如何构建自定义模块并向区块链添加新功能,使您能够创建独特而强大的去中心化应用程序。

四、Hello, Ignite CLI

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

4.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

4.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自主的应用程序特定的区块链项目的自述文件。

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

4.3 启动区块链

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

ignite chain serve

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

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

在这里插入图片描述

4.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:
在这里插入图片描述

4.5 停止区块链

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

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

4.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函数中实现这些查询和消息处理程序的逻辑

4.7 创建一个查询

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

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

# ignite scaffold query [name] [request_field1] [request_field2] ... [flags]
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"

在这里插入图片描述

4.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的端点

4.7.2 Request and reponse types

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

message QueryHelloRequest {
}

message QueryHelloResponse {
  string text = 1;
}

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

4.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类型的响应

现在响应是空的。

4.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注册,所以您会看到一个未实现或本地主机不能连接的错误。此错误是预期的行为,因为您仍然需要注册查询处理程序。
    在这里插入图片描述

4.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)等的信息。

五、Hello, Ignite CLI – In-depth tutorial

在本教程中,您将从头开始实现“Hello, World!”功能。您将要构建的应用程序的功能将与您在“Express教程”部分中创建的应用程序相同,但在这里您将手动执行,以便更深入地了解流程。

首先,让我们从一个新的hello区块链开始。您可以回滚上一节中所做的更改,也可以使用Ignite创建一个新的区块链。无论哪种方式,您都将有一个空白的区块链供您使用。

5.1 SayHello RPC

在Cosmos SDK区块链中,查询被定义为协议缓冲区文件中的Query服务中的远程过程调用(RPCs)。要添加新的查询,您可以在你的模块的query.proto添加以下代码:

// proto/hello/hello/query.proto
service Query {
    rpc SayHello(QuerySayHelloRequest) returns (QuerySayHelloResponse) {
        option (google.api.http).get = "/hello/hello/say_hello/{name}";
    }
}

RPC接受QuerySayHelloRequest类型的请求参数,并返回QuerySayHelloResponse类型的值。要定义这些类型,可以将以下代码添加到query.proto文件:

// proto/hello/hello/query.proto
message QuerySayHelloRequest {
  string name = 1;
}

message QuerySayHelloResponse {
  string name = 1;
}

使用query.proto中定义的类型。你必须把协议缓冲文件转换成Go源代码。这可以通过运行ignite chain serve来完成,它将构建和初始化区块链,并从协议缓冲文件自动生成Go源代码。或者,您可以运行ignite generate proto-go,只从协议缓冲区文件生成Go源代码,而不构建和初始化区块链。

5.2 SayHello keeper方法

query.proto文件中定义了查询、请求和响应类型之后。您将需要在代码中实现查询的逻辑。这通常涉及编写一个处理请求并返回适当响应的函数。创建一个新文件query_say_hello.go。按照以下内容去做:


// x/hello/keeper/query_say_hello.go
package keeper

import (
    "context"
    "fmt"

    sdk "github.com/cosmos/cosmos-sdk/types"
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"

    "hello/x/hello/types"
)

func (k Keeper) SayHello(goCtx context.Context, req *types.QuerySayHelloRequest) (*types.QuerySayHelloResponse, error) {
    if req == nil {
        return nil, status.Error(codes.InvalidArgument, "invalid request")
    }
    ctx := sdk.UnwrapSDKContext(goCtx)
    // TODO: Process the query
    _ = ctx
    return &types.QuerySayHelloResponse{Name: fmt.Sprintf("hello %s", req.Name)}, nil
}

这段代码定义了一个SayHello函数,它接受QuerySayHelloRequest类型的请求,并返回一个QuerySayHelloResponse类型的值。该函数首先检查请求是否有效,然后通过返回响应消息并将提供的名称作为%s占位符的值来处理查询。您可以根据需要向函数添加额外的逻辑,例如从区块链检索数据或执行复杂的操作,以处理查询并返回适当的响应。

5.3 CmdSayHello command

在实现查询逻辑之后,您将需要使查询对客户端可用,以便他们可以调用它并接收响应。这通常涉及到将查询添加到区块链的应用程序编程接口(API),并提供命令行接口(CLI)命令,允许用户轻松提交查询并接收响应。

要为查询提供CLI命令,可以创建query_say_hello.go。执行一个CmdSayHello命令,调用SayHello函数并将响应输出到控制台。

// x/hello/client/cli/query_say_hello.go
package cli

import (
    "strconv"

    "github.com/cosmos/cosmos-sdk/client"
    "github.com/cosmos/cosmos-sdk/client/flags"
    "github.com/spf13/cobra"

    "hello/x/hello/types"
)

var _ = strconv.Itoa(0)

func CmdSayHello() *cobra.Command {
    cmd := &cobra.Command{
        Use:   "say-hello [name]",
        Short: "Query say-hello",
        Args:  cobra.ExactArgs(1),
        RunE: func(cmd *cobra.Command, args []string) (err error) {
            reqName := args[0]
            clientCtx, err := client.GetClientQueryContext(cmd)
            if err != nil {
                return err
            }
            queryClient := types.NewQueryClient(clientCtx)
            params := &types.QuerySayHelloRequest{
                Name: reqName,
            }
            res, err := queryClient.SayHello(cmd.Context(), params)
            if err != nil {
                return err
            }
            return clientCtx.PrintProto(res)
        },
    }
    flags.AddQueryFlagsToCmd(cmd)
    return cmd
}

代码定义了CmdSayHello命令。该命令是使用cobra库定义的cobra库是在Go中构建命令行应用程序的流行框架。该命令接受一个name 作为参数,并使用它创建一个QuerySayHelloRequest结构体,该结构体从types.QueryClient传递给SayHello函数。SayHello函数用于向区块链发送say-hello查询,响应存储在res变量中。

QuerySayHelloRequest结构体在query.proto文件中定义。它是一个协议缓冲区文件,定义查询的请求和响应类型。QuerySayHelloRequest结构体包含一个string类型的Name字段,用于提供要包含在响应消息中的名称。

在发送查询和接收响应之后,代码使用clientCtx.PrintProto函数打印到控制台的响应。clientCtx变量通过client.GetClientQueryContext函数获取,它提供对客户机上下文的访问,包括客户机的配置和连接信息。PrintProto函数用于使用协议缓冲区格式打印响应,该格式允许有效地序列化和反序列化数据。

flags.AddQueryFlagsToCmd函数用于为命令添加查询相关的标志。这允许用户在调用命令时指定其他选项,例如节点URL和其他查询参数。这些标志用于配置查询并向SayHello函数提供必要的信息,允许它连接到区块链并发送查询。

要使CmdSayHello命令对用户可用,您需要将其添加到链的二进制文件中。这通常通过修改x/hello/client/cli/query.go来完成。添加cmd.AddCommand(CmdSayHello())语句。这将CmdSayHello命令添加到可用命令列表中,允许用户从命令行界面(CLI)调用它。

// x/hello/client/cli/query.go
func GetQueryCmd(queryRoute string) *cobra.Command {
    cmd := &cobra.Command{
        Use:                        types.ModuleName,
        Short:                      fmt.Sprintf("Querying commands for the %s module", types.ModuleName),
        DisableFlagParsing:         true,
        SuggestionsMinimumDistance: 2,
        RunE:                       client.ValidateCmd,
    }
    cmd.AddCommand(CmdQueryParams())
    cmd.AddCommand(CmdSayHello())
    return cmd
}

一旦您提供了CLI命令,用户将能够调用say-hello查询并接收适当的响应。

保存您对项目源代码所做的所有更改,并运行以下命令启动区块链节点:

$ ignite chain serve

使用以下命令提交查询并接收响应:

hellod query hello say-hello bob

在这里插入图片描述

该命令将向namebob的区块链发送say-hello查询,并将“Hello, bob!”的响应打印到控制台。您可以根据需要修改查询和响应,以满足您的特定需求并提供所需的功能。

恭喜你完成了“Hello, World!”教程!在本教程中,您学习了如何在协议缓冲区文件中定义一个新的查询,在代码中实现查询的逻辑,以及如何通过区块链的API和CLI使查询对客户端可用。按照本教程中概述的步骤,您可以创建一个功能性查询,用于从区块链检索数据或根据需要执行其他操作。

现在您已经完成了本教程,您可以继续构建您对Cosmos SDK的知识,并探索它提供的许多特性和功能。您可能希望尝试实现更复杂的查询,或者尝试使用SDK的其他功能,看看可以创建什么。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值