2 个不稳定版本
0.4.0 | 2023年6月29日 |
---|---|
0.1.0 | 2023年3月30日 |
#17 in #rosetta
85KB
2K SLoC
Substrate 链 Rosetta 服务器
本项目包含 BlockchainClient
的 substrate 链实现。
实现的方法有
config
genesis_block
node_version
current_block
balance
faucet
metadata
submit
block
block_transaction
call
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