Skip to content

Commit c0b48f2

Browse files
TheCharlatanjosibake
authored andcommitted
kernel: Process transactions
1 parent 7edb135 commit c0b48f2

File tree

4 files changed

+53
-2
lines changed

4 files changed

+53
-2
lines changed

src/kernel/bitcoinkernel.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,20 @@ bool kernel_chainstate_manager_process_block_header(const kernel_Context* contex
13671367
return chainman.ProcessNewBlockHeaders(headers, true, state);
13681368
}
13691369

1370+
bool kernel_chainstate_manager_process_transaction(
1371+
const kernel_Context* context,
1372+
kernel_ChainstateManager* chainman_,
1373+
kernel_Transaction* transaction_,
1374+
bool test_accept)
1375+
{
1376+
auto& chainman{*cast_chainstate_manager(chainman_)};
1377+
auto transaction{cast_transaction_ref(transaction_)};
1378+
1379+
MempoolAcceptResult res = WITH_LOCK(::cs_main, return chainman.ProcessTransaction(*transaction, test_accept));
1380+
1381+
return res.m_result_type == MempoolAcceptResult::ResultType::VALID;
1382+
}
1383+
13701384
bool kernel_chainstate_manager_process_block(
13711385
const kernel_Context* context_,
13721386
kernel_ChainstateManager* chainman_,

src/kernel/bitcoinkernel.h

+18
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,24 @@ bool BITCOINKERNEL_WARN_UNUSED_RESULT kernel_chainstate_manager_process_block_he
11401140
kernel_BlockHeader* header
11411141
) BITCOINKERNEL_ARG_NONNULL(1) BITCOINKERNEL_ARG_NONNULL(2) BITCOINKERNEL_ARG_NONNULL(3);
11421142

1143+
/**
1144+
* @brief Validates a single passed in transaction. Requires a mempool to have
1145+
* been configured previously for the chainstate manager through the chainstate
1146+
* load options.
1147+
*
1148+
* @param[in] context Non-null.
1149+
* @param[in] chainman Non-null.
1150+
* @param[in] transaction Non-null.
1151+
* @param[in] test_accept If true, will only check the transaction validity and will not submit it to the mempool.
1152+
* @return True if the transaction was successfully validated.
1153+
*/
1154+
bool kernel_chainstate_manager_process_transaction(
1155+
const kernel_Context* context,
1156+
kernel_ChainstateManager* chainman,
1157+
kernel_Transaction* transaction,
1158+
bool test_accept
1159+
) BITCOINKERNEL_ARG_NONNULL(1) BITCOINKERNEL_ARG_NONNULL(2) BITCOINKERNEL_ARG_NONNULL(3);
1160+
11431161
/**
11441162
* @brief Destroy the block index.
11451163
*/

src/kernel/bitcoinkernel_wrapper.h

+7
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,8 @@ class Transaction
524524
kernel_byte_array_destroy(serialized_transaction);
525525
return vec;
526526
}
527+
528+
friend class ChainMan;
527529
};
528530

529531
class Block
@@ -746,6 +748,11 @@ class ChainMan
746748
return kernel_chainstate_manager_process_block_header(m_context.m_context.get(), m_chainman, header.m_block_header.get());
747749
}
748750

751+
bool ProcessTransaction(Transaction& transaction, bool test_accept) const noexcept
752+
{
753+
return kernel_chainstate_manager_process_transaction(m_context.m_context.get(), m_chainman, transaction.m_transaction.get(), test_accept);
754+
}
755+
749756
bool ProcessBlock(Block& block, kernel_ProcessBlockStatus& status) const noexcept
750757
{
751758
return kernel_chainstate_manager_process_block(m_context.m_context.get(), m_chainman, block.m_block.get(), &status);

src/test/kernel/test_kernel.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -612,16 +612,28 @@ void chainman_regtest_validation_test()
612612
}
613613
}
614614

615+
// Validated the rest on a new chainman, but leave the last block.
615616
auto chainman{create_chainman(test_directory, false, false, false, false, context)};
616617

617-
for (size_t i{mid}; i < REGTEST_BLOCK_DATA.size(); i++) {
618+
for (size_t i{mid}; i < REGTEST_BLOCK_DATA.size() - 1; i++) {
618619
Block block{REGTEST_BLOCK_DATA[i]};
619620
assert(block);
620621
auto status{kernel_ProcessBlockStatus::kernel_PROCESS_BLOCK_OK};
621-
assert(chainman->ProcessBlock(block, status));
622+
chainman->ProcessBlock(block, status);
622623
assert(status == kernel_PROCESS_BLOCK_OK);
623624
}
624625

626+
Block block{REGTEST_BLOCK_DATA[REGTEST_BLOCK_DATA.size() - 1]};
627+
assert(block);
628+
for (size_t i{1}; i < block.GetNumberOfTransactions(); i++) {
629+
Transaction tx{block.GetTransaction(i)};
630+
assert(tx);
631+
assert(chainman->ProcessTransaction(tx, true));
632+
}
633+
auto status{kernel_ProcessBlockStatus::kernel_PROCESS_BLOCK_OK};
634+
chainman->ProcessBlock(block, status);
635+
assert(status == kernel_PROCESS_BLOCK_OK);
636+
625637
auto tip = chainman->GetBlockIndexFromTip();
626638
auto read_block = chainman->ReadBlock(tip).value();
627639
assert(read_block.GetBlockData() == REGTEST_BLOCK_DATA[REGTEST_BLOCK_DATA.size() - 1]);

0 commit comments

Comments
 (0)