1 个不稳定版本
0.4.0 | 2023 年 6 月 29 日 |
---|
#14 在 #a-star
140KB
2.5K SLoC
Substrate 链 Rosetta 服务器
该项目包含 substrate 链的 BlockchainClient
实现。
实现的方法有
config
genesis_block
node_version
current_block
balance
faucet
metadata
submit
block
block_transaction
call
config
:
此方法返回包含 Polkadot 链特定详细信息的配置的 BlockchainConfig
。
genesis_block
:
返回创世块标识符。
node_version
:
返回节点客户端版本。
current_block
:
使用 RPC 获取当前块并返回其标识符。
balance
:
从链上获取账户余额并返回。它接受两个参数:address
:要获取余额的账户地址。 block
:要获取账户余额的块的标识符。
block
:
此函数接受包含块索引或哈希的 PartialBlockIdentifier
,并返回该交易中的块交易和操作。
block_transaction
:
此函数接受:block
:这是我们想从中获取交易的块的标识符。 tx
:我们想获取的交易标识符。它返回指定块中特定的交易及其操作。
faucet
:
此方法用于在测试网中向账户提供一定数量的代币。它接受两个参数:address
:我们想提供资金的账户地址。 amount
:我们想提供的代币数量。
metadata
:
此调用用于获取账户的非零值,它接受两个参数:public_key
:这是发送者的公钥。 options
:这是创建元数据所需的参数。对于 Polkadot 链,它需要 pallet_name
: pallet 的名称。 call_name
:pallet 的函数。 call_args
:pallet 的参数。
它返回包含 nonce
、runtime specs
、genesis hash
和与 pallet 相关信息的 PolkadotMetadata
。
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]
传递,这是一个 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
]
}
依赖项
~85MB
~1.5M SLoC