mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-02 01:11:09 +03:00
add flag 'no_merkle_proof' to /v1/blocks
api to get blocks without checking merkle proof (#2843)
This commit is contained in:
parent
e345405201
commit
2cb37913ba
4 changed files with 23 additions and 7 deletions
|
@ -79,15 +79,18 @@ impl Handler for HeaderHandler {
|
||||||
///
|
///
|
||||||
/// Optionally return results as "compact blocks" by passing "?compact" query
|
/// Optionally return results as "compact blocks" by passing "?compact" query
|
||||||
/// param GET /v1/blocks/<hash>?compact
|
/// param GET /v1/blocks/<hash>?compact
|
||||||
|
///
|
||||||
|
/// Optionally turn off the Merkle proof extraction by passing "?no_merkle_proof" query
|
||||||
|
/// param GET /v1/blocks/<hash>?no_merkle_proof
|
||||||
pub struct BlockHandler {
|
pub struct BlockHandler {
|
||||||
pub chain: Weak<chain::Chain>,
|
pub chain: Weak<chain::Chain>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BlockHandler {
|
impl BlockHandler {
|
||||||
fn get_block(&self, h: &Hash) -> Result<BlockPrintable, Error> {
|
fn get_block(&self, h: &Hash, include_merkle_proof: bool) -> Result<BlockPrintable, Error> {
|
||||||
let chain = w(&self.chain)?;
|
let chain = w(&self.chain)?;
|
||||||
let block = chain.get_block(h).context(ErrorKind::NotFound)?;
|
let block = chain.get_block(h).context(ErrorKind::NotFound)?;
|
||||||
BlockPrintable::from_block(&block, chain, false)
|
BlockPrintable::from_block(&block, chain, false, include_merkle_proof)
|
||||||
.map_err(|_| ErrorKind::Internal("chain error".to_owned()).into())
|
.map_err(|_| ErrorKind::Internal("chain error".to_owned()).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +144,8 @@ impl Handler for BlockHandler {
|
||||||
if let Some(param) = req.uri().query() {
|
if let Some(param) = req.uri().query() {
|
||||||
if param == "compact" {
|
if param == "compact" {
|
||||||
result_to_response(self.get_compact_block(&h))
|
result_to_response(self.get_compact_block(&h))
|
||||||
|
} else if param == "no_merkle_proof" {
|
||||||
|
result_to_response(self.get_block(&h, false))
|
||||||
} else {
|
} else {
|
||||||
response(
|
response(
|
||||||
StatusCode::BAD_REQUEST,
|
StatusCode::BAD_REQUEST,
|
||||||
|
@ -148,7 +153,7 @@ impl Handler for BlockHandler {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result_to_response(self.get_block(&h))
|
result_to_response(self.get_block(&h, true))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,13 @@ impl OutputHandler {
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|output| commitments.is_empty() || commitments.contains(&output.commit))
|
.filter(|output| commitments.is_empty() || commitments.contains(&output.commit))
|
||||||
.map(|output| {
|
.map(|output| {
|
||||||
OutputPrintable::from_output(output, chain.clone(), Some(&header), include_proof)
|
OutputPrintable::from_output(
|
||||||
|
output,
|
||||||
|
chain.clone(),
|
||||||
|
Some(&header),
|
||||||
|
include_proof,
|
||||||
|
true,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
.context(ErrorKind::Internal("cain error".to_owned()))?;
|
.context(ErrorKind::Internal("cain error".to_owned()))?;
|
||||||
|
|
|
@ -83,7 +83,7 @@ impl TxHashSetHandler {
|
||||||
outputs: outputs
|
outputs: outputs
|
||||||
.2
|
.2
|
||||||
.iter()
|
.iter()
|
||||||
.map(|x| OutputPrintable::from_output(x, chain.clone(), None, true))
|
.map(|x| OutputPrintable::from_output(x, chain.clone(), None, true, true))
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
.context(ErrorKind::Internal("cain error".to_owned()))?,
|
.context(ErrorKind::Internal("cain error".to_owned()))?,
|
||||||
};
|
};
|
||||||
|
|
|
@ -257,6 +257,7 @@ impl OutputPrintable {
|
||||||
chain: Arc<chain::Chain>,
|
chain: Arc<chain::Chain>,
|
||||||
block_header: Option<&core::BlockHeader>,
|
block_header: Option<&core::BlockHeader>,
|
||||||
include_proof: bool,
|
include_proof: bool,
|
||||||
|
include_merkle_proof: bool,
|
||||||
) -> Result<OutputPrintable, chain::Error> {
|
) -> Result<OutputPrintable, chain::Error> {
|
||||||
let output_type = if output.is_coinbase() {
|
let output_type = if output.is_coinbase() {
|
||||||
OutputType::Coinbase
|
OutputType::Coinbase
|
||||||
|
@ -282,7 +283,7 @@ impl OutputPrintable {
|
||||||
// We require the rewind() to be stable even after the PMMR is pruned and
|
// We require the rewind() to be stable even after the PMMR is pruned and
|
||||||
// compacted so we can still recreate the necessary proof.
|
// compacted so we can still recreate the necessary proof.
|
||||||
let mut merkle_proof = None;
|
let mut merkle_proof = None;
|
||||||
if output.is_coinbase() && !spent {
|
if include_merkle_proof && output.is_coinbase() && !spent {
|
||||||
if let Some(block_header) = block_header {
|
if let Some(block_header) = block_header {
|
||||||
merkle_proof = chain.get_merkle_proof(&out_id, &block_header).ok();
|
merkle_proof = chain.get_merkle_proof(&out_id, &block_header).ok();
|
||||||
}
|
}
|
||||||
|
@ -583,6 +584,7 @@ impl BlockPrintable {
|
||||||
block: &core::Block,
|
block: &core::Block,
|
||||||
chain: Arc<chain::Chain>,
|
chain: Arc<chain::Chain>,
|
||||||
include_proof: bool,
|
include_proof: bool,
|
||||||
|
include_merkle_proof: bool,
|
||||||
) -> Result<BlockPrintable, chain::Error> {
|
) -> Result<BlockPrintable, chain::Error> {
|
||||||
let inputs = block
|
let inputs = block
|
||||||
.inputs()
|
.inputs()
|
||||||
|
@ -598,6 +600,7 @@ impl BlockPrintable {
|
||||||
chain.clone(),
|
chain.clone(),
|
||||||
Some(&block.header),
|
Some(&block.header),
|
||||||
include_proof,
|
include_proof,
|
||||||
|
include_merkle_proof,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
@ -639,7 +642,9 @@ impl CompactBlockPrintable {
|
||||||
let out_full = cb
|
let out_full = cb
|
||||||
.out_full()
|
.out_full()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|x| OutputPrintable::from_output(x, chain.clone(), Some(&block.header), false))
|
.map(|x| {
|
||||||
|
OutputPrintable::from_output(x, chain.clone(), Some(&block.header), false, true)
|
||||||
|
})
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
let kern_full = cb
|
let kern_full = cb
|
||||||
.kern_full()
|
.kern_full()
|
||||||
|
|
Loading…
Reference in a new issue