1 unstable release
0.1.0 | Jan 27, 2021 |
---|
#16 in #rosetta
150KB
3.5K
SLoC
Rosetta Solana
ROSETTA-SOLANA IS CONSIDERED ALPHA SOFTWARE. USE AT YOUR OWN RISK!
Overview
rosetta-solana
provides a reference implementation of the Rosetta API for
Solana in Rust. If you haven't heard of the Rosetta API, you can find more
information here.
Features
- Rosetta API implementation (both Data API and Construction API)
- Stateless, offline, curve-based transaction construction
- Simpler alternative Operations structure using metadata
- Supports most system and spl instructions
Usage
As specified in the Rosetta API Principles,
all Rosetta implementations must be deployable via Docker and support running via either an
online
or offline
mode.
Docker Install
Running the following commands will create a Docker image called rosetta-solana:latest
.
From Source
After cloning this repository, run:
docker build -t rosetta-solana .
docker-compose up
Direct Install
After cloning this repository, run:
cargo run build --release
Testing with rosetta-cli
To validate rosetta-solana
, install rosetta-cli
and run one of the following commands:
rosetta-cli check:data --configuration-file rosetta-cli-conf/devnet.json
rosetta-cli check:construction --configuration-file rosetta-cli-conf/devnet.json
Note: If cli test gives EOF error it's probably due to golang trying to reuse connection and server closing it. I have disabled keep-alive for that reason. It's recommended to run cli test in dev mode.
Development
cargo run
to run servercargo run test
to run testscargo docs
to create docs
Details
Endpoints Implemented
/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)
Default environment variables
RPC_URL = "https://devnet.solana.com"
NETWORK_NAME = "devnet"
HOST = "127.0.0.1"
PORT = "8080"
MODE = "online" //online/offline
Operations supported
See types::OperationType
to see full list of current operations supported . This list might not be up to date.
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,
Simpler Operations
This implementation also supports writing operations using metadata only. Instead of writing two operations for a simple transfer transaction one can simply write a single operation and fill it's metadata e.g source
, destination
, authority
, lamports
.
e.g
[
Operation{
account: {address: "Sender"},
amount: { value: "-10",...},
...
},
Operation{
account: {address: "Receiver"},
amount: {value: "10",...},
...
}
]
[
Operation{
metadata: {
source: "Sender",
destination: "Receiver",
lamports: 10
},
...
},
]
Both are same operations although the first one (Rosetta spec) always overwrites the second one.
Nonce transfers
To send a transaction with a nonce you need to add metadata to construction_preprosess with {"metadata": {"with_nonce": {"account": "address of nonce account"}}}
Balance changing Operations
See imp of OperationType
in src/types.rs
for list of balance changing operations. They might also require additional metadata depending on operation. Operation where only change is fees are not considered balance changing operation. Operation with only 1 balance change with no equal opposite signed opration are also not balance changing e.g mint or burn.
Examples
See tests in src/construction.rs
to see complete working examples.
TODO
- Add optional commitment option to every operation that accepts
- All preprocess metadata fetching for every operation type
- Docs for every operation type
- Suport all operation types
- Better errors
License
This project is available open source under the terms of the Apache 2.0 License.
Dependencies
~82MB
~1.5M SLoC