1 个不稳定版本

0.4.0 2023 年 6 月 29 日

#14#a-star

MIT 许可证

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 的参数。

它返回包含 nonceruntime specsgenesis hash 和与 pallet 相关信息的 PolkadotMetadata

submit:

它接受已签名的交易字节,并将其提交到链上并返回其交易 ID。

call:

要从Substrate链中获取存储或任何常量,您可以使用Call函数。此方法接收一个CallRequest作为输入,并返回一个json Value作为输出。该CallRequest包含以下字段:

  • NetworkIdentifier - 要进行调用的网络。
  • Method - 包含用-分隔的包名、包函数和查询类型的字符串,例如StorageConstant
  • Parameters - 包含该包函数所需参数的数组。

传递参数

EnumsStruct作为数组值传递参数。假设我们有一个枚举

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