libbitcoinkernel
The libbitcoinkernel project seeks to modularise Bitcoin Cores' consensus engine and make it easier for developers to reason about when they are modifying code which could be consensus-critical.
This project differs from libbitcoinconsensus
in that it is designed to be a stateful engine, with a view to eventually: being able to spawn its own threads, do caching (e.g. of script and signature verification), do its own I/O, and manage dynamic objects like a mempool. Another benefit of fully extracting the consensus engine in this way may be that it becomes easier to write and reason about consensus test cases.
In the future, if a full de-coupling is successfully completed, other Bitcoin applications might be able to use libbitcoinkernel
as their own consensus engine permitting multiple full node implementations to operate on the network in a somewhat safer manner than many of them operate under today. The initial objective of this library however is to actually have it used by Bitcoin Core internally, something which is not possible with libbitcoinconsensus due to it’s lack of caching and state (making it too slow to use).
Some examples have surfaced recently where script validation in the BTCD code (used internally by LND) has diverged from the results from Bitcoin Core:
-
Witness size check: issue and fix
-
Max witness items check: issue and fix.
The implementation approaches of libbitcoinconsensus and libbitcoinkernel also differ; with lb-consensus parts of consensus were moved into the library piece by piece, with the eventual goal that it would be encapsulated. lb-kernel takes a different approach — first cast a super wide net around everything needed to run a consensus engine, and then gradually strip pieces out where they can be. In theory this should get us something which Bitcoin Core can use much faster (in fact, you can build the optional bitcoin-chainstate
binary which already has some functionality).
Part of libbitcoinkernel has been merged in via Carl Dong’s bitcoin-chainstate
PR. It also has its own project board to track progress.
libbitcoinconsensus
The libbitcoinconsensus library has been deprecated since Bitcoin Core v27.0, with the Release Note:
libbitcoinconsensus is deprecated and will be removed for v28. This library has existed for nearly 10 years with very little known uptake or impact. It has become a maintenance burden.
The underlying functionality does not change between versions, so any users of the library can continue to use the final release indefinitely, with the understanding that Taproot is its final consensus update.
In the future, libbitcoinkernel will provide a much more useful API that is aware of the UTXO set, and therefore be able to fully validate transactions and blocks. (#29189)