Cosmos 基础(二)-- Ignite CLI
创始人
2024-05-14 02:30:10
0

官网

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使用

1 ignite

Usage:ignite [command]Available Commands:scaffold    Scaffold a new blockchain, module, message, query, and morechain       Build, initialize and start a blockchain node or perform other actions on the blockchaingenerate    Generate clients, API docs from source codenetwork     Launch a blockchain in productionnode        Make calls to a live blockchain nodeaccount     Commands for managing Ignite accountsrelayer     Connect blockchains by using IBC protocoltools       Tools for advanced usersdocs        Show Ignite CLI docsversion     Print the current build informationhelp        Help about any commandcompletion  Generate the autocompletion script for the specified shellFlags:-h, --help   help for igniteUse "ignite [command] --help" for more information about a command.

2 ignite scaffold

# [root@localhost ~]# ignite scaffold -h
Scaffold commands create and modify the source code files to add functionality.CRUD stands for "create, read, update, delete".Usage:ignite scaffold [command]Aliases:scaffold, sAvailable Commands:chain       Fully-featured Cosmos SDK blockchainmodule      Scaffold a Cosmos SDK modulelist        CRUD for data stored as an arraymap         CRUD for data stored as key-value pairssingle      CRUD for data stored in a single locationtype        Scaffold only a type definitionmessage     Message to perform state transition on the blockchainquery       Query to get data from the blockchainpacket      Message for sending an IBC packetband        Scaffold an IBC BandChain query oracle to request real-time datavue         Vue 3 web app templateflutter     A Flutter app for your chainFlags:-h, --help   help for scaffoldUse "ignite scaffold [command] --help" for more information about a command.

2.1 ignite scaffold query

#[root@localhost ~]# ignite scaffold query -h
Query to get data from the blockchainUsage:ignite scaffold query [name] [request_field1] [request_field2] ... [flags]Flags:--clear-cache        Clear the build cache (advanced)-d, --desc string        Description of the command-h, --help               help for query--module string      Module to add the query into. Default: app's main module--paginated          Define if the request can be paginated-p, --path string        path of the app (default ".")-r, --response strings   Response fields-y, --yes                Answers interactive yes/no questions with yes

二、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 [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"

在这里插入图片描述

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)_ = ctxreturn &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)_ = ctxreturn &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 AppUsage:hellod [command]Available Commands:add-genesis-account Add a genesis account to genesis.jsoncollect-gentxs      Collect genesis txs and output a genesis.json fileconfig              Create or query an application CLI configuration filedebug               Tool for helping with debugging your applicationexport              Export state to JSONgentx               Generate a genesis tx carrying a self delegationhelp                Help about any commandinit                Initialize private validator, p2p, genesis, and application configuration fileskeys                Manage your application's keysmigrate             Migrate genesis to a specified target versionquery               Querying subcommandsrollback            rollback cosmos-sdk and tendermint state by one heightstart               Run the full nodestatus              Query remote node for statustendermint          Tendermint subcommandstx                  Transactions subcommandsvalidate-genesis    validates the genesis file at the default location or at the location passed as an argversion             Print the application binary version informationFlags:-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 errorsUse "hellod [command] --help" for more information about a command.

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...