淺談swap去中心化交易所繫統開發技術方案

Tg_StPv888發表於2023-04-11

現在,每當 gen_gender()在pallet內呼叫時,它都會返回 Gender的偽隨機列舉值。

實現鏈上隨機性

如果我們希望能夠區分這些小貓,我們需要賦予它們獨特的屬性!在上一步中,我們使用了尚未實際定義的 KittyRandomness

我們將使用 frame_support 中的 執行此操作。它將能夠生成一個隨機的種子,我們將用它來建立獨特的小貓,並培育新的小貓。

  1. 在pallet的配置特徵中,定義受 Randomness特徵約束的新型別。

來自 frame_supportRandomnesstrait 需要使用引數來指定 OutputBlockNumber泛型。

將 ACTION #5 行替換為:

type KittyRandomness: Randomness<Self::Hash, Self::BlockNumber>;
  1. 在runtime中指定實際型別。

鑑於我們在pallet的配置中新增了一個新型別,我們需要配置runtime以設定其具體型別。如果我們想更改正在使用的演算法,而無需修改pallet內的使用位置, KittyRandomness可能會派上用場。為了展示這一點,我們將設定 KittyRandomness 型別為 FRAME 的 RandomnessCollectiveFlip 的一個例項。 方便的是,node template已經有一個 RandomnessCollectiveFlip pallet的例項。

在runtime的 runtime/src/lib.rs 中設定 KittyRandomness 型別

impl pallet_kitties::Config for Runtime {
    type Event = Event;
    type Currency = Balances;
    type KittyRandomness = RandomnessCollectiveFlip; // <-- ACTION: add this line.}

在這裡,我們從其介面( Randomness<Self::Hash, Self::BlockNumber>)中抽象出隨機性生成實現( RandomnessCollectiveFlip)。

  1. 隨機生成DNA

生成DNA類似於使用隨機性隨機分配性別型別。不同之處在於,我們將使用在上一部分中匯入的 blake2_128。如果我們在同一塊中多次呼叫此函式,我們還將使用 從 frame_systempallet中生成不同的雜湊。將 ACTION #6 行替換為:

impl pallet_kitties::Config for Runtime {
    type Event = Event;
    type Currency = Balances;
    type KittyRandomness = RandomnessCollectiveFlip; // <-- ACTION: add this line.}

寫入剩餘的儲存項

為了輕鬆跟蹤我們所有的小貓咪,我們將標準化我們的邏輯,以使用一的 ID 作為儲存項的全域性KEY。這意味著單個唯鍵將指向我們的Kitty物件(即我們之前宣告的結構)。

為了使其正常工作,我們需要確保新Kitty的ID始終是唯的。我們可以使用新的儲存項 Kitties來執行此操作,該儲存項將從ID(雜湊)對映到Kitty物件。

使用此物件,我們只需檢查此儲存項是否已包含使用特定 ID 的對映,即可輕鬆檢查衝突。例如,從可排程函式內部,我們可以使用以下命令進行檢查:

ensure!(!<Kitties<T>>::exists(new_id), "This new id already exists");

我們的runtime需要注意:

  • 獨特的資產,如貨幣或小貓(這將由名為 Kitties的儲存map持有)。
  • 這些資產的所有權,如帳戶ID(這將處理一個名為 KittiesOwned的新儲存對映)。

要為結構 Kitty建立儲存例項,我們將使用 — FRAME 提供給我們的。

儲存項的外觀如下:

#[pallet::storage]#[pallet::getter(fn kitties)]pub(super) type Kitties<T: Config> = StorageMap<
    _,
    Twox64Concat,
    T::Hash,
    Kitty<T>,>;

KittiesOwned儲存項與此類似,只是我們將使用 BoundedVec來跟蹤我們將在 runtime/src/lib.s中配置的 Kitties 的最大數量。

#[pallet::storage]#[pallet::getter(fn kitties_owned)]/// Keeps track of what accounts own what Kitty.pub(super) type KittiesOwned<T: Config> = StorageMap<
    _,
    Twox64Concat,
    T::AccountId,
    BoundedVec<T::Hash, T::MaxKittyOwned>,
    ValueQuery,>;

複製上面的兩個程式碼片段以替換操作 #7 行。

在檢查pallet編譯之前,我們需要在配置特徵中新增一個新型別 MaxKittyOwned,這是一個pallet常量型別(類似於前面 KittyRandomness的步驟)。將操作 #9 替換為:

#[pallet::constant]type MaxKittyOwned: Get<u32>;

最後,我們在 runtime/src/lib.rs中定義型別 MaxKittyOwned。這與我們對 Currency 和 KittyRandomness 遵循的模式相同,只是我們將使用 parameter_types ! 宏新增一個固定的 u32!

parameter_types! {              // <- add this macro
    // One can own at most 9,999 Kitties
    pub const MaxKittyOwned: u32 = 9999;}/// Configure the pallet-kitties in pallets/kitties.impl pallet_kitties::Config for Runtime {
    type Event = Event;
    type Currency = Balances;
    type KittyRandomness = RandomnessCollectiveFlip;
    type MaxKittyOwned = MaxKittyOwned; // <- add this line}

檢查Kitties 區塊鏈編譯

cargo build --release


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2944920/,如需轉載,請註明出處,否則將追究法律責任。

相關文章