Cosmos-- 三.教程 -- 10.Nameservice模塊的CLI

cosmos主網(wǎng)即將上線缘缚,對(duì)文檔做了大量更新。特地翻譯了一下阿宅,方便小伙伴們閱覽, 之后會(huì)持續(xù)更新

第三章教程:

  1. 開(kāi)始
  2. 程序目標(biāo)
  3. 開(kāi)始編寫(xiě)你的程序
  4. Keeper
  5. Msg和Handler
  6. SetName
  7. BuyName
  8. Querier
  9. Codec文件
  10. Nameservice模塊的CLI
  11. nameservice模塊的REST接口
  12. 引入你的模塊并完成程序
  13. Entrypoint
  14. 編譯你的程序
  15. 編譯并運(yùn)行程序
  16. 運(yùn)行REST路由

Nameservice模塊的CLI

Cosmos SDK使用cobra庫(kù)進(jìn)行CLI交互候衍。該庫(kù)使每個(gè)模塊都可以輕松地公開(kāi)自己的操作命令。要開(kāi)始定義用戶與模塊的CLI交互洒放,請(qǐng)創(chuàng)建以下文件:

  • ./x/nameservice/client/cli/query.go
  • ./x/nameservice/client/cli/tx.go
  • ./x/nameservice/client/module_client.go

Querier

query.go文件中為你模塊的每個(gè)Queryresolvewhois)定義cobra.Command:

package cli

import (
    "fmt"

    "github.com/cosmos/cosmos-sdk/client/context"
    "github.com/cosmos/cosmos-sdk/codec"
    "github.com/spf13/cobra"
)

// GetCmdResolveName queries information about a name
func GetCmdResolveName(queryRoute string, cdc *codec.Codec) *cobra.Command {
    return &cobra.Command{
        Use:   "resolve [name]",
        Short: "resolve name",
        Args:  cobra.ExactArgs(1),
        RunE: func(cmd *cobra.Command, args []string) error {
            cliCtx := context.NewCLIContext().WithCodec(cdc)
            name := args[0]

            res, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/resolve/%s", queryRoute, name), nil)
            if err != nil {
                fmt.Printf("could not resolve name - %s \n", string(name))
                return nil
            }

            fmt.Println(string(res))

            return nil
        },
    }
}

// GetCmdWhois queries information about a domain
func GetCmdWhois(queryRoute string, cdc *codec.Codec) *cobra.Command {
    return &cobra.Command{
        Use:   "whois [name]",
        Short: "Query whois info of name",
        Args:  cobra.ExactArgs(1),
        RunE: func(cmd *cobra.Command, args []string) error {
            cliCtx := context.NewCLIContext().WithCodec(cdc)
            name := args[0]

            res, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/whois/%s", queryRoute, name), nil)
            if err != nil {
                fmt.Printf("could not resolve whois - %s \n", string(name))
                return nil
            }

            fmt.Println(string(res))

            return nil
        },
    }
}

注意上述代碼中:

  • CLI引入了一個(gè)新的context:CLIContext蛉鹿。它包含有關(guān)CLI交互所需的用戶輸入和應(yīng)用程序配置的數(shù)據(jù)。
  • cliCtx.QueryWithData()函數(shù)所需的path直接從你的查詢路徑中映射往湿。
    • 路徑的第一部分用于區(qū)分SDK應(yīng)用程序可能的querier類(lèi)型:custom用于Querier
    • 第二部分(nameservice)是將查詢路由到的模塊的名稱妖异。
    • 最后是要調(diào)用模塊中的特定的querier。
    • 在這個(gè)例子中领追,第四部分是查詢他膳。這是因?yàn)椴樵儏?shù)是一個(gè)簡(jiǎn)單的字符串。要啟用更復(fù)雜的查詢輸入绒窑,你需要使用.QueryWithData()函數(shù)的第二個(gè)參數(shù)來(lái)傳入data棕孙。有關(guān)此示例,請(qǐng)參閱Staking模塊中的querier些膨。

Transaction

現(xiàn)在已經(jīng)定義了查詢交互蟀俊,是時(shí)候繼續(xù)在tx.go中的交易生成了:

你的應(yīng)用程序需要導(dǎo)入你剛編寫(xiě)的代碼。這里導(dǎo)入路徑設(shè)置為此存儲(chǔ)庫(kù)(github.com/cosmos/sdk-application-tutorial/x/nameservice)订雾。如果您是在自己的倉(cāng)庫(kù)中進(jìn)行的前面的操作欧漱,則需要更改導(dǎo)入路徑(github.com/{.Username}/{.Project.Repo}/x/nameservice)。

package cli

import (
    "github.com/spf13/cobra"

    "github.com/cosmos/cosmos-sdk/client/context"
    "github.com/cosmos/cosmos-sdk/client/utils"
    "github.com/cosmos/cosmos-sdk/codec"
    "github.com/cosmos/sdk-application-tutorial/x/nameservice"

    sdk "github.com/cosmos/cosmos-sdk/types"
    authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder"
)

// GetCmdBuyName is the CLI command for sending a BuyName transaction
func GetCmdBuyName(cdc *codec.Codec) *cobra.Command {
    return &cobra.Command{
        Use:   "buy-name [name] [amount]",
        Short: "bid for existing name or claim new name",
        Args:  cobra.ExactArgs(2),
        RunE: func(cmd *cobra.Command, args []string) error {
            cliCtx := context.NewCLIContext().WithCodec(cdc).WithAccountDecoder(cdc)

            txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))

            if err := cliCtx.EnsureAccountExists(); err != nil {
                return err
            }

            coins, err := sdk.ParseCoins(args[1])
            if err != nil {
                return err
            }

            msg := nameservice.NewMsgBuyName(args[0], coins, cliCtx.GetFromAddress())
            err = msg.ValidateBasic()
            if err != nil {
                return err
            }

            cliCtx.PrintResponse = true

            return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
        },
    }
}

