2 个不稳定版本
| 0.4.0 | 2023年6月29日 |
|---|---|
| 0.1.0 | 2023年3月30日 |
#17 in #rosetta
85KB
2K SLoC
Substrate 链 Rosetta 服务器
本项目包含 BlockchainClient 的 substrate 链实现。
实现的方法有
configgenesis_blocknode_versioncurrent_blockbalancefaucetmetadatasubmitblockblock_transactioncall
config:
此方法返回 BlockchainConfig,其中包含针对 polkadot 链的特定配置细节。
genesis_block:
返回创世区块标识符。
node_version:
返回节点客户端版本。
current_block:
使用 RPC 获取当前区块并返回其标识符。
balance:
从链上获取账户余额并返回。它接受两个参数:address:要获取余额的账户地址。block:要获取余额的区块标识符。
block:
此函数接受 PartialBlockIdentifier,其中包含一个区块索引或哈希,并返回该交易中的区块交易和操作。
block_transaction:
此函数接受:block:这是要从中获取交易的区块标识符。tx:要获取的交易标识符。它返回指定区块中的特定交易及其操作。
faucet:
此方法用于在测试网中为账户提供一定数量的代币。它接受两个参数:address:要资助的账户地址。amount:要资助的代币数量。
metadata:
此调用用于获取账户的 nonce,它接受两个参数:public_key:这是发送者的公钥。options:这是创建元数据所需的参数。对于 polkadot 链,它需要 pallet_name: pallet 名称。call_name: pallet 的函数。call_args:pallet 的参数。
它返回 PolkadotMetadata,其中包含 nonce、runtime specs、genesis hash 和与 pallet 相关的信息。
submit:
它接受已签名的交易字节,并将已签名的交易提交到链上,并返回其交易 ID。
call:
要从Substrate链获取存储或任何常量,您可以使用Call函数。此方法接受一个CallRequest作为输入,并返回一个json Value作为输出。CallRequest包含以下字段
NetworkIdentifier- 进行调用的网络。Method- 包含通过-分隔的命名单元、单元函数和查询类型的字符串,例如Storage、Constant。Parameters- 包含执行该单元函数所需的参数的数组。
传递参数
Enums和Struct作为数组值传递参数,假设我们有一个枚举
enum TestEnum {
A,
B(u32),
C,
}
并且我们想将TestEnum::A作为参数传递,则我们将["A", ""]作为参数传递。数组中的第二个值是枚举变体的参数。在这种情况下,它将是空的,因为枚举不包含任何参数。如果我们想将TestEnum::B(10)作为参数传递,则我们将["B", 10]作为参数传递。在这里,我们将10作为数组中的Json Number传递。
现在让我们看看一个函数调用是否需要一个复杂的枚举
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)]
pub enum MultiAddress<AccountId, AccountIndex> {
/// It's an account ID (pubkey).
Id(AccountId),
/// It's an account index.
Index(#[codec(compact)] AccountIndex),
/// It's some arbitrary raw bytes.
Raw(Vec<u8>),
/// It's a 32 byte representation.
Address32([u8; 32]),
/// Its a 20 byte representation.
Address20([u8; 20]),
}
我们需要传递这个枚举的Id变体,这个变体接受一个参数,其类型为AccountId。AccountId的类型是
type AccountId = AccountId32;
其中AccountId32是一个包含32字节向量的结构。
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)]
pub struct AccountId32(pub [u8; 32]);
因此,我们需要将AccountId32作为参数传递。我们可以将其作为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]传递,它是一个32字节的数组。完整的枚举参数将如下所示
{
"params": [
["Id", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
]
}
同样,如果我们想在参数中传递一个Struct,我们也以值数组的形式传递。假设我们有一个结构体
struct TestStruct {
a: u32,
b: u32,
c: u32,
}
并且我们想将TestStruct { a: 1, b: 2, c: 3 }作为参数传递,那么我们传递的参数数组将是[1, 2, 3]。因此,将这些作为参数列表传递应该如下所示
{
"method": "pallet_name-storage_name-query_type",
"params": [
["A", ""], //representing TestEnum::A
[1, 2, 3] //representing TestStruct { a: 1, b: 2, c: 3 }
]
}
其他原始类型按原样传递。例如。
{
"method": "pallet_name-storage_name-query_type",
"params": [
1, //representing u32
"test", //representing String
false, //representing bool
]
}
依赖项
~39–54MB
~1M SLoC