bitcoin/doc/shared-libraries.md
Cory Fields 25dc87e6f8 libconsensus: deprecate
This library has existed for nearly 10 years with very little known uptake or
impact. It has become a maintenance burden. In several cases it dictates our
code/library structure (for example necessitating LIBBITCOIN_CRYPTO_BASE), as
well as build-system procedures (building multiple copies of object files
especially for the lib).

Several discussions have arisen wrt migrating it to CMake and it has become
difficult to justify adding more complexity for a library that is virtually
unused anyway.

See for example the discussions:
https://github.com/hebasto/bitcoin/pull/41
https://github.com/bitcoin/bitcoin/pull/29123

Instead, we (fanquake, hebasto, TheCharlatan, and I) propose simply not
migrating it to CMake and letting it end with v27. Any remaining use-cases
could be handled in the future by libbitcoinkernel.
2024-01-30 23:19:02 +00:00

5.7 KiB

Shared Libraries

bitcoinconsensus

This library is deprecated and will be removed in v28

The purpose of this library is to make the verification functionality that is critical to Bitcoin's consensus available to other applications, e.g. to language bindings.

API

The interface is defined in the C header bitcoinconsensus.h located in src/script/bitcoinconsensus.h.

Version

bitcoinconsensus_version returns an unsigned int with the API version (currently 2).

Script Validation

bitcoinconsensus_verify_script, bitcoinconsensus_verify_script_with_amount and bitcoinconsensus_verify_script_with_spent_outputs return an int with the status of the verification. It will be 1 if the input script correctly spends the previous output scriptPubKey.

Parameters
bitcoinconsensus_verify_script
  • const unsigned char *scriptPubKey - The previous output script that encumbers spending.
  • unsigned int scriptPubKeyLen - The number of bytes for the scriptPubKey.
  • const unsigned char *txTo - The transaction with the input that is spending the previous output.
  • unsigned int txToLen - The number of bytes for the txTo.
  • unsigned int nIn - The index of the input in txTo that spends the scriptPubKey.
  • unsigned int flags - The script validation flags (see below).
  • bitcoinconsensus_error* err - Will have the error/success code for the operation (see below).
bitcoinconsensus_verify_script_with_amount
  • const unsigned char *scriptPubKey - The previous output script that encumbers spending.
  • unsigned int scriptPubKeyLen - The number of bytes for the scriptPubKey.
  • int64_t amount - The amount spent in the input
  • const unsigned char *txTo - The transaction with the input that is spending the previous output.
  • unsigned int txToLen - The number of bytes for the txTo.
  • unsigned int nIn - The index of the input in txTo that spends the scriptPubKey.
  • unsigned int flags - The script validation flags (see below).
  • bitcoinconsensus_error* err - Will have the error/success code for the operation (see below).
bitcoinconsensus_verify_script_with_spent_outputs
  • const unsigned char *scriptPubKey - The previous output script that encumbers spending.
  • unsigned int scriptPubKeyLen - The number of bytes for the scriptPubKey.
  • int64_t amount - The amount spent in the input
  • const unsigned char *txTo - The transaction with the input that is spending the previous output.
  • unsigned int txToLen - The number of bytes for the txTo.
  • UTXO *spentOutputs - Previous outputs spent in the transaction. UTXO is a struct composed by const unsigned char *scriptPubKey, unsigned int scriptPubKeySize (the number of bytes for the scriptPubKey) and unsigned int value.
  • unsigned int spentOutputsLen - The number of bytes for the spentOutputs.
  • unsigned int nIn - The index of the input in txTo that spends the scriptPubKey.
  • unsigned int flags - The script validation flags (see below).
  • bitcoinconsensus_error* err - Will have the error/success code for the operation (see below).
Script Flags
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH - Evaluate P2SH (BIP16) subscripts
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG - Enforce strict DER (BIP66) compliance
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NULLDUMMY - Enforce NULLDUMMY (BIP147)
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY - Enable CHECKLOCKTIMEVERIFY (BIP65)
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKSEQUENCEVERIFY - Enable CHECKSEQUENCEVERIFY (BIP112)
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS - Enable WITNESS (BIP141)
  • bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT - Enable TAPROOT (BIP340, BIP341, BIP342)
Errors
  • bitcoinconsensus_ERR_OK - No errors with input parameters (see the return value of bitcoinconsensus_verify_script for the verification status)
  • bitcoinconsensus_ERR_TX_INDEX - An invalid index for txTo
  • bitcoinconsensus_ERR_TX_SIZE_MISMATCH - txToLen did not match with the size of txTo
  • bitcoinconsensus_ERR_DESERIALIZE - An error deserializing txTo
  • bitcoinconsensus_ERR_AMOUNT_REQUIRED - Input amount is required if WITNESS is used
  • bitcoinconsensus_ERR_INVALID_FLAGS - Script verification flags are invalid (i.e. not part of the libconsensus interface)
  • bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED - Spent outputs are required if TAPROOT is used
  • bitcoinconsensus_ERR_SPENT_OUTPUTS_MISMATCH - Spent outputs size doesn't match tx inputs size

Example Implementations