// GetCmdSetName is the CLI command for sending a SetName transaction
func GetCmdSetName(cdc *codec.Codec) *cobra.Command {
    return &cobra.Command{
        Use:   "set-name [name] [value]",
        Short: "set the value associated with a name that you own",
        Args:  cobra.ExactArgs(2),
        RunE: func(cmd *cobra.Command, args []string) error {
            cliCtx := context.NewCLIContext().WithCodec(cdc).WithAccountDecoder(cdc)

            txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))

            if err := cliCtx.EnsureAccountExists(); err != nil {
                return err
            }

            msg := nameservice.NewMsgSetName(args[0], args[1], cliCtx.GetFromAddress())
            err := msg.ValidateBasic()
            if err != nil {
                return err
            }

            cliCtx.PrintResponse = true

            // return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, msgs)
            return utils.CompleteAndBroadcastTxCLI(txBldr, cliCtx, []sdk.Msg{msg})
        },
    }
}

注意在上述代碼中:

Module Client

導(dǎo)出此功能的最后一部分稱為ModuleClient,在./x/nameservice/client/module_client.go文件中實(shí)現(xiàn)擅威。Module Client為模塊提供了導(dǎo)出客戶端功能的標(biāo)準(zhǔn)方法壕探。

注意:你的應(yīng)用程序需要導(dǎo)入你剛編寫(xiě)的代碼。這里導(dǎo)入路徑設(shè)置為此倉(cāng)庫(kù)(github.com/cosmos/sdk-application-tutorial/x/nameservice)郊丛。如果你是在自己項(xiàng)目中編寫(xiě)的李请,則需要更改導(dǎo)入路徑成(github.com/{.Username}/ {.Project.Repo}/x/nameservice)瞧筛。

package client

import (
    "github.com/cosmos/cosmos-sdk/client"
    nameservicecmd "github.com/cosmos/sdk-application-tutorial/x/nameservice/client/cli"
    "github.com/spf13/cobra"
    amino "github.com/tendermint/go-amino"
)

// ModuleClient exports all client functionality from this module
type ModuleClient struct {
    storeKey string
    cdc      *amino.Codec
}

func NewModuleClient(storeKey string, cdc *amino.Codec) ModuleClient {
    return ModuleClient{storeKey, cdc}
}

// GetQueryCmd returns the cli query commands for this module
func (mc ModuleClient) GetQueryCmd() *cobra.Command {
    // Group gov queries under a subcommand
    govQueryCmd := &cobra.Command{
        Use:   "nameservice",
        Short: "Querying commands for the nameservice module",
    }

    govQueryCmd.AddCommand(client.GetCommands(
        nameservicecmd.GetCmdResolveName(mc.storeKey, mc.cdc),
        nameservicecmd.GetCmdWhois(mc.storeKey, mc.cdc),
    )...)

    return govQueryCmd
}

// GetTxCmd returns the transaction commands for this module
func (mc ModuleClient) GetTxCmd() *cobra.Command {
    govTxCmd := &cobra.Command{
        Use:   "nameservice",
        Short: "Nameservice transactions subcommands",
    }

    govTxCmd.AddCommand(client.PostCommands(
        nameservicecmd.GetCmdBuyName(mc.cdc),
        nameservicecmd.GetCmdSetName(mc.cdc),
    )...)

    return govTxCmd
}

上述代碼要注意:

  • 此抽象允許客戶端以標(biāo)準(zhǔn)方式從模塊導(dǎo)入客戶端功能。當(dāng)我們構(gòu)建入口時(shí)导盅,你將看到這一點(diǎn)较幌。
  • 有一個(gè)未解決的問(wèn)題是將其余功能(在本教程的下一部分中描述)添加到此接口。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末白翻,一起剝皮案震驚了整個(gè)濱河市乍炉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滤馍,老刑警劉巖岛琼,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異巢株,居然都是意外死亡槐瑞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阁苞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)困檩,“玉大人,你說(shuō)我怎么就攤上這事猬错〈翱矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵倦炒,是天一觀的道長(zhǎng)显沈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逢唤,這世上最難降的妖魔是什么拉讯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鳖藕,結(jié)果婚禮上魔慷,老公的妹妹穿的比我還像新娘。我一直安慰自己著恩,他們只是感情好院尔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著喉誊,像睡著了一般邀摆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伍茄,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天栋盹,我揣著相機(jī)與錄音,去河邊找鬼敷矫。 笑死例获,一個(gè)胖子當(dāng)著我的面吹牛汉额,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榨汤,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蠕搜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了件余?” 一聲冷哼從身側(cè)響起讥脐,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啼器,沒(méi)想到半個(gè)月后旬渠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡端壳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年告丢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损谦。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖免,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出照捡,到底是詐尸還是另有隱情颅湘,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布栗精,位于F島的核電站闯参,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悲立。R本人自食惡果不足惜鹿寨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薪夕。 院中可真熱鬧脚草,春花似錦、人聲如沸原献。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姑隅。三九已至熏纯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粤策,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工误窖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叮盘,地道東北人秩贰。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柔吼,于是被迫代替她去往敵國(guó)和親毒费。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容