#rosetta #operation #solana #api #metadata #transaction #blockchain

nightly app rosetta-solana

Solana 区块链的 Rosetta 服务器

1 个不稳定版本

0.1.0 2021年1月27日

#18 in #rosetta

Apache-2.0

150KB
3.5K SLoC

Rosetta

Rosetta Solana

ROSETTA-SOLANA 被视为 alpha 软件版本。使用风险自担!

概述

rosetta-solana 提供了 Rust 语言的 Solana 版 Rosetta API 的参考实现。如果您还没有听说过 Rosetta API,可以在 这里 找到更多信息。

特性

  • Rosetta API 实现(数据 API 和构造 API)
  • 无状态、离线、基于曲线的交易构造
  • 使用元数据简化了替代操作结构
  • 支持大多数系统 SPL 指令

用法

根据 Rosetta API 原则,所有 Rosetta 实现都必须通过 Docker 部署,并支持在线或离线模式运行。

Docker 安装

运行以下命令将创建一个名为 rosetta-solana:latest 的 Docker 镜像。

从源代码安装

在克隆此仓库后,运行

docker build -t rosetta-solana .
docker-compose up

直接安装

在克隆此仓库后,运行

cargo run build --release

使用 rosetta-cli 进行测试

为了验证 rosetta-solana,请安装 rosetta-cli 并运行以下命令之一

  • rosetta-cli check:data--configuration-file rosetta-cli-conf/devnet.json
  • rosetta-cli check:construction--configuration-file rosetta-cli-conf/devnet.json

注意:如果 cli 测试出现 EOF 错误,可能是由于 golang 尝试重用连接而服务器关闭了连接。出于这个原因,我已禁用 keep-alive。建议以 dev 模式运行 cli 测试。

开发

  • cargo run 运行服务器
  • cargo run test 运行测试
  • cargo docs 创建文档

详细信息

实现的端点

    /network/list (network_list)
    /network/options (network_options)
    /network/status (network_status)
    /account/balance (account_balance)
    /block (get_block)
    /block/transaction (block_transaction)
    /call (call)
    /construction/combine (construction_combine)
    /construction/derive (construction_derive)
    /construction/hash (construction_hash)
    /construction/metadata (construction_metadata)
    /construction/parse (construction_parse)
    /construction/payloads (construction_payloads)
    /construction/preprocess (construction_preprocess)
    /construction/submit (construction_submit)
    

默认环境变量

RPC_URL = "https://devnet.solana.com"
NETWORK_NAME = "devnet"
HOST = "127.0.0.1"
PORT = "8080"
MODE = "online" //online/offline

支持的操作

查看 types::OperationType 以查看当前支持的所有操作的全列表。此列表可能不是最新的。

 
    System__CreateAccount,
    System__Assign,
    System__Transfer,
    System__CreateNonceAccount,
    System__AdvanceNonce,
    System__WithdrawFromNonce,
    System__AuthorizeNonce,
    System__Allocate,
    SplToken__InitializeMint,
    SplToken__InitializeAccount,
    SplToken__CreateToken,
    SplToken__CreateAccount,
    SplToken__Transfer,
    SplToken__Approve,
    SplToken__Revoke,
    SplToken__MintTo,
    SplToken__Burn,
    SplToken__CloseAccount,
    SplToken__FreezeAccount,
    SplToken__ThawAccount,
    SplToken__TransferChecked,
    SplToken__CreateAssocAccount,

    Stake__CreateAccount,
    Stake__Delegate,
    Stake__Split,
    Stake__Merge,
    Stake__Authorize,
    Stake__Withdraw,
    Stake__Deactivate,
    Stake__SetLockup,

    Vote__CreateAccount,
    Vote__Authorize,
    Vote__Withdraw,
    Vote__UpdateValidatorIdentity,
    Vote__UpdateCommission,
    Unknown,

简单操作

此实现还支持仅使用元数据写入操作。对于简单的转账交易,用户可以简单地写入一个操作并填写其元数据,例如 sourcedestinationauthoritylamports

例如:

[
    Operation{
        account: {address: "Sender"},
        amount: { value: "-10",...},
        ...
    },
    Operation{
        account: {address: "Receiver"},
        amount: {value: "10",...},
        ...
    }
]
[
    Operation{
        metadata: {
            source: "Sender",
            destination: "Receiver",
            lamports: 10
        },
        ...
    },
]

这两个操作是相同的,尽管第一个(Rosetta规范)总是覆盖第二个。

nonce转账

要发送带有nonce的交易,您需要在construction_preprosess中添加元数据,如下所示:{"metadata": {"with_nonce": {"account": "address of nonce account"}}}

余额变更操作

有关余额变更操作的列表,请参阅 src/types.rs 中的 OperationType 实现。根据操作,它们可能还需要额外的元数据。仅更改费用的操作不被视为余额变更操作。仅有一个余额变更且没有相等相反签名操作的也并非余额变更,例如铸币或销毁。

示例

查看 src/construction.rs 中的测试以查看完整的示例。

待办事项

  • 将可选的承诺选项添加到每个接受的操作中
  • 为每个操作类型进行所有预处理元数据提取
  • 每个操作类型的文档
  • 支持所有操作类型
  • 更好的错误处理

许可证

此项目在Apache 2.0许可证的条款下提供开源。

依赖项

~79MB
~1.5M SLoC