use reqwest::{Client, StatusCode};
use bitcoin::consensus::{deserialize, serialize};
-use bitcoin::hashes::hex::ToHex;
+use bitcoin::hashes::hex::{FromHex, ToHex};
use bitcoin::hashes::{sha256, Hash};
-use bitcoin::{BlockHash, BlockHeader, Script, Transaction, TxMerkleNode, Txid};
+use bitcoin::{BlockHash, BlockHeader, Script, Transaction, Txid};
use self::utils::{ELSGetHistoryRes, ElectrumLikeSync};
use super::*;
let resp = self
.client
- .get(&format!("{}/block/{}", self.url, hash))
+ .get(&format!("{}/block/{}/header", self.url, hash))
.send()
.await?;
- let esplora_header = resp.json::<EsploraHeader>().await?;
+ let header = deserialize(&Vec::from_hex(&resp.text().await?)?)?;
- Ok(esplora_header.into())
+ Ok(header)
}
async fn _broadcast(&self, transaction: &Transaction) -> Result<(), EsploraError> {
status: EsploraGetHistoryStatus,
}
-/// `EsploraHeader` maps the json returned from esplora endpoint `GET /block/:hash`
-/// It will be removed when `GET /block/:hash/header` will be deployed
-#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
-struct EsploraHeader {
- id: String,
- height: u32,
- version: i32,
- timestamp: u32,
- tx_count: u32,
- size: u32,
- weight: u32,
- merkle_root: TxMerkleNode,
- previousblockhash: BlockHash,
- nonce: u32,
- bits: u32,
- difficulty: u32,
-}
-
-impl Into<BlockHeader> for EsploraHeader {
- fn into(self) -> BlockHeader {
- BlockHeader {
- version: self.version,
- prev_blockhash: self.previousblockhash,
- merkle_root: self.merkle_root,
- time: self.timestamp,
- bits: self.bits,
- nonce: self.nonce,
- }
- }
-}
-
/// Configuration for an [`EsploraBlockchain`]
#[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct EsploraBlockchainConfig {
Parsing(std::num::ParseIntError),
/// Invalid Bitcoin data returned
BitcoinEncoding(bitcoin::consensus::encode::Error),
+ /// Invalid Hex data returned
+ Hex(bitcoin::hashes::hex::Error),
/// Transaction not found
TransactionNotFound(Txid),
}
}
-#[cfg(test)]
-mod test {
- use crate::blockchain::esplora::EsploraHeader;
- use bitcoin::hashes::hex::FromHex;
- use bitcoin::{BlockHash, BlockHeader};
-
- #[test]
- fn test_esplora_header() {
- let json_str = r#"{"id":"00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206","height":1,"version":1,"timestamp":1296688928,"tx_count":1,"size":190,"weight":760,"merkle_root":"f0315ffc38709d70ad5647e22048358dd3745f3ce3874223c80a7c92fab0c8ba","previousblockhash":"000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943","nonce":1924588547,"bits":486604799,"difficulty":1}"#;
- let json: EsploraHeader = serde_json::from_str(&json_str).unwrap();
- let header: BlockHeader = json.into();
- assert_eq!(
- header.block_hash(),
- BlockHash::from_hex("00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206")
- .unwrap()
- );
+impl From<bitcoin::hashes::hex::Error> for EsploraError {
+ fn from(other: bitcoin::hashes::hex::Error) -> Self {
+ EsploraError::Hex(other)
}
}