From 235392a33a04b8400312989969197aea0239951f Mon Sep 17 00:00:00 2001 From: motty Date: Tue, 1 Jun 2021 15:22:24 +0900 Subject: [PATCH 1/2] implement blockchain.transaction.get verbose support --- src/daemon.rs | 7 +++++++ src/electrum/server.rs | 31 ++++++++++++++++++++----------- src/new_index/query.rs | 7 +++++++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/daemon.rs b/src/daemon.rs index 529369954..d64fb26e9 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -509,6 +509,13 @@ impl Daemon { ) } + pub fn gettransaction_raw_verbose(&self, txid: &Txid) -> Result { + self.request( + "getrawtransaction", + json!([txid.to_hex(), 1]), + ) + } + pub fn getmempooltx(&self, txhash: &Txid) -> Result { let value = self.request( "getrawtransaction", diff --git a/src/electrum/server.rs b/src/electrum/server.rs index 6157fbef4..f2defc9f0 100644 --- a/src/electrum/server.rs +++ b/src/electrum/server.rs @@ -337,21 +337,30 @@ impl Connection { fn blockchain_transaction_get(&self, params: &[Value]) -> Result { let tx_hash = Txid::from(hash_from_value(params.get(0)).chain_err(|| "bad tx_hash")?); - let verbose = match params.get(1) { - Some(value) => value.as_bool().chain_err(|| "non-bool verbose value")?, - None => false, + + let mut verbose = false; + match params.get(1) { + Some(value) => if value == 1 || value == "1" { + verbose = true; + } else { + verbose = value.as_bool().chain_err(|| "non-bool verbose value")?; + }, + None => verbose = false, }; - // FIXME: implement verbose support if verbose { - bail!("verbose transactions are currently unsupported"); + let tx = self + .query + .lookup_raw_txn_verbose(&tx_hash) + .chain_err(|| "missing transaction")?; + Ok(json!(tx)) + } else { + let tx = self + .query + .lookup_raw_txn(&tx_hash) + .chain_err(|| "missing transaction")?; + Ok(json!(hex::encode(tx))) } - - let tx = self - .query - .lookup_raw_txn(&tx_hash) - .chain_err(|| "missing transaction")?; - Ok(json!(hex::encode(tx))) } fn blockchain_transaction_get_merkle(&self, params: &[Value]) -> Result { diff --git a/src/new_index/query.rs b/src/new_index/query.rs index c7211af43..8fe837f71 100644 --- a/src/new_index/query.rs +++ b/src/new_index/query.rs @@ -4,6 +4,8 @@ use std::collections::{BTreeSet, HashMap}; use std::sync::{Arc, RwLock, RwLockReadGuard}; use std::time::{Duration, Instant}; +use serde_json::{from_str, Value}; + use crate::chain::{Network, OutPoint, Transaction, TxOut}; use crate::config::Config; use crate::daemon::Daemon; @@ -114,12 +116,17 @@ impl Query { .lookup_txn(txid, None) .or_else(|| self.mempool().lookup_txn(txid)) } + pub fn lookup_raw_txn(&self, txid: &Txid) -> Option { self.chain .lookup_raw_txn(txid, None) .or_else(|| self.mempool().lookup_raw_txn(txid)) } + pub fn lookup_raw_txn_verbose(&self, txid: &Txid) -> Result { + self.daemon.gettransaction_raw_verbose(txid) + } + pub fn lookup_txos(&self, outpoints: &BTreeSet) -> HashMap { // the mempool lookup_txos() internally looks up confirmed txos as well self.mempool() From b317ebc1d973b5433322e411acd8e70cb6b0fcd6 Mon Sep 17 00:00:00 2001 From: motty Date: Wed, 2 Jun 2021 10:15:59 +0900 Subject: [PATCH 2/2] fix warning --- src/electrum/server.rs | 9 ++++----- src/new_index/query.rs | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/electrum/server.rs b/src/electrum/server.rs index f2defc9f0..7acd37ecf 100644 --- a/src/electrum/server.rs +++ b/src/electrum/server.rs @@ -338,14 +338,13 @@ impl Connection { fn blockchain_transaction_get(&self, params: &[Value]) -> Result { let tx_hash = Txid::from(hash_from_value(params.get(0)).chain_err(|| "bad tx_hash")?); - let mut verbose = false; - match params.get(1) { + let verbose = match params.get(1) { Some(value) => if value == 1 || value == "1" { - verbose = true; + true } else { - verbose = value.as_bool().chain_err(|| "non-bool verbose value")?; + value.as_bool().chain_err(|| "non-bool verbose value")? }, - None => verbose = false, + None => false, }; if verbose { diff --git a/src/new_index/query.rs b/src/new_index/query.rs index 8fe837f71..e95110502 100644 --- a/src/new_index/query.rs +++ b/src/new_index/query.rs @@ -4,7 +4,7 @@ use std::collections::{BTreeSet, HashMap}; use std::sync::{Arc, RwLock, RwLockReadGuard}; use std::time::{Duration, Instant}; -use serde_json::{from_str, Value}; +use serde_json::{Value}; use crate::chain::{Network, OutPoint, Transaction, TxOut}; use crate::config::Config;