read sapling commitment tree in getblocktemplate RPC
This commit is contained in:
parent
bc85459e15
commit
0680e9835b
|
@ -259,7 +259,7 @@ impl<'a> BlockAssembler<'a> {
|
|||
mempool: &MemoryPool,
|
||||
time: u32,
|
||||
consensus: &ConsensusParams,
|
||||
) -> BlockTemplate {
|
||||
) -> Result<BlockTemplate, String> {
|
||||
// get best block
|
||||
// take its hash && height
|
||||
let best_block = store.best_block();
|
||||
|
@ -272,7 +272,12 @@ impl<'a> BlockAssembler<'a> {
|
|||
let mut transactions = Vec::new();
|
||||
|
||||
let mempool_iter = mempool.iter(OrderingStrategy::ByTransactionScore);
|
||||
let mut sapling_tree = SaplingTreeState::new(); // TODO: read from database
|
||||
let mut sapling_tree = if previous_header_hash.is_zero() {
|
||||
SaplingTreeState::new()
|
||||
} else {
|
||||
store.as_tree_state_provider().sapling_tree_at_block(&previous_header_hash)
|
||||
.ok_or_else(|| format!("Sapling commitment tree for block {} is not found", previous_header_hash.reversed()))?
|
||||
};
|
||||
let tx_iter = FittingTransactionsIterator::new(
|
||||
store.as_transaction_output_provider(),
|
||||
mempool_iter,
|
||||
|
@ -330,7 +335,7 @@ impl<'a> BlockAssembler<'a> {
|
|||
});
|
||||
}
|
||||
|
||||
BlockTemplate {
|
||||
Ok(BlockTemplate {
|
||||
version: version,
|
||||
previous_header_hash: previous_header_hash,
|
||||
final_sapling_root_hash: sapling_tree.root(),
|
||||
|
@ -341,7 +346,7 @@ impl<'a> BlockAssembler<'a> {
|
|||
coinbase_tx: coinbase_tx.into(),
|
||||
size_limit: self.max_block_size,
|
||||
sigop_limit: self.max_block_sigops,
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -423,7 +428,7 @@ mod tests {
|
|||
miner_address: &"t1h8SqgtM3QM5e2M8EzhhT1yL2PXXtA6oqe".into(),
|
||||
max_block_size: 0xffffffff,
|
||||
max_block_sigops: 0xffffffff,
|
||||
}.create_new_block(&storage, &pool, 0, &consensus), hash0, hash1)
|
||||
}.create_new_block(&storage, &pool, 0, &consensus).unwrap(), hash0, hash1)
|
||||
}
|
||||
|
||||
// when topological consensus is used
|
||||
|
@ -451,7 +456,7 @@ mod tests {
|
|||
max_block_size: 0xffffffff,
|
||||
max_block_sigops: 0xffffffff,
|
||||
miner_address: &"t1h8SqgtM3QM5e2M8EzhhT1yL2PXXtA6oqe".into(),
|
||||
}.create_new_block(&storage, &pool, 0, &consensus);
|
||||
}.create_new_block(&storage, &pool, 0, &consensus).unwrap();
|
||||
|
||||
let expected_coinbase_value = consensus.block_reward(2) + expected_tx0_fee;
|
||||
assert_eq!(block.coinbase_tx.raw.total_spends(), expected_coinbase_value);
|
||||
|
|
|
@ -11,7 +11,7 @@ pub struct MinerClient<T: MinerClientCoreApi> {
|
|||
}
|
||||
|
||||
pub trait MinerClientCoreApi: Send + Sync + 'static {
|
||||
fn get_block_template(&self) -> Option<miner::BlockTemplate>;
|
||||
fn get_block_template(&self) -> Result<miner::BlockTemplate, String>;
|
||||
}
|
||||
|
||||
pub struct MinerClientCore {
|
||||
|
@ -29,9 +29,10 @@ impl MinerClientCore {
|
|||
}
|
||||
|
||||
impl MinerClientCoreApi for MinerClientCore {
|
||||
fn get_block_template(&self) -> Option<miner::BlockTemplate> {
|
||||
fn get_block_template(&self) -> Result<miner::BlockTemplate, String> {
|
||||
self.miner_address.as_ref()
|
||||
.map(|miner_address| self.local_sync_node.get_block_template(miner_address))
|
||||
.ok_or_else(|| "miner address not set".into())
|
||||
.and_then(|miner_address| self.local_sync_node.get_block_template(miner_address))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,7 +48,7 @@ impl<T> Miner for MinerClient<T> where T: MinerClientCoreApi {
|
|||
fn get_block_template(&self, _request: BlockTemplateRequest) -> Result<BlockTemplate, Error> {
|
||||
self.core.get_block_template()
|
||||
.map(Into::into)
|
||||
.ok_or_else(|| execution("miner address not set"))
|
||||
.map_err(|err| execution(&err))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,9 +65,9 @@ pub mod tests {
|
|||
struct SuccessMinerClientCore;
|
||||
|
||||
impl MinerClientCoreApi for SuccessMinerClientCore {
|
||||
fn get_block_template(&self) -> Option<miner::BlockTemplate> {
|
||||
fn get_block_template(&self) -> Result<miner::BlockTemplate, String> {
|
||||
let tx: chain::Transaction = "00000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a0000000000000000000101000000000000000000000000".into();
|
||||
Some(miner::BlockTemplate {
|
||||
Ok(miner::BlockTemplate {
|
||||
version: 777,
|
||||
previous_header_hash: H256::from(1),
|
||||
final_sapling_root_hash: H256::from(2),
|
||||
|
|
|
@ -229,7 +229,7 @@ impl<T, U, V> LocalNode<T, U, V> where T: TaskExecutor, U: Server, V: Client {
|
|||
}
|
||||
|
||||
/// Get block template for mining
|
||||
pub fn get_block_template(&self, miner_address: &Address) -> BlockTemplate {
|
||||
pub fn get_block_template(&self, miner_address: &Address) -> Result<BlockTemplate, String> {
|
||||
let max_block_size = self.consensus.max_block_size();
|
||||
let max_block_sigops = self.consensus.max_block_sigops();
|
||||
let block_assembler = BlockAssembler {
|
||||
|
|
Loading…
Reference in New Issue