創(chuàng)造我們的NFT膳汪,使用Substrate 創(chuàng)建KItties 一

kitties-tutorial.png

本次研討會(huì)將教您有關(guān)構(gòu)建區(qū)塊鏈的所有知識(shí)茄袖,該區(qū)塊鏈處理稱為Substrate Kitties的不可替代令牌(NFT)的創(chuàng)建和所有權(quán)渺贤。

基本設(shè)置

在我們開始制作Kitties之前雏胃,我們首先需要做一些基礎(chǔ)工作。本部分介紹了使用Substrate node template設(shè)置自定義pallet并包含簡(jiǎn)單存儲(chǔ)項(xiàng)所涉及的基本模式志鞍。

設(shè)置template node

Substrate node template為我們提供了一個(gè)可定制的區(qū)塊鏈節(jié)點(diǎn)瞭亮,包括內(nèi)置的網(wǎng)絡(luò)和共識(shí)層。我們需要關(guān)注的只是構(gòu)建我們的邏輯runtimepallets.

首先固棚,我們需要設(shè)置項(xiàng)目名稱和依賴項(xiàng)统翩。我們將使用一個(gè)名為kickstart輕松重命名我們的節(jié)node template。

  1. 安裝 cargo install kickstart

  2. 安裝kickstart完成后此洲,在本地工作區(qū)的根目錄中運(yùn)行以下命令:

    kickstart https://github.com/sacha-l/kickstart-substrate
    

    此命令將克隆最新node tampalte的副本厂汗,并詢問您希望如何調(diào)用node和pallet。

  3. 輸入:

    • kitties- 作為我們node的名稱呜师。該節(jié)點(diǎn)將被命名為 node-kitties娶桦。
    • kitties- 作為pallte的名稱。pallet將命名為 pallet-kitties

    這將創(chuàng)建一個(gè)kitties目錄衷畦,該目錄使用Substrate node template栗涂, 并且包括我們的node、runtime和pallet相對(duì)應(yīng)名稱的更改祈争。

  4. 在你喜歡的代碼編輯器中打開kitties目錄斤程,并將其重命名為kitties-tutorial -或者你喜歡的任何名稱。

    注意kickstart命令修改的目錄:

    • /node/ - 此文件夾包含允許node的runtime和 RPC 客戶端交互的所有邏輯菩混。
    • /pallets/ - 這是所有自定義pallet所在的位置暖释。
    • /runtime/ - 此文件夾是針對(duì)鏈的runtime聚合和實(shí)現(xiàn)所有pallets(自定義“內(nèi)部”和“外部”pallets)的位置。
  5. runtime/src/lib.rs中墨吓,您還會(huì)注意到球匕,我們修改后的template pallet名稱的實(shí)例仍然存在。將TemplateModule更改為 SubstrateKitties:

    construct_runtime!(
       // --snip
       {
           // --snip
           SubstrateKitties: pallet_kitties,
       }
    );
    

編寫pallet_kitties

讓我們看一下工作區(qū)的文件夾結(jié)構(gòu):

kitties-tutorial           <--  The name of our project directory
|
+-- node
|
+-- pallets
|   |
|   +-- kitties
|       |
|       +-- Cargo.toml
|       |
|       +-- src
|           |
|           +-- benchmarking.rs     <-- Remove file
|           |
|           +-- lib.rs              <-- Remove contents
|           |
|           +-- mock.rs             <-- Remove file
|           |
|           +-- tests.rs            <-- Remove file
|
+-- Cargo.toml

Pallets在 Substrate 中用于定義rumtime邏輯帖烘。在我們的例子中亮曹,我們將創(chuàng)建一個(gè)pallet來管理我們的Substrate Kitties應(yīng)用程序的所有邏輯。

注意秘症,我們的pallet的目錄/pallets/kitties/與pallet的名稱不同照卦。我們的pallet名稱,正如cargo所理解的那樣pallet-kitties乡摹。

讓我們通過pallets/kitties/src/lib.rs內(nèi)部組件的概述來布置pallet的基本結(jié)構(gòu)役耕。

每個(gè) FRAME pallet都有:

  • 一組 frame_supportframe_system依賴項(xiàng)。
  • 必填屬性宏(即配置特征聪廉、存儲(chǔ)項(xiàng)和函數(shù)調(diào)用)瞬痘。

