rust-electrum-client icon indicating copy to clipboard operation
rust-electrum-client copied to clipboard

Unexpected batch behavior

Open evanlinjin opened this issue 2 years ago • 0 comments

The problem

If we do a batch request where the response array contains a response object which is an error, ElectrumClient will return Err(Error::Protocol) and the response objects will be discarded. This is not ideal as in most instances, we still want the response objects.

For example, a single request to method blockchain.transaction.get may return an response object with error if the transaction does not exist. Doing a batch of blockchain.transaction.get requests where we have a single transaction that the electrum server is not aware of (yet), will result in us not seeing any of the other response objects.

This is the current API for a batch request

https://github.com/bitcoindevkit/rust-electrum-client/blob/129081999ce96f1ed33877a2aecad4e2550764f3/src/raw_client.rs#L697

Proposed solution

fn batch_call(&self, batch: &Batch) -> Result<Vec<RawResponse>, Error> { todo!() }

pub enum RawResponse {
    /// Instead of returning `Err(Error::Protocol)`, we have this.
    Error { code: i32, message: String, data: Option<serde::Value> },

    /// The successful result, as usual.
    Result(serde::Value),
}

The RawResponse can be used to transform into a non-raw response depending on the method invoked.

For example, client.transaction_get() can return Result<Option<Transaction>, Error>.

Questions

  • The electrum server API docs does not provide error codes for error responses. Is there a standard for these? For example, if a transaction is not found.

Reference

  • https://www.jsonrpc.org/specification
  • https://electrumx-spesmilo.readthedocs.io/en/latest/protocol-methods.html#blockchain-transaction-get

evanlinjin avatar Feb 14 '23 11:02 evanlinjin