【Substrate Collectables教程】【第1章基礎】3. 儲存 Value
阿新 • • 發佈:2022-05-12
儲存一個 Value
之前在建立Storage Value已經在 runtime 中聲明瞭儲存值,我們實際上可以建立一個函式來將值推送到儲存中
3.1 宣告一個 Public Function
我們需要去定義設定和修改儲存值的 runtime 函式。這可以在我們的 decl_module!
巨集中完成,該巨集聲明瞭 module 用於處理邏輯的所有入口。
宣告函式之前,加入以下引用:
以下是宣告公開函式的示例:
此外,建立一個 set_value()
函式,該函式允許使用者傳送一條簽名訊息,該訊息將 u64
放入 runtime 儲存中。
3.2 函式結構
此處公開的 module 函式
fn foo(origin, bar: Bar, baz: Baz, ...) -> Result;
3.3 函式中的Origin
這些函式的第一個引數始終是 origin
。 origin
包含有關呼叫來源的資訊。通常分為三組:
- 由外部帳戶簽名的 public 呼叫。
- 允許僅由治理系統進行的 root 呼叫。
- 允許僅由塊作者和驗證者進行的 inherent 呼叫。
3.4 函式中的Result
此外,這些函式必須返回 support::dispatch
模組中的 Result
型別。這意味著成功的函式呼叫將始終返回 Ok(())
,否則應捕獲可能導致問題的任何錯誤並返回 Err()
。
由於這些是排程函式,因此需要記住兩件非常重要的事情:
- MUST NOT PANIC: 在任何情況下(儲存,或者儲存進入一個不可挽回的損壞狀態)函式都不能 panic。
- NO SIDE-EFFECTS ON ERROR: 此函式要麼全部完成並返回
Ok(())
,要麼它必須對儲存沒有副作用並返回Err('Some reason')
。
我們稍後會談到這些。在本教程中,我們將確保滿足這兩個條件,並且我們也提醒你這樣做。
3.5 檢查簽名訊息
如上所述,任何這些模組函式中的第一個引數是 origin
。system
module 中提供了三個方便的可呼叫函式 ensure_signed
, ensure_root
ensure_inherent
,它們可以幫你做相應的匹配,並返回一個可用的結果。在你的函式中做的第一件事應該總是從這三個呼叫函式中選擇匹配的函式。
我們可以使用 system
中的 ensure_signed()
函式來檢查 origin,並“確保”訊息是經過有效帳戶簽名的。我們甚至可以從函式呼叫的結果中派生簽名帳戶,如上面的示例函式所示。