Ask Automata:在Substrate 中創建自定義RPC 訂閱| 由自動機網絡| 自動機網絡| 2021 年12 月

自動機網絡

如果您正在開發自定義區塊鏈,您可能希望允許用戶訪問自定義對象。在某些情況下,您可能還希望在某些感興趣的對象發生變化時通知用戶,這樣他們就不必經常輪詢它。

這就是為什麼我們將向您展示如何通過利用Substrate 提供的存儲和存儲更改通知流為您定義的對象創建自定義RPC 訂閱👆🏻

首先,確保您已經設置了RPC 模塊,因為訂閱方法將被定義為其中的一部分。查找有關實現自定義RPC 的更多信息 這裡.

出於本演示的目的,我們將使用以下內容 自定義對象 結構體,與相關聯 對象狀態 枚舉:

為簡單起見,我們假設我們的存儲中只有這些對象之一,並且該值存儲在 自定義對象值 存儲值。公開的允許用戶訂閱和取消訂閱此對象狀態的RPC 方法是“rpc_customSubscribe“, 和”rpc_custom取消訂閱“ 分別。

訂閱由一對訂閱-取消訂閱方法組成,在收到訂閱或取消訂閱請求時調用。這些方法使用 發布訂閱 宏來指示它們屬於哪個訂閱,以及它們關聯的RPC 方法。

讓我們繼續定義當“rpc_customSubscribe” 由用戶調用:

如果我們希望我們的subscribe 方法從用戶那裡接收參數,我們可以相應地更改簽名:

使用 發布訂閱,我們指定 custom_subscribe 是“自定義”訂閱的一部分,它是訂閱方法,用戶可以通過“rpc_customSubscribe” RPC 方法。

你會記得我們之前提到的訂閱是由訂閱🙋🏻和取消訂閱🙅🏻兩種方法組成的。因此,在我們添加 退訂 我們的“自定義”訂閱方法:

✅ 退訂方法必須相同 訂閱,即我們的例子中的“custom”,並且必須用註釋 退訂. 我們可以為它選擇任何我們想要的名稱,但為了一致性(以及使用我們的RPC 接口的人的理智😌),我們使用從subscribe 方法派生的名稱。

與我們相關的subscribe-unsubscribe 方法的參數是 訂閱者:訂閱者參數:T. S 表示作為通知發送給訂閱者的項目的數據類型,T 表示參數的數據類型,如果我們的subscribe 方法接受的話。在我們的例子中, 自定義對象值 是CustomObj 類型的單個獨立值,但是如果我們使用StorageMap 來保存多個CustomObj 項目,那麼我們可以使用 索引StorageMap。

讓我們假設 custom_subscribe()custom_unsubcribe() 是一個 應用程序接口 trait,我們希望這個trait 由我們的 處理程序 類型。 RpcHandler 必須定義什麼 元數據 類型是,並且還將有一個 訂閱管理器 為我們做大部分繁重的工作。

對於元數據類型,我們將簡單地使用 sc_rpc::元數據

訂閱管理器 負責為每個訂閱分配一個唯一標識符,向訂閱者發送通知,並處理取消訂閱過程。我們所要做的就是將我們希望我們的訂閱者以一種形式接收的數據傳遞給它 未來, 經理會負責其他一切💫

要使用存儲更改通知流,我們的 處理程序 需要一個暴露由定義的方法的客戶端 區塊鏈事件 trait — Substrate 客戶端已經這樣做了,所以我們要做的就是在我們的RPC 模塊中指定它:

下面是 custom_subscribe RpcHandler 實現的方法:

我們也重現 get_custom_obj(),這需要 存儲變更集 通過流發送並將其轉換為 自定義對象.

👉🏻我們只收到與密鑰相關的更改 自定義對象值,所以我們要做的就是將數據解碼為CustomObj。如果數據無法解碼,我們返回一個 錯誤 並且流將丟棄它,確保用戶只收到有效的CustomObj 項目。

讓我們仔細看看那裡發生了什麼🔎

  1. 我們計算存儲中對象的鍵; 在這種情況下,對像在 我的模塊,它的名字是 自定義對象值. 根據您的數據的存儲方式,密鑰的計算會有所不同——這裡有一個 複習 關於如何計算密鑰。
  2. 使用密鑰,我們請求一個流,即一個通道的接收端(更準確地說,一個 追踪無界接收者); 每當我們的狀態 自定義對象 更改,這些更改將作為 (塊::哈希,存儲變更集) 元組。
  3. 一旦我們有了流,我們必須以一種可以傳遞給 訂閱管理器. 此外,我們還想將 (塊::哈希,存儲變更集) 更新為我們的訂閱者希望收到的CustomObj 通知。
  4. 最後,我們稱 添加 的功能 訂閱管理器 並向它傳遞一個閉包,該閉包會將流上收到的所有項目發送給訂閱者。如果您想在收到訂閱請求時發送初始值,您可以將其添加到流中:

可以通過調用拒絕訂閱 拒絕 訂閱者的方法,就像我們上面所做的那樣,以防無法獲得流。您也可以根據特定於應用程序的原因拒絕訂閱。

我們訂閱的取消訂閱方法非常簡單,我們只需要告訴 訂閱管理器 取消與關聯的訂閱 訂閱ID

是時候檢查我們的實現是否有效了。 RPC 訂閱是通過WebSockets 進行的,因此我們使用 連接到我們本地節點的WebSocket 端口並發出訂閱請求:

