Cosmos-- 三.教程 -- 4.Keeper

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

第三章教程:

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

Keeper

Cosmos SDK模塊的主要核心是名為Keeper的部分绅络。它處理同存儲的交互,引用其他的keeper進行跨模塊的交互嘁字,并包含模塊的大部分核心功能恩急。

首先創(chuàng)建文件./x/nameservice/keeper.go來保存模塊的keeper。在Cosmos SDK應用程序中纪蜒,模塊通常放在./x/文件夾中衷恭。

Keeper結構

開始制作你的SDK模塊,請在./x/nameservice/keeper.go文件中定義nameservice.Keeper

package nameservice

import (
    "github.com/cosmos/cosmos-sdk/codec"
    "github.com/cosmos/cosmos-sdk/x/bank"

    sdk "github.com/cosmos/cosmos-sdk/types"
)

// Keeper maintains the link to data storage and exposes getter/setter methods for the various parts of the state machine
type Keeper struct {
    coinKeeper bank.Keeper

    namesStoreKey  sdk.StoreKey // Unexposed key to access name store from sdk.Context
    ownersStoreKey sdk.StoreKey // Unexposed key to access owners store from sdk.Context
    pricesStoreKey sdk.StoreKey // Unexposed key to access prices store from sdk.Context

    cdc *codec.Codec // The wire codec for binary encoding/decoding.
}

關于上述代碼的幾點說明:

  • 3個不同的cosmos-sdk包被引入:
    • codec : 提供負責Cosmos編碼格式的工具——Amino霍掺。
    • bank : bank模塊控制賬戶和轉賬匾荆。
    • codec : types包含了整個SDK常用的類型。
  • Keeper結構體杆烁。在keeper中有幾個關鍵部分:
    • bank.Keeper : 這是bank模塊的Keeper引用牙丽。包括它來允許該模塊中的代碼調用bank模塊的函數(shù)。SDK使用對象能力來訪問應用程序狀態(tài)的各個部分兔魂。這是為了允許開發(fā)人員采用小權限準入原則烤芦,限制錯誤或惡意模塊的去影響其不需要訪問的狀態(tài)的能力。
    • *codec.Codec : 這是被Amino用于編碼及解碼二進制機構的編碼解碼器的指針析校。
    • sdk.StoreKey : 通過它來訪問一個持久化保存你的應用程序狀態(tài)的sdk.KVStore构罗。
  • 模塊有3個StoreKey:
    • namesStoreKey - 存儲域名所指向的字符串值的主存儲(即map[name]value)铜涉。
    • ownerStoreKey - 保存給定域名的當前所有者(即map[name]sdk_address)。
    • pricesStoreKey - 保存給定域名的當前所有者為其支付的價格遂唧。任何人要購買此域名的花費都必須超過當前所有者(即map[name]price)芙代。

Getter和Setter

現(xiàn)在要添加通過Keeper來與存儲交互的方法了。首先盖彭,添加一個函數(shù)來為指定域名設置解析字符串值:

// SetName - sets the value string that a name resolves to
func (k Keeper) SetName(ctx sdk.Context, name string, value string) {
    store := ctx.KVStore(k.namesStoreKey)
    store.Set([]byte(name), []byte(value))
}

在此方法中纹烹,首先使用Keeper中的namesStoreKey獲取map[name]value的存儲對象。

注意:這個函數(shù)使用sdk.Context召边。該對象持有訪問像blockHeightchainID這樣重要部分狀態(tài)的函數(shù)铺呵。

接下來,你可以使用方法.Set([]byte,[]byte)向存儲中插入<name, value>鍵值對隧熙。由于存儲只接受[]byte,想要把string轉化成[]byte再把它們作為參數(shù)傳給Set方法片挂。

接下來,添加一個函數(shù)來解析域名(即查找域名對應的解析值):

// ResolveName - returns the string that the name resolves to
func (k Keeper) ResolveName(ctx sdk.Context, name string) string {
    store := ctx.KVStore(k.namesStoreKey)
    bz := store.Get([]byte(name))
    return string(bz)
}

這里贞盯,與SetName方法一樣音念,首先使用StoreKey訪問存儲。接下來邻悬,不使用使用.Get([] byte) []byte方法而不是Set方法症昏。向函數(shù)傳參,傳遞key值父丰,要把name字符串轉化成[]byte肝谭,并以[]byte的形式返回結果。將此轉換成字符串再返回蛾扇。

