Add getSignatureStatus
This commit is contained in:
parent
a23c230603
commit
1821e72812
|
@ -19,6 +19,7 @@ Methods
|
||||||
* [getBalance](#getbalance)
|
* [getBalance](#getbalance)
|
||||||
* [getAccountInfo](#getaccountinfo)
|
* [getAccountInfo](#getaccountinfo)
|
||||||
* [getLastId](#getlastid)
|
* [getLastId](#getlastid)
|
||||||
|
* [getSignatureStatus](#getsignaturestatus)
|
||||||
* [getTransactionCount](#gettransactioncount)
|
* [getTransactionCount](#gettransactioncount)
|
||||||
* [requestAirdrop](#requestairdrop)
|
* [requestAirdrop](#requestairdrop)
|
||||||
* [sendTransaction](#sendtransaction)
|
* [sendTransaction](#sendtransaction)
|
||||||
|
@ -141,6 +142,31 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "m
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### getSignatureStatus
|
||||||
|
Returns the status of a given signature. This method is similar to
|
||||||
|
[confirmTransaction](#confirmtransaction) but provides more resolution for error
|
||||||
|
events.
|
||||||
|
|
||||||
|
##### Parameters:
|
||||||
|
* `string` - Signature of Transaction to confirm, as base-58 encoded string
|
||||||
|
|
||||||
|
##### Results:
|
||||||
|
* `string` - Transaction status:
|
||||||
|
* `Confirmed` - Transaction was successful
|
||||||
|
* `SignatureNotFound` - Unknown transaction
|
||||||
|
* `ProgramRuntimeError` - An error occurred in the program that processed this Transaction
|
||||||
|
* `GenericFailure` - Some other error occurred. **Note**: In the future new Transaction statuses may be added to this list. It's safe to assume that all new statuses will be more specific error conditions that previously presented as `GenericFailure`
|
||||||
|
|
||||||
|
##### Example:
|
||||||
|
```bash
|
||||||
|
// Request
|
||||||
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899
|
||||||
|
|
||||||
|
// Result
|
||||||
|
{"jsonrpc":"2.0","result":"SignatureNotFound","id":1}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
### getTransactionCount
|
### getTransactionCount
|
||||||
Returns the current Transaction count from the ledger
|
Returns the current Transaction count from the ledger
|
||||||
|
|
||||||
|
|
50
src/rpc.rs
50
src/rpc.rs
|
@ -84,6 +84,14 @@ pub struct Meta {
|
||||||
}
|
}
|
||||||
impl Metadata for Meta {}
|
impl Metadata for Meta {}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Serialize)]
|
||||||
|
pub enum RpcSignatureStatus {
|
||||||
|
Confirmed,
|
||||||
|
SignatureNotFound,
|
||||||
|
ProgramRuntimeError,
|
||||||
|
GenericFailure,
|
||||||
|
}
|
||||||
|
|
||||||
build_rpc_trait! {
|
build_rpc_trait! {
|
||||||
pub trait RpcSol {
|
pub trait RpcSol {
|
||||||
type Metadata;
|
type Metadata;
|
||||||
|
@ -103,6 +111,9 @@ build_rpc_trait! {
|
||||||
#[rpc(meta, name = "getLastId")]
|
#[rpc(meta, name = "getLastId")]
|
||||||
fn get_last_id(&self, Self::Metadata) -> Result<String>;
|
fn get_last_id(&self, Self::Metadata) -> Result<String>;
|
||||||
|
|
||||||
|
#[rpc(meta, name = "getSignatureStatus")]
|
||||||
|
fn get_signature_status(&self, Self::Metadata, String) -> Result<RpcSignatureStatus>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getTransactionCount")]
|
#[rpc(meta, name = "getTransactionCount")]
|
||||||
fn get_transaction_count(&self, Self::Metadata) -> Result<u64>;
|
fn get_transaction_count(&self, Self::Metadata) -> Result<u64>;
|
||||||
|
|
||||||
|
@ -119,17 +130,10 @@ impl RpcSol for RpcSolImpl {
|
||||||
type Metadata = Meta;
|
type Metadata = Meta;
|
||||||
|
|
||||||
fn confirm_transaction(&self, meta: Self::Metadata, id: String) -> Result<bool> {
|
fn confirm_transaction(&self, meta: Self::Metadata, id: String) -> Result<bool> {
|
||||||
let signature_vec = bs58::decode(id)
|
self.get_signature_status(meta, id)
|
||||||
.into_vec()
|
.map(|status| status == RpcSignatureStatus::Confirmed)
|
||||||
.map_err(|_| Error::invalid_request())?;
|
|
||||||
if signature_vec.len() != mem::size_of::<Signature>() {
|
|
||||||
return Err(Error::invalid_request());
|
|
||||||
}
|
|
||||||
let signature = Signature::new(&signature_vec);
|
|
||||||
meta.request_processor
|
|
||||||
.get_signature_status(signature)
|
|
||||||
.map(|res| res.is_ok())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_account_info(&self, meta: Self::Metadata, id: String) -> Result<Account> {
|
fn get_account_info(&self, meta: Self::Metadata, id: String) -> Result<Account> {
|
||||||
let pubkey_vec = bs58::decode(id)
|
let pubkey_vec = bs58::decode(id)
|
||||||
.into_vec()
|
.into_vec()
|
||||||
|
@ -156,6 +160,23 @@ impl RpcSol for RpcSolImpl {
|
||||||
fn get_last_id(&self, meta: Self::Metadata) -> Result<String> {
|
fn get_last_id(&self, meta: Self::Metadata) -> Result<String> {
|
||||||
meta.request_processor.get_last_id()
|
meta.request_processor.get_last_id()
|
||||||
}
|
}
|
||||||
|
fn get_signature_status(&self, meta: Self::Metadata, id: String) -> Result<RpcSignatureStatus> {
|
||||||
|
let signature_vec = bs58::decode(id)
|
||||||
|
.into_vec()
|
||||||
|
.map_err(|_| Error::invalid_request())?;
|
||||||
|
if signature_vec.len() != mem::size_of::<Signature>() {
|
||||||
|
return Err(Error::invalid_request());
|
||||||
|
}
|
||||||
|
let signature = Signature::new(&signature_vec);
|
||||||
|
Ok(
|
||||||
|
match meta.request_processor.get_signature_status(signature) {
|
||||||
|
Ok(_) => RpcSignatureStatus::Confirmed,
|
||||||
|
Err(BankError::ProgramRuntimeError) => RpcSignatureStatus::ProgramRuntimeError,
|
||||||
|
Err(BankError::SignatureNotFound) => RpcSignatureStatus::SignatureNotFound,
|
||||||
|
Err(_) => RpcSignatureStatus::GenericFailure,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
fn get_transaction_count(&self, meta: Self::Metadata) -> Result<u64> {
|
fn get_transaction_count(&self, meta: Self::Metadata) -> Result<u64> {
|
||||||
meta.request_processor.get_transaction_count()
|
meta.request_processor.get_transaction_count()
|
||||||
}
|
}
|
||||||
|
@ -172,10 +193,7 @@ impl RpcSol for RpcSolImpl {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
let mut signature_status;
|
let mut signature_status;
|
||||||
loop {
|
loop {
|
||||||
signature_status = meta
|
signature_status = meta.request_processor.get_signature_status(signature);
|
||||||
.request_processor
|
|
||||||
.get_signature_status(signature)
|
|
||||||
.map_err(|_| Error::internal_error())?;
|
|
||||||
|
|
||||||
if signature_status.is_ok() {
|
if signature_status.is_ok() {
|
||||||
return Ok(bs58::encode(signature).into_string());
|
return Ok(bs58::encode(signature).into_string());
|
||||||
|
@ -227,8 +245,8 @@ impl JsonRpcRequestProcessor {
|
||||||
let id = self.bank.last_id();
|
let id = self.bank.last_id();
|
||||||
Ok(bs58::encode(id).into_string())
|
Ok(bs58::encode(id).into_string())
|
||||||
}
|
}
|
||||||
fn get_signature_status(&self, signature: Signature) -> Result<result::Result<(), BankError>> {
|
fn get_signature_status(&self, signature: Signature) -> result::Result<(), BankError> {
|
||||||
Ok(self.bank.get_signature_status(&signature))
|
self.bank.get_signature_status(&signature)
|
||||||
}
|
}
|
||||||
fn get_transaction_count(&self) -> Result<u64> {
|
fn get_transaction_count(&self) -> Result<u64> {
|
||||||
Ok(self.bank.transaction_count() as u64)
|
Ok(self.bank.transaction_count() as u64)
|
||||||
|
|
Loading…
Reference in New Issue