From badc3a5f86b76a33a8f4ef809dc22df03bfad2e1 Mon Sep 17 00:00:00 2001 From: TheCharlatan Date: Wed, 1 Feb 2023 17:04:26 +0100 Subject: [PATCH] Kernel: Implement PoC FFI --- .gitignore | 2 + Makefile.am | 1 + configure.ac | 4 + libbitcoinkernel.pc.in | 10 + src/Makefile.am | 14 +- src/bitcoin-chainstate-wrapper.cpp | 520 +++++++++++++++++++++++++++++ src/bitcoin-chainstate.c | 112 +++++++ src/bitcoinkernel.h | 106 ++++++ src/validation.h | 2 + 9 files changed, 770 insertions(+), 1 deletion(-) create mode 100644 libbitcoinkernel.pc.in create mode 100644 src/bitcoin-chainstate-wrapper.cpp create mode 100644 src/bitcoin-chainstate.c create mode 100644 src/bitcoinkernel.h diff --git a/.gitignore b/.gitignore index c77303f50e2ee9..a8062d755f9dca 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ src/bitcoin-node src/bitcoin-tx src/bitcoin-util src/bitcoin-chainstate +src/bitcoin-chainstate_c src/bitcoin-wallet src/test/fuzz/fuzz src/test/test_bitcoin @@ -136,6 +137,7 @@ test/.mypy_cache/ /doc/doxygen/ libbitcoinconsensus.pc +libbitcoinkernel.pc contrib/devtools/split-debug.sh # Output from running db4 installation diff --git a/Makefile.am b/Makefile.am index c50421dfc339ea..09588422ccbfcb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -17,6 +17,7 @@ endif if BUILD_BITCOIN_LIBS pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libbitcoinconsensus.pc +pkgconfig_DATA += libbitcoinkernel.pc endif BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) diff --git a/configure.ac b/configure.ac index 1b5dc32b046be4..1a6154c5ca268a 100644 --- a/configure.ac +++ b/configure.ac @@ -1680,6 +1680,10 @@ fi AM_CONDITIONAL([BUILD_BITCOIN_KERNEL_LIB], [test "$build_experimental_kernel_lib" != "no" && ( test "$build_experimental_kernel_lib" = "yes" || test "$build_bitcoin_chainstate" = "yes" )]) +if test "$build_bitcoin_kernel_lib" = "yes"; then + AC_CONFIG_FILES([libbitcoinkernel.pc:libbitcoinkernel.pc.in]) +fi + AC_MSG_RESULT($build_bitcoin_libs) AC_LANG_POP diff --git a/libbitcoinkernel.pc.in b/libbitcoinkernel.pc.in new file mode 100644 index 00000000000000..13e0dd5df9fc3e --- /dev/null +++ b/libbitcoinkernel.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ kernel library +Description: Library for the Bitcoin chain validation. +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lbitcoinkernel +Cflags: -I${includedir} diff --git a/src/Makefile.am b/src/Makefile.am index be2bb0f318bc4e..cef3a6ea48b9d3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,6 +15,7 @@ AM_LIBTOOLFLAGS = --preserve-dup-deps PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) EXTRA_LIBRARIES = +include_HEADERS = lib_LTLIBRARIES = noinst_LTLIBRARIES = @@ -112,6 +113,7 @@ endif if BUILD_BITCOIN_CHAINSTATE bin_PROGRAMS += bitcoin-chainstate + bin_PROGRAMS += bitcoin-chainstate_c endif .PHONY: FORCE check-symbols check-security @@ -126,6 +128,7 @@ BITCOIN_CORE_H = \ base58.h \ bech32.h \ bip324.h \ + bitcoinkernel.h \ blockencodings.h \ blockfilter.h \ chain.h \ @@ -892,6 +895,13 @@ bitcoin_util_LDADD = \ $(LIBSECP256K1) # +# bitcoin-chainstate C binary # +bitcoin_chainstate_c_SOURCES = bitcoin-chainstate.c +bitcoin_chainstate_c_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) +bitcoin_chainstate_c_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) +bitcoin_chainstate_c_LDFLAGS = $(RELDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(AM_LDFLAGS) $(PTHREAD_FLAGS) +bitcoin_chainstate_c_LDADD = $(LIBBITCOINKERNEL) + # bitcoin-chainstate binary # bitcoin_chainstate_SOURCES = bitcoin-chainstate.cpp bitcoin_chainstate_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) @@ -908,6 +918,7 @@ bitcoin_chainstate_LDADD += $(LIBSECP256K1) # bitcoinkernel library # if BUILD_BITCOIN_KERNEL_LIB lib_LTLIBRARIES += $(LIBBITCOINKERNEL) +include_HEADERS += bitcoinkernel.h libbitcoinkernel_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) $(PTHREAD_FLAGS) libbitcoinkernel_la_LIBADD = $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) $(LIBMEMENV) $(LIBSECP256K1) @@ -949,6 +960,7 @@ libbitcoinkernel_la_SOURCES = \ kernel/disconnected_transactions.cpp \ kernel/mempool_persist.cpp \ kernel/mempool_removal_reason.cpp \ + bitcoin-chainstate-wrapper.cpp \ key.cpp \ logging.cpp \ node/blockstorage.cpp \ @@ -1011,7 +1023,7 @@ endif # BUILD_BITCOIN_KERNEL_LIB if BUILD_BITCOIN_LIBS lib_LTLIBRARIES += $(LIBBITCOINCONSENSUS) -include_HEADERS = script/bitcoinconsensus.h +include_HEADERS += script/bitcoinconsensus.h libbitcoinconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_base_la_SOURCES) $(libbitcoin_consensus_a_SOURCES) libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) diff --git a/src/bitcoin-chainstate-wrapper.cpp b/src/bitcoin-chainstate-wrapper.cpp new file mode 100644 index 00000000000000..bddcfb92e37749 --- /dev/null +++ b/src/bitcoin-chainstate-wrapper.cpp @@ -0,0 +1,520 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include