#polkadot #block #chain #block-transaction #rosetta #connector #analog

bin+lib rosetta-server-polkadot

Polkadot rosetta 服务器

2 个不稳定版本

0.4.0 2023年6月29日
0.1.0 2023年3月30日

#17 in #rosetta

MIT 许可证

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,其中包含 nonceruntime specsgenesis hash 和与 pallet 相关的信息。

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变体,这个变体接受一个参数,其类型为AccountIdAccountId的类型是

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