read sapling commitment tree in getblocktemplate RPC

This commit is contained in:
Svyatoslav Nikolsky 2019-03-05 15:12:51 +03:00
parent bc85459e15
commit 0680e9835b
3 changed files with 19 additions and 13 deletions

View File

@ -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);

View File

@ -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),

View File

@ -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 {