mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-14 17:48:01 +02:00
Merge bitcoin/bitcoin#34846: kernel: Add API getter functions for timelock fields (nLockTime, nSequence)
9f28120a5bkernel: Add API function for getting a tx input's nSequence (Sebastian Falbesoner)6b64b181d5kernel: Add API function for getting a tx's nLockTime (Sebastian Falbesoner) Pull request description: This PR introduces two new C API functions to libbitcoinkernel: * `btck_transaction_get_locktime` to access a transaction's `nLockTime` value * `btck_transaction_input_get_sequence` to access a transaction input's `nSequence` value Inspired by https://bnoc.xyz/t/forward-compatible-coinbase-locktimes-for-bip-54. After reading this I thought it would be a nice/useful showcase to check BIP54 compliance of (historical) blocks using bitcoinkernel, without having to manually deserialize the transaction (this is just about one of the four BIP54 rules though, especially the sigops limit is much more involved). ACKs for top commit: sedited: ACK9f28120a5byuvicc: ACK9f28120a5bstickies-v: ACK9f28120a5bTree-SHA512: 9eae795d6e4b9b367bbfe2665b916121ef64031e8d10667c71741344b5eea4c2562862a937bdf1363cc66b67bb5d48392c9f44e52f0d92d2a5a65e10d061b703
This commit is contained in:
@@ -533,6 +533,11 @@ const btck_TransactionInput* btck_transaction_get_input_at(const btck_Transactio
|
||||
return btck_TransactionInput::ref(&btck_Transaction::get(transaction)->vin[input_index]);
|
||||
}
|
||||
|
||||
uint32_t btck_transaction_get_locktime(const btck_Transaction* transaction)
|
||||
{
|
||||
return btck_Transaction::get(transaction)->nLockTime;
|
||||
}
|
||||
|
||||
const btck_Txid* btck_transaction_get_txid(const btck_Transaction* transaction)
|
||||
{
|
||||
return btck_Txid::ref(&btck_Transaction::get(transaction)->GetHash());
|
||||
@@ -692,6 +697,11 @@ const btck_TransactionOutPoint* btck_transaction_input_get_out_point(const btck_
|
||||
return btck_TransactionOutPoint::ref(&btck_TransactionInput::get(input).prevout);
|
||||
}
|
||||
|
||||
uint32_t btck_transaction_input_get_sequence(const btck_TransactionInput* input)
|
||||
{
|
||||
return btck_TransactionInput::get(input).nSequence;
|
||||
}
|
||||
|
||||
void btck_transaction_input_destroy(btck_TransactionInput* input)
|
||||
{
|
||||
delete input;
|
||||
|
||||
@@ -576,6 +576,15 @@ BITCOINKERNEL_API const btck_TransactionInput* BITCOINKERNEL_WARN_UNUSED_RESULT
|
||||
BITCOINKERNEL_API size_t BITCOINKERNEL_WARN_UNUSED_RESULT btck_transaction_count_inputs(
|
||||
const btck_Transaction* transaction) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
|
||||
/**
|
||||
* @brief Get a transaction's nLockTime value.
|
||||
*
|
||||
* @param[in] transaction Non-null.
|
||||
* @return The nLockTime value.
|
||||
*/
|
||||
BITCOINKERNEL_API uint32_t BITCOINKERNEL_WARN_UNUSED_RESULT btck_transaction_get_locktime(
|
||||
const btck_Transaction* transaction) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
|
||||
/**
|
||||
* @brief Get the txid of a transaction. The returned txid is not owned and
|
||||
* depends on the lifetime of the transaction.
|
||||
@@ -1505,6 +1514,15 @@ BITCOINKERNEL_API btck_TransactionInput* BITCOINKERNEL_WARN_UNUSED_RESULT btck_t
|
||||
BITCOINKERNEL_API const btck_TransactionOutPoint* BITCOINKERNEL_WARN_UNUSED_RESULT btck_transaction_input_get_out_point(
|
||||
const btck_TransactionInput* transaction_input) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
|
||||
/**
|
||||
* @brief Get a transaction input's nSequence value.
|
||||
*
|
||||
* @param[in] transaction_input Non-null.
|
||||
* @return The nSequence value.
|
||||
*/
|
||||
BITCOINKERNEL_API uint32_t BITCOINKERNEL_WARN_UNUSED_RESULT btck_transaction_input_get_sequence(
|
||||
const btck_TransactionInput* transaction_input) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
|
||||
/**
|
||||
* Destroy the transaction input.
|
||||
*/
|
||||
|
||||
@@ -551,6 +551,11 @@ public:
|
||||
{
|
||||
return OutPointView{btck_transaction_input_get_out_point(impl())};
|
||||
}
|
||||
|
||||
uint32_t GetSequence() const
|
||||
{
|
||||
return btck_transaction_input_get_sequence(impl());
|
||||
}
|
||||
};
|
||||
|
||||
class TransactionInputView : public View<btck_TransactionInput>, public TransactionInputApi<TransactionInputView>
|
||||
@@ -596,6 +601,11 @@ public:
|
||||
return TransactionInputView{btck_transaction_get_input_at(impl(), index)};
|
||||
}
|
||||
|
||||
uint32_t GetLocktime() const
|
||||
{
|
||||
return btck_transaction_get_locktime(impl());
|
||||
}
|
||||
|
||||
TxidView Txid() const
|
||||
{
|
||||
return TxidView{btck_transaction_get_txid(impl())};
|
||||
|
||||
@@ -401,8 +401,11 @@ BOOST_AUTO_TEST_CASE(btck_transaction_tests)
|
||||
|
||||
BOOST_CHECK_EQUAL(tx.CountOutputs(), 2);
|
||||
BOOST_CHECK_EQUAL(tx.CountInputs(), 1);
|
||||
BOOST_CHECK_EQUAL(tx.GetLocktime(), 510826);
|
||||
auto broken_tx_data{std::span<std::byte>{tx_data.begin(), tx_data.begin() + 10}};
|
||||
BOOST_CHECK_THROW(Transaction{broken_tx_data}, std::runtime_error);
|
||||
auto input{tx.GetInput(0)};
|
||||
BOOST_CHECK_EQUAL(input.GetSequence(), 0xfffffffe);
|
||||
auto output{tx.GetOutput(tx.CountOutputs() - 1)};
|
||||
BOOST_CHECK_EQUAL(output.Amount(), 42130042);
|
||||
auto script_pubkey{output.GetScriptPubkey()};
|
||||
|
||||
Reference in New Issue
Block a user