添加類似的函數(shù)來獲取和設置域名所有者:

// HasOwner - returns whether or not the name already has an owner
func (k Keeper) HasOwner(ctx sdk.Context, name string) bool {
    store := ctx.KVStore(k.ownersStoreKey)
    bz := store.Get([]byte(name))
    return bz != nil
}

// GetOwner - get the current owner of a name
func (k Keeper) GetOwner(ctx sdk.Context, name string) sdk.AccAddress {
    store := ctx.KVStore(k.ownersStoreKey)
    bz := store.Get([]byte(name))
    return bz
}

// SetOwner - sets the current owner of a name
func (k Keeper) SetOwner(ctx sdk.Context, name string, owner sdk.AccAddress) {
    store := ctx.KVStore(k.ownersStoreKey)
    store.Set([]byte(name), owner)
}

注意在上述代碼中:

  • sdk.Coins : 沒有自己的字節(jié)編碼器攘烛,這意味著價格需要使用Amino進行序列化和反序列化,以便從存儲中插入或刪除镀首。
  • 在獲取所有者暫缺(因此也沒有價格)的域名時坟漱,返回1mycoin作為價格。

最后需要在./x/nameservice/keeper.go文件中加上Keeper的構造函數(shù):

// NewKeeper creates new instances of the nameservice Keeper
func NewKeeper(coinKeeper bank.Keeper, namesStoreKey sdk.StoreKey, ownersStoreKey sdk.StoreKey, priceStoreKey sdk.StoreKey, cdc *codec.Codec) Keeper {
    return Keeper{
        coinKeeper:     coinKeeper,
        namesStoreKey:  namesStoreKey,
        ownersStoreKey: ownersStoreKey,
        pricesStoreKey: priceStoreKey,
        cdc:            cdc,
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末更哄,一起剝皮案震驚了整個濱河市芋齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌成翩,老刑警劉巖觅捆,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻敌,居然都是意外死亡栅炒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赢赊,“玉大人乙漓,你說我怎么就攤上這事∈鸵疲” “怎么了叭披?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秀鞭。 經(jīng)常有香客問我趋观,道長,這世上最難降的妖魔是什么锋边? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮编曼,結果婚禮上豆巨,老公的妹妹穿的比我還像新娘。我一直安慰自己掐场,他們只是感情好往扔,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熊户,像睡著了一般萍膛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚷堡,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天蝗罗,我揣著相機與錄音,去河邊找鬼蝌戒。 笑死串塑,一個胖子當著我的面吹牛,可吹牛的內容都是我干的北苟。 我是一名探鬼主播桩匪,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼友鼻!你這毒婦竟也來了傻昙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彩扔,失蹤者是張志新(化名)和其女友劉穎妆档,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體借杰,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡过吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤虽。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡乳绕,死狀恐怖,靈堂內的尸體忽然破棺而出逼纸,到底是詐尸還是另有隱情洋措,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布杰刽,位于F島的核電站菠发,受9級特大地震影響,放射性物質發(fā)生泄漏贺嫂。R本人自食惡果不足惜滓鸠,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望第喳。 院中可真熱鬧糜俗,春花似錦、人聲如沸曲饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩淀。三九已至楔敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驻谆,已是汗流浹背卵凑。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺韭,地道東北人氛谜。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像区端,于是被迫代替她去往敵國和親值漫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • cosmos主網(wǎng)即將上線织盼,對文檔做了大量更新杨何。特地翻譯了一下,方便小伙伴們閱覽, 之后會持續(xù)更新第三章教程:開始程...
    糙米薏仁湯閱讀 915評論 0 1
  • cosmos主網(wǎng)即將上線沥邻,對文檔做了大量更新危虱。特地翻譯了一下,方便小伙伴們閱覽, 之后會持續(xù)更新第三章教程:開始程...
    糙米薏仁湯閱讀 2,089評論 1 3
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程唐全,因...
    小菜c閱讀 6,444評論 0 17
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,786評論 0 15
  • 1.我們要把大量的時間花在實際行動上埃跷,讓自己有更大更好的改變蕊玷,這樣,才更有說服力弥雹。 2.努力把自己的時間賣出很多份...
    進步小小青年閱讀 304評論 0 0