|
|
|
@ -700,13 +700,15 @@ bool SideChain::get_outputs_blob(PoolBlock* block, uint64_t total_reward, std::v
|
|
|
|
|
blob.reserve(n * 39 + 64);
|
|
|
|
|
writeVarint(n, blob);
|
|
|
|
|
|
|
|
|
|
const uint8_t tx_type = b->get_tx_type();
|
|
|
|
|
|
|
|
|
|
for (const PoolBlock::TxOutput& output : b->m_outputs) {
|
|
|
|
|
writeVarint(output.m_reward, blob);
|
|
|
|
|
blob.emplace_back(output.m_txType);
|
|
|
|
|
blob.emplace_back(tx_type);
|
|
|
|
|
blob.insert(blob.end(), output.m_ephPublicKey.h, output.m_ephPublicKey.h + HASH_SIZE);
|
|
|
|
|
|
|
|
|
|
if (output.m_txType == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
blob.emplace_back(output.m_viewTag);
|
|
|
|
|
if (tx_type == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
blob.emplace_back(static_cast<uint8_t>(output.m_viewTag));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -812,9 +814,11 @@ bool SideChain::get_outputs_blob(PoolBlock* block, uint64_t total_reward, std::v
|
|
|
|
|
blob.emplace_back(view_tag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
block->m_outputs.emplace_back(tmpRewards[i], eph_public_key, tx_type, view_tag);
|
|
|
|
|
block->m_outputs.emplace_back(tmpRewards[i], eph_public_key, view_tag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
block->m_outputs.shrink_to_fit();
|
|
|
|
|
|
|
|
|
|
if (loop) {
|
|
|
|
|
// this will cause all helper jobs to finish immediately
|
|
|
|
|
counter = -1;
|
|
|
|
@ -915,12 +919,13 @@ void SideChain::print_status(bool obtain_sidechain_lock) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Wallet& w = m_pool->params().m_wallet;
|
|
|
|
|
const uint8_t tx_type = tip->get_tx_type();
|
|
|
|
|
|
|
|
|
|
hash eph_public_key;
|
|
|
|
|
for (size_t i = 0, n = tip->m_outputs.size(); i < n; ++i) {
|
|
|
|
|
const PoolBlock::TxOutput& out = tip->m_outputs[i];
|
|
|
|
|
if (!your_reward) {
|
|
|
|
|
if (out.m_txType == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
if (tx_type == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
if (w.get_eph_public_key_with_view_tag(tip->m_txkeySec, i, eph_public_key, out.m_viewTag) && (out.m_ephPublicKey == eph_public_key)) {
|
|
|
|
|
your_reward = out.m_reward;
|
|
|
|
|
}
|
|
|
|
@ -987,11 +992,12 @@ double SideChain::get_reward_share(const Wallet& w) const
|
|
|
|
|
|
|
|
|
|
const PoolBlock* tip = m_chainTip;
|
|
|
|
|
if (tip) {
|
|
|
|
|
const uint8_t tx_type = tip->get_tx_type();
|
|
|
|
|
hash eph_public_key;
|
|
|
|
|
for (size_t i = 0, n = tip->m_outputs.size(); i < n; ++i) {
|
|
|
|
|
const PoolBlock::TxOutput& out = tip->m_outputs[i];
|
|
|
|
|
if (!reward) {
|
|
|
|
|
if (out.m_txType == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
if (tx_type == TXOUT_TO_TAGGED_KEY) {
|
|
|
|
|
if (w.get_eph_public_key_with_view_tag(tip->m_txkeySec, i, eph_public_key, out.m_viewTag) && (out.m_ephPublicKey == eph_public_key)) {
|
|
|
|
|
reward = out.m_reward;
|
|
|
|
|
}
|
|
|
|
@ -1542,6 +1548,8 @@ void SideChain::verify(PoolBlock* block)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const uint8_t tx_type = block->get_tx_type();
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0, n = rewards.size(); i < n; ++i) {
|
|
|
|
|
const PoolBlock::TxOutput& out = block->m_outputs[i];
|
|
|
|
|
|
|
|
|
@ -1565,7 +1573,7 @@ void SideChain::verify(PoolBlock* block)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((out.m_txType == TXOUT_TO_TAGGED_KEY) && (out.m_viewTag != view_tag)) {
|
|
|
|
|
if ((tx_type == TXOUT_TO_TAGGED_KEY) && (out.m_viewTag != view_tag)) {
|
|
|
|
|
LOGWARN(3, "block at height = " << block->m_sidechainHeight <<
|
|
|
|
|
", id = " << block->m_sidechainId <<
|
|
|
|
|
", mainchain height = " << block->m_txinGenHeight <<
|
|
|
|
|