Cosmos 基础 -- Ignite CLI

Posted chinusyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.QueryHelloResponseText: "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.QuerySayHelloResponseName: 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的其他功能,看看可以创建什么。

Ignite内存计算平台与Oracle TimesTen Scaleout对比

1.产品介绍

Ignite

Ignite内存计算平台是一个高性能、集成化、混合式的企业级分布式架构解决方案,功能强大,有先进的集群管理功能,对于分布式内存数据库、流处理技术、分布式计算、分布式服务、分布式数据结构、持久化、Hadoop和Spark加速等功能,提供了广泛的支持,用于大规模的数据处理,比传统的基于磁盘或闪存的技术在性能上有指数级的提升。最新的版本在基于ZooKeeper的发现机制基础上,支持扩展至上千个节点。该软件由美国GridGain公司开发,于2014年将绝大部分功能捐赠给Apache基金会,命名为Ignite,目前为Apache基金会的顶级项目,GridGain公司还提供Ignite的企业版,具体可以根据需要进行选择。

Oracle TimesTen Scaleout

TimesTen Scaleout是Oracle TimesTen 18.1版本的一个新的产品分支,是Oracle第一个商用关系型内存分布式数据库,支持分布式,横向扩展。这种新的体系结构使TimesTen内存数据库能够扩展至几十台主机,达到数百TB的容量,并且每秒支持数百万次事务,而无需手动数据库分片或应用程序分区,特别适合有着高并发、高吞吐量事务处理需求的业务场景。

2.产品对比

基本属性

序号 对比项目 Ignite TimesTen Scaleout
1 是否支持开源 Ignite本身为Apache2.0协议开源,还有企业版GridGain 商业软件
2 技术支持 有开源社区技术支持,也有商业技术支持 商业技术支持
3 线性扩展 支持,使用ZooKeeper的发现机制,支持扩展至上千个节点。 支持,最多扩展至64个节点
4 内存分布式数据库 内存分布式数据库是Ignite的主打功能之一。 是Oracle第一个商用的内存分布式数据库。之前的TimesTen为非分布式架构
5 扩展功能 Ignite基于自己特有的分布式架构,开发了完整的企业级分布式架构解决方案,包括分布式内存数据库、流处理技术、分布式计算、分布式服务、分布式数据结构、NoSQL数据库集成、Hadoop和Spark加速等 作为Oracle的商用内存分布式数据库产品,定位明确,功能专注
6 部署模式 支持多种部署模式,支持独立部署,嵌入式部署,也可以部署在云环境中,对Kubernetes等新技术也有广泛的支持 支持嵌入式和独立部署,可以脱离Oracle独立部署为内存分布式数据库。安装配置较为复杂,对于新的技术,云环境等支持较差。
7 客户端协议 支持SQL、ODBC/JDBC、除了Java还支持.NET平台,也支持Python、Ruby、PHP或者NodeJS,也可以考虑使用Ignite的二进制客户端协议 支持SQL和PL/SQL、支持ODBC/JDBC、OCI、ODP .NET,另外许多开源数据库API和适配器也可以与TimesTen一起使用,包括 PHP、node.js、Ruby、Python、Go、R和REST等
8 监控等企业级功能 企业版有完善的监控管理工具、安全、滚动更新、数据中心复制等功能,有完善的图形界面。Ignite本身提供命令行以及部分API,可以进行简单的监控方便运维。 提供命令行界面、图形界面、存储过程、API调用等多种形式的相关支持。
9 开发支持 提供了各种可能的方式方便开发,具体代码改动工作量,取决于架构设计模式以及软件使用方式。已有的代码可能改动较多,也可能改动很少。 对应用开发透明,可以轻易地将TimesTen部署进已有的系统中,代码改动较少。
10 多平台支持 支持常见操作系统平台和CPU架构 支持常见操作系统平台和CPU架构
11 综合成本 综合成本较低,技术支持有开源社区技术支持,也可以购买商业技术支持。 Oracle的综合成本高昂,包括软件授权费、技术支持费、培训费用等
12 成熟度 目前以每季度发布一个版本的速度快速迭代。 TimesTen有近20年的历史,但是TimesTen Scaleout为Oracle的第一款商用内存分布式数据库产品。

内存分布式数据库

