官网
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安装:
- 在你的终端窗口,按
Ctrl+C
停止用ignite chain serve
开启的chain。 - 使用
rm $(which ignite)
删除Ignite CLI二进制文件。根据您的用户权限,使用或不使用sudo
运行该命令。 - 重复此步骤,直到从系统中移除所有
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
目录中创建一个名为hello
的Cosmos 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/directory | Purpose |
---|---|
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 APIhttp://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
)等的信息。