< 返回版块

nickhell 发表于 2020-01-07 13:06

Tags:substrate,jsonrpc

在substrate master里,./bin/node/rpc-client/src/main.rs中,use sc_rpc::author::{AuthorClient.. 其中AuthorClient找不到实现代码,通过检索发现./client/rpc-api/src/author/mod.rs中有一句pub use self::gen_client::Client as AuthorClient。但依然没有实现代码,请问gen_client怎么理解,AuthorClient是怎么实现的?是采用类似java反射的动态加载吗?

评论区

写评论
AlephAlpha 2020-01-07 16:23

Rust 好像没有动态加载。如果找不到实现的代码,一般是在某个宏里。

注意这里这个 #[rpc]

/// Substrate authoring RPC API
#[rpc]
pub trait AuthorApi<Hash, BlockHash> {
	/// RPC metadata
	type Metadata;

这是一个 attribute macro。再看前面,这个宏是从 jsonrpc_derive 引入的。

再去翻 jsonrpc_derive 的代码(不在同一个仓库),很容易就找到了

	Ok(quote! {
		/// The generated client module.
		pub mod gen_client {
			use #client_name as _jsonrpc_core_client;
			use super::*;

也就是说,gen_client 确实是由这个宏生成的。

pfcoder 2020-01-07 16:21

#[rpc] 会生成动态代码,实际的type是author::rpc_impl_AuthorApi::gen_client 具体可以参考 https://docs.rs/crate/jsonrpc-derive/14.0.5/source/src/lib.rs https://docs.rs/crate/jsonrpc-derive/14.0.5/source/src/to_client.rs

1 共 2 条评论, 1 页