序号 对比项目 Ignite TimesTen Scaleout
1 SQL支持 支持兼容ANSI-99的SQL标准,支持DDL、DML语句。 支持兼容ANSI-99的SQL标准,支持DDL、DML语句,透明支持Oracle的相关技术
2 事务 不完整,在键值API层次支持ACID事务,基于经过一阶段提交优化后的二阶段提交机制。SQL层,仅支持原子性。 支持完整的ACID事务、多语句事务、约束和全局二级索引。
3 数据库支持 支持提供JDBC/ODBC协议的传统关系型数据库,包括Oracle,也包括MySQL等其他数据库。 只支持Oracle。
4 数据同步 支持数据库的通读和通写,支持多种数据同步方式,提供开发人员接口,自定义能力强。 有非常完善的数据同步方式。
5 故障恢复 基于WAL和检查点等相关技术,有完善的故障恢复机制。同时也支持通过复制、备份等机制提高可用性。 TimesTen有事务日志和检查点文件存放在磁盘上。当系统重启或者意外宕机,内存数据库可以从检查点文件和事务日志中得到恢复。另外,还可以通过复制技术来提高可用性。
6 数据库模型 键值存储,通过H2引擎提供关系型功能。 关系型数据库
7 并置处理 通过将计算带到数据实际驻留的服务端节点,会在数据实际存储的地方执行高级的业务逻辑或者分布式SQL,甚至关联,避免了昂贵的序列化和网络开销 不支持
8 索引 支持 支持
9 缓存维护操作 使用标准DDL语法,添加了部分专有属性。 专有的CREATE CACHE等语法,需要一段时间的学习。
10 开发工具 支持JDBC协议的工具,都可以接入Ignite。 Oracle SQL Developer对TimesTen有更好的支持
11 开发便利性 Ignite为常见的、主流开发框架提供了集成的支持,包括Spring、Hibernate、MyBatis、Spring Data JPA等等。 仅提供JDBC/ODBC等标准协议的支持。
12 数据预热 如果开启了原生持久化,系统重启无需预热数据。 不支持

扩展特性

在内存分布式SQL数据库功能之外,Ignite相比TimesTen,还提供了大量的扩展特性,比如:

  • 分布式服务:分布式服务可以在集群中任意部署自定义的服务,可以实现和部署任意服务,比如自定义计数器,ID生成器,分级映射等;

  • 数据注入和流计算:Ignite流式计算可以以可扩展和容错的方式处理连续不中断的数据流。可以与主要的流处理技术和框架进行集成,比如Kafka、Camel、Storm或者JMS等,它们为基于Ignite的架构带来非常强大的功能;

  • 分布式计算:分布式计算是通过并行处理的方式来获得更高的性能,更低的延迟以及线性可扩展性,Ignite提供了一组简单的API,在集群内的多台计算机中执行分布式计算和数据处理,该功能针对传统的数据库存储过程,形成了完整的替代方案;

  • 分布式数据结构:Ignite以分布式的形式支持基于java.util.concurrent框架的大部分数据结构。比如,可以在一个节点上使用java.util.concurrent.BlockingQeque加入一些东西,然后在另一个节点上获取它。或者有一个分布式的ID生成器,它可以保证所有节点上的ID唯一性;

  • 消息和事件:Ignite提供了集群范围的高性能的消息功能,支持基于发布-订阅以及直接点对点通信模型的数据交换。当在分布式网格环境中发生各种事件时,Ignite的分布式事件功能可以使应用收到通知。可以自动地收到集群内的本地和远程节点上发生的任务执行、读写和查询操作的通知;

  • 机器学习:Ignite的机器学习是一套简单、可扩展以及高效的工具,可以构建可预测的机器学习模型,而不需要昂贵的ETL;

  • 大数据组件支持 :Ignite为Apache体系的很多技术提供了广泛的支持,包括与Apache旗下的NoSQL数据库集成,比如Cassandra等,为Hadoop和Spark进行加速等。

3.总结

如果将Ignite作为一个内存分布式数据库,那么从功能性来说,与Oracle的TimesTen Scaleout产品基本对等,TimesTen具有的功能,Ignite大体都有,但是TimesTen Scaleout作为一个专业的内存分布式数据库,在部分功能的细节设计上,在与Oracle产品的功能整合上,做的更好。但就Ignite来说,它不仅仅是一个内存分布式数据库,在已有的系统中,如果引入了Ignite,相当于引入了一个多功能的数据处理平台,为已有系统的未来发展和演进,提供了更多的可能,会极大地增强已有系统的扩展性,保护用户原有的投资。

而如果引入了Oracle的TimesTen软件,会进一步增强与Oracle的绑定,不管是从行业发展的趋势来说,还是从降低大型企业的IT支出成本来说,TimesTen都未必是最佳的选择。

声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

以上是关于Cosmos 基础 -- Ignite CLI的主要内容,如果未能解决你的问题,请参考以下文章

如何在DAppNode中运行Cosmos节点?

Ignite内存计算平台与Oracle TimesTen Scaleout对比

apache ignite系列:ignite调优

Ignite: Ignite VS Spark

跨链Cosmos Cosmos系统框架

跨链Cosmos(12) Cosmos插件