這是我們將在本教程中構(gòu)建的Kitties pallet的最基礎(chǔ)的版本。它包含為本教程的下一節(jié)添加代碼的起點(diǎn)板熊。就像本教程的幫助文件 , 包含 TODO 的注釋框全,指示我們稍后編寫的代碼,以及Action是用于指示將在當(dāng)前部分中編寫的代碼 干签。

  1. 將以下代碼粘貼到 :/pallets/kitties/src/lib.rs

    #![cfg_attr(not(feature = "std"), no_std)]
    
    pub use pallet::*;
    
    #[frame_support::pallet]
    pub mod pallet {
       use frame_support::{
           sp_runtime::traits::{Hash, Zero},
           dispatch::{DispatchResultWithPostInfo, DispatchResult},
           traits::{Currency, ExistenceRequirement, Randomness},
           pallet_prelude::*
       };
       use frame_system::pallet_prelude::*;
       use sp_io::hashing::blake2_128;
    
       // TODO Part II: Struct for holding Kitty information.
    
       // TODO Part II: Enum and implementation to handle Gender type in Kitty struct.
    
       #[pallet::pallet]
       #[pallet::generate_store(pub(super) trait Store)]
       pub struct Pallet<T>(_);
    
       /// Configure the pallet by specifying the parameters and types it depends on.
       #[pallet::config]
       pub trait Config: frame_system::Config {
           /// Because this pallet emits events, it depends on the runtime's definition of an event.
           type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
    
           /// The Currency handler for the Kitties pallet.
           type Currency: Currency<Self::AccountId>;
    
           // TODO Part II: Specify the custom types for our runtime.
    
       }
    
       // Errors.
       #[pallet::error]
       pub enum Error<T> {
           // TODO Part III
       }
    
       #[pallet::event]
       #[pallet::generate_deposit(pub(super) fn deposit_event)]
       pub enum Event<T: Config> {
           // TODO Part III
       }
    
       // ACTION: Storage item to keep a count of all existing Kitties.
    
       // TODO Part II: Remaining storage items.
    
       // TODO Part III: Our pallet's genesis configuration.
    
       #[pallet::call]
       impl<T: Config> Pallet<T> {
    
           // TODO Part III: create_kitty
    
           // TODO Part III: set_price
    
           // TODO Part III: transfer
    
           // TODO Part III: buy_kitty
    
           // TODO Part III: breed_kitty
       }
    
       // TODO Part II: helper function for Kitty struct
    
       impl<T: Config> Pallet<T> {
           // TODO Part III: helper functions for dispatchable functions
    
           // TODO: increment_nonce, random_hash, mint, transfer_from
    
       }
    }
    
  2. 請(qǐng)注意津辩,我們?cè)趐allet中使用了sp_io。確保在pallet的Cargo.toml文件中將其聲明為依賴項(xiàng):

    sp-io = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.19" }
    
  3. 現(xiàn)在嘗試運(yùn)行以下命令來構(gòu)建pallet容劳。我們還沒有構(gòu)建整個(gè)鏈喘沿,因?yàn)槲覀冞€沒有在runtime中實(shí)現(xiàn)Currency類型。不過我們現(xiàn)在可以檢查pallet中有沒有錯(cuò)誤:

    cargo build -p pallet-kitties
    

您會(huì)看到到 Rust 編譯器會(huì)發(fā)出有關(guān)未使用導(dǎo)入的警告竭贩。沒關(guān)系蚜印!只需忽略它們 - 我們將在本教程的后面部分使用這些導(dǎo)入。

添加存儲(chǔ)項(xiàng)

讓我們將最簡(jiǎn)單的邏輯添加到runtime中:一個(gè)在runtime中存儲(chǔ)變量的函數(shù)娶视。為此晒哄,我們將使用StorageValue睁宰,Substrate的一個(gè)storage API,這個(gè)trait依賴于storage macor.

就我們的目的而言寝凌,我們要聲明的任何存儲(chǔ)項(xiàng)柒傻,我們必須事先包含宏#[pallet::storage]。了解有關(guān)聲明存儲(chǔ)項(xiàng)的更新詳細(xì)信息點(diǎn)擊這里较木。

pallets/kitties/src/lib.rs中红符,將 ACTION 行替換為:

#[pallet::storage]
#[pallet::getter(fn count_for_kitties)]
/// Keeps track of the number of Kitties in existence.
pub(super) type CountForKitties<T: Config> = StorageValue<_, u64, ValueQuery>;

這將為我們的pallet創(chuàng)建一個(gè)存儲(chǔ)項(xiàng)目,以追蹤現(xiàn)有的kitties總數(shù)伐债。

添加貨幣實(shí)現(xiàn)

在繼續(xù)構(gòu)建node之前预侯,我們需要將 Currency 類型添加到pallet的runtime中。在runtime/src/lib.rs中峰锁,添加以下內(nèi)容:

impl pallet_kitties::Config for Runtime {
    type Event = Event;
    type Currency = Balances; // <-- Add this line
}

現(xiàn)在構(gòu)建node并確保沒有任何錯(cuò)誤萎馅。這將需要一點(diǎn)時(shí)間。

cargo build --release

本系列的第一部分已經(jīng)完成虹蒋,待續(xù)糜芳。。魄衅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峭竣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晃虫,更是在濱河造成了極大的恐慌皆撩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哲银,死亡現(xiàn)場(chǎng)離奇詭異扛吞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盘榨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門喻粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人草巡,你說我怎么就攤上這事⌒退郑” “怎么了山憨?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弥喉。 經(jīng)常有香客問我郁竟,道長(zhǎng),這世上最難降的妖魔是什么由境? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任棚亩,我火速辦了婚禮蓖议,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讥蟆。我一直安慰自己勒虾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布瘸彤。 她就那樣靜靜地躺著修然,像睡著了一般。 火紅的嫁衣襯著肌膚如雪质况。 梳的紋絲不亂的頭發(fā)上愕宋,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音结榄,去河邊找鬼中贝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臼朗,可吹牛的內(nèi)容都是我干的雄妥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼依溯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼老厌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黎炉,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤枝秤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后慷嗜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淀弹,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年庆械,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薇溃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缭乘,死狀恐怖沐序,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堕绩,我是刑警寧澤策幼,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奴紧,受9級(jí)特大地震影響特姐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黍氮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一唐含、第九天 我趴在偏房一處隱蔽的房頂上張望浅浮。 院中可真熱鬧,春花似錦捷枯、人聲如沸滚秩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叔遂。三九已至,卻和暖如春争剿,著一層夾襖步出監(jiān)牢的瞬間已艰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蚕苇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哩掺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓涩笤,卻偏偏與公主長(zhǎng)得像嚼吞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹬碧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359