|
|
@ -4,7 +4,8 @@ use bitcoin::blockdata::transaction::Transaction; |
|
|
|
use bitcoin::consensus::encode::{deserialize, serialize}; |
|
|
|
use bitcoin::network::constants::Network; |
|
|
|
use bitcoin::util::hash::BitcoinHash; |
|
|
|
use bitcoin::util::hash::Sha256dHash; |
|
|
|
use bitcoin_hashes::hex::{FromHex, ToHex}; |
|
|
|
use bitcoin_hashes::sha256d::Hash as Sha256dHash; |
|
|
|
use glob; |
|
|
|
use hex; |
|
|
|
use serde_json::{from_str, from_value, Value}; |
|
|
@ -453,7 +454,7 @@ impl Daemon { |
|
|
|
pub fn getblockheader(&self, blockhash: &Sha256dHash) -> Result<BlockHeader> { |
|
|
|
header_from_value(self.request( |
|
|
|
"getblockheader", |
|
|
|
json!([blockhash.be_hex_string(), /*verbose=*/ false]), |
|
|
|
json!([blockhash.to_hex(), /*verbose=*/ false]), |
|
|
|
)?) |
|
|
|
} |
|
|
|
|
|
|
@ -472,32 +473,28 @@ impl Daemon { |
|
|
|
} |
|
|
|
|
|
|
|
pub fn getblock(&self, blockhash: &Sha256dHash) -> Result<Block> { |
|
|
|
let block = block_from_value(self.request( |
|
|
|
"getblock", |
|
|
|
json!([blockhash.be_hex_string(), /*verbose=*/ false]), |
|
|
|
)?)?; |
|
|
|
let block = block_from_value( |
|
|
|
self.request("getblock", json!([blockhash.to_hex(), /*verbose=*/ false]))?, |
|
|
|
)?; |
|
|
|
assert_eq!(block.bitcoin_hash(), *blockhash); |
|
|
|
Ok(block) |
|
|
|
} |
|
|
|
|
|
|
|
pub fn getblocktxids(&self, blockhash: &Sha256dHash) -> Result<Vec<Sha256dHash>> { |
|
|
|
self.request( |
|
|
|
"getblock", |
|
|
|
json!([blockhash.be_hex_string(), /*verbose=*/ 1]), |
|
|
|
)? |
|
|
|
.get("tx") |
|
|
|
.chain_err(|| "block missing txids")? |
|
|
|
.as_array() |
|
|
|
.chain_err(|| "invalid block txids")? |
|
|
|
.iter() |
|
|
|
.map(parse_hash) |
|
|
|
.collect::<Result<Vec<Sha256dHash>>>() |
|
|
|
self.request("getblock", json!([blockhash.to_hex(), /*verbose=*/ 1]))? |
|
|
|
.get("tx") |
|
|
|
.chain_err(|| "block missing txids")? |
|
|
|
.as_array() |
|
|
|
.chain_err(|| "invalid block txids")? |
|
|
|
.iter() |
|
|
|
.map(parse_hash) |
|
|
|
.collect::<Result<Vec<Sha256dHash>>>() |
|
|
|
} |
|
|
|
|
|
|
|
pub fn getblocks(&self, blockhashes: &[Sha256dHash]) -> Result<Vec<Block>> { |
|
|
|
let params_list: Vec<Value> = blockhashes |
|
|
|
.iter() |
|
|
|
.map(|hash| json!([hash.be_hex_string(), /*verbose=*/ false])) |
|
|
|
.map(|hash| json!([hash.to_hex(), /*verbose=*/ false])) |
|
|
|
.collect(); |
|
|
|
let values = self.requests("getblock", ¶ms_list)?; |
|
|
|
let mut blocks = vec![]; |
|
|
@ -512,11 +509,9 @@ impl Daemon { |
|
|
|
txhash: &Sha256dHash, |
|
|
|
blockhash: Option<Sha256dHash>, |
|
|
|
) -> Result<Transaction> { |
|
|
|
let mut args = json!([txhash.be_hex_string(), /*verbose=*/ false]); |
|
|
|
let mut args = json!([txhash.to_hex(), /*verbose=*/ false]); |
|
|
|
if let Some(blockhash) = blockhash { |
|
|
|
args.as_array_mut() |
|
|
|
.unwrap() |
|
|
|
.push(json!(blockhash.be_hex_string())); |
|
|
|
args.as_array_mut().unwrap().push(json!(blockhash.to_hex())); |
|
|
|
} |
|
|
|
tx_from_value(self.request("getrawtransaction", args)?) |
|
|
|
} |
|
|
@ -527,11 +522,9 @@ impl Daemon { |
|
|
|
blockhash: Option<Sha256dHash>, |
|
|
|
verbose: bool, |
|
|
|
) -> Result<Value> { |
|
|
|
let mut args = json!([txhash.be_hex_string(), verbose]); |
|
|
|
let mut args = json!([txhash.to_hex(), verbose]); |
|
|
|
if let Some(blockhash) = blockhash { |
|
|
|
args.as_array_mut() |
|
|
|
.unwrap() |
|
|
|
.push(json!(blockhash.be_hex_string())); |
|
|
|
args.as_array_mut().unwrap().push(json!(blockhash.to_hex())); |
|
|
|
} |
|
|
|
Ok(self.request("getrawtransaction", args)?) |
|
|
|
} |
|
|
@ -539,7 +532,7 @@ impl Daemon { |
|
|
|
pub fn gettransactions(&self, txhashes: &[&Sha256dHash]) -> Result<Vec<Transaction>> { |
|
|
|
let params_list: Vec<Value> = txhashes |
|
|
|
.iter() |
|
|
|
.map(|txhash| json!([txhash.be_hex_string(), /*verbose=*/ false])) |
|
|
|
.map(|txhash| json!([txhash.to_hex(), /*verbose=*/ false])) |
|
|
|
.collect(); |
|
|
|
|
|
|
|
let values = self.requests("getrawtransaction", ¶ms_list)?; |
|
|
@ -561,7 +554,7 @@ impl Daemon { |
|
|
|
} |
|
|
|
|
|
|
|
pub fn getmempoolentry(&self, txid: &Sha256dHash) -> Result<MempoolEntry> { |
|
|
|
let entry = self.request("getmempoolentry", json!([txid.be_hex_string()]))?; |
|
|
|
let entry = self.request("getmempoolentry", json!([txid.to_hex()]))?; |
|
|
|
let fee = (entry |
|
|
|
.get("fee") |
|
|
|
.chain_err(|| "missing fee")? |
|
|
@ -586,7 +579,7 @@ impl Daemon { |
|
|
|
} |
|
|
|
|
|
|
|
fn get_all_headers(&self, tip: &Sha256dHash) -> Result<Vec<BlockHeader>> { |
|
|
|
let info: Value = self.request("getblockheader", json!([tip.be_hex_string()]))?; |
|
|
|
let info: Value = self.request("getblockheader", json!([tip.to_hex()]))?; |
|
|
|
let tip_height = info |
|
|
|
.get("height") |
|
|
|
.expect("missing height") |
|
|
|