節點會向我們發回一個類似這樣的響應👇🏻

這裡, ”j5S1whvZETzBtXFn”是我們訂閱的ID,我們稍後會用它來取消訂閱。 這也是價值 custom_unsubscribe() 叫做。

我們將通過Polkadot UI 使用Sudo 托盤來更改存儲並觸發對訂閱者的通知。

JSON 鍵/值文件的格式為

我們在本演示中使用的值下方提供(我們不包括鍵,因為它取決於CustomObjValue 的存儲位置)。我們從設置開始 自定義對象值 到”0x10aabbccdd0000000000”,對應於名稱: 0xaabbccdd, 地位: 和計數器: 0.

然後,我們通過將CustomObjValue 設置為以下內容來模擬計數器的遞增兩次,狀態從綠色🟢變為紅色🔴:

我們還將值更改為“0x11aabbccdd0211000000”; 但是,由於這是一個無效的CustomObj 值,因此在進行此更改時用戶不會收到通知。

最後,我們將值設置為“0x10aabbccdd0312000000”,然後我們通過發出以下命令取消訂閱:

此圖顯示了我們與WebSocket 端點的交互:我們發出的命令為白色字體,響應和更新為藍色:

用sudo更新值的全過程和收到的通知📹👇🏻

在這篇文章中,我們✨ 實現了一個訂閱,用於在特定對象的狀態發生變化時接收通知✨

值得注意的是, 區塊鏈事件 trait 定義了兩個額外的函數, 導入通知流finality_notification_stream. 如果您要提供的更新與對象狀態無關,而是與塊創建或終結有關,那麼這兩個函數可能會派上用場!

Source Link

最受歡迎

繼續閱讀

長期持有者持有的比特幣(BTC)供應量達到最高水平

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打...

現在讀

$COOKIE, the Cookie3 Mark...

Tallinn, Estonia, March 26th, 2024...

長期持有者持有的比特幣(BTC)供應量達到最高水平...

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持有者和投機者。 儘管BTC 的價格在過去一個月中保持相對平穩,範圍在約29,000 美元至31,000 美元之間,但人們還是開始瘋狂囤積。 ...

Caldera 宣布與Espresso Syste...

Caldera 開發人員可以利用Espresso Sequence...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打開了大門。對於那些尋求利用Web3 遊戲巨大潛力的人來說,確保先發優勢至關重要。 了解Web3 遊戲生態系統在深入研究Web3 遊戲之前,有...

Taapsee Pannu 推出NFT 平台,介紹...

企業家貢獻者表達的意見是他們自己的。 您正在閱讀《企業家印度》,這是企業家媒體的國際特許經營刊物。 女演員Taapsee Pannu 最近推出了“taapseeclub.com”,這是她自己的非同質代...

比特幣(BTC) 地址休眠超過11 年,轉移310...

經過11 年多的閒置之後,一個包含3100 萬美元BTC 的休眠比特幣地址最近突然活躍起來。 2023年7月22日,地址 轉入 將其全部餘額轉移到新地址。 早期BTC 地址復活 比特幣自2009 年以來就已經存在,因此存在多年來不活躍的休眠地址,其中包含大量BTC。這種加密貨幣的一些早期採用者能夠...

加密貨幣死了嗎?當今加密貨幣的現狀

您之前可能聽說過加密貨幣正在消亡(或比特幣已消亡)。在這篇文章中,我們將研究加密貨幣的狀態,並嘗試回答這個問題:加密貨幣現在已經死了嗎? 在我們開始之前,我們想澄清一下,本文指的是最廣泛意義上的“加密貨幣行業”; 在裡面 網絡3 感覺。該定義包括加密資產市場; 但它還包括其他非財務用例。 隨著近來加...

Chancer 可能成為體育和社交博彩領域的下一個...

加密貨幣 隨著企業財報季節的繼續,本週股市表現好壞參半。在Ne...

以太坊(ETH) 創下兩個月來CEX 流入最高紀錄...

過去一周,以太坊(ETH)流入中心化交易所(CEX)的資金量創下了過去兩個月來的最高水平。這些重大的資產變動表明ETH 的價格可能會下跌。 CoinGecko 數據顯示,第二大加密貨幣的價格一直在小幅下跌,過去一周價值下跌了2.5%。截至撰寫本文時,以太幣易手價格為1,892.65 美元,過去24...

新的DeFi 法案有“不可行的義務”

加密貨幣創新委員會表示,新的反洗錢法案沒有為DeFi 中的非法金融...

幣安大幅削減成本,瑞波幣為美國銀行和加密貨幣風險投...

美國證券交易委員會(SEC)對加密貨幣公司的打擊似乎嚴重影響了幣安的業務。據報導,在過去幾週內,該加密貨幣交易所解雇了1,000 多名員工,並削減了一些福利。 幣安表示,“當前的市場環境和監管環境”導致利潤下降,這表明可能正在進行更多削減。一位發言人告訴Cointelegraph,該公司將考慮縮減“...

Automata 雙週更新:第48 期| 通過自動...

迎接新的季度意味著設定我們的意圖並為團隊規劃下一步的行動。幕後醞釀的一切——合作、產品功能和營銷發布——很難抑制我們的興奮。我們一開始就在1RPC(2 個備受期待的第2 層主網)上添加了對Linea 和Base 的支持。科技載體更新頁腳以顯示界面版本平滑的用戶體驗 USDC CCTP 支持 關於仲裁...