风险提示:请理性看待区块链,树立正确的货币观念和投资理念,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。 免责声明:本站所发布文章仅代表个人观点,与CoinVoice官方立场无关

Substrate 的 RPC 客户端之 Subxt 入门篇

PolkaWorld
2020年01月02日

Substrate 生态系统中的 RPC 客户端

对于区块链开发团队,除了链本身的开发之外,最重要的就是如何与链进行交互了。一般来说 UI 的交互界面主要给一般用户使用的,而开发团队较多使用的是 RPC 客户端。

其实一个简单易用的 RPC 客户端会节省团队很多时间。以太坊并没有独立的 RPC 客户端(其实太坊独立的 RPC 客户端组件基本都在 Javascript 系统中),需要的时候只能从 Geth 或 Parity-Ethereum 中自己选取相应的组件自行拼装。这是我在从事以太坊开发的时候略有不满的地方。

而 Substrate 一下子就有两个独立的 Rust 原生 RPC 客户端!Parity 的 substrate-subxt 和获得了 W3F Grants 的 substrate-api-client。

目录结构

今天我们先来简单看一下 substrate-subxt。(目前看来 substrate-api-client 的一个可能相对优势是它支持 no_std)。先看下目录结构

    hide/  
    ├── error.rs  
    ├── events.rs  
    ├── extrinsic.rs  
    ├── frame  
    │   ├── balances.rs  
    │   ├── contracts.rs  
    │   ├── mod.rs  
    │   └── system.rs  
    ├── lib.rs  
    ├── metadata.rs  
    ├── rpc.rs  
    └── runtimes.rs  

大部分文件通过文件名就能看出其作用。lib.rs 提供了我们所需要的客户端以及生产该客户端的工厂。frame 文件夹提供了对 Substrate frame 同名模块的支持,而 runtimes.rs 适配了一个默认的 Substrate runtime:DefaultNodeRuntime (该 runtime 包含 frame 目录下的那几个模块)。该 runtime 对于处理一般的转账和查询已经是够用了。

入门实战

这里我们用 Subxt 向 Substrate 链提交一笔转账,并查询账户的余额。先上代码:

    use subxt::{  
        balances::{  
            self,  
            BalancesStore,  
        },  
        DefaultNodeRuntime as Runtime,  
        ClientBuilder,  
    };  
    use sp_keyring::AccountKeyring;  

    fn main() {  

        // 整个 client 需要由 tokio 驱动。首先创建一个适配  
        // DefaultNodeRuntime 的客户端  
        let mut rt = tokio::runtime::Runtime::new().unwrap();  
        let client_future = ClientBuilder::::new().build();  
        let client = rt.block_on(client_future).unwrap();  

        //  Alice 创建一个 transaction builder  
        let signer = AccountKeyring::Alice.pair();  
        let xt = rt.block_on(client.xt(signer, None)).unwrap();  

        let bob = AccountKeyring::Bob.to_account_id();  
        //  Alice  Bob 发起转账  
        let transfer =  
            xt.submit(balances::transfer::(bob.clone().into(), 10_000_000));  
        rt.block_on(transfer).unwrap();  

        // 查询 Bob 的余额  
        // 需要注意的是,由于上一步只能确保转账已经被提交  
        // 这里的余额一般还没来得及发生改变  
        println!("{:?}", rt.block_on(client.free_balance(bob.into())).unwrap());  
    }  

涉及到的依赖

    [dependencies]  
    tokio = "0.1"  
    sp-keyring = { git = "https://github.com/paritytech/substrate/", package = "sp-keyring" }  
    subxt = { git = "https://github.com/paritytech/substrate-subxt", package = "substrate-subxt" }  

然后先跑一个 Substrate 的 dev 结点(目前的 master 就可以),就可以欢快地运行我们的程序和链进行交互啦。怎么样,Substrate 生态中的 RPC 客户端是不是非常好用呢~

PS: 截止目前 Subxt 还有个小 Bug 导致编译可能无法通过,大家可以自己努力尝试解决下~

作者:John Wu (Cdot CTO,资深区块链开发者)

Substrate 的 RPC 客户端之 Subxt 入门篇

本周六的 Substrate 开发者聚会仅剩 16 个名额

本文作者 John Wu 也会到场分享哦 ~

点击下方卡片免费报名!

阅读更多:

开发了两年 Dapp、二层网络后,我转投了 Substrate 阵营

Substrate 区块链框架简介 | Hello, Substrate!

视频|Substrate 区块链开发范式简介

扫码关注公众号,回复 “1” 加入波卡群

Substrate 的 RPC 客户端之 Subxt 入门篇

点个 “在看” 再走吧!


声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。

评论0条