bfdb399772
Brings in uncommitted work from SAMI-PC E:\repos\triangles
cpp20-modernization branch:
- RocksDB default chain DB + auto-migrate from txleveldb
- SQLite default wallet + non-destructive migration from Berkeley
- Boost.Asio removed from RPC (rpc_httpsocket.h)
- Boost removed from all daemon + GUI code
- New: walletdb-base.h, walletdb-batch.h, walletdb-sqlite.{h,cpp},
walletdb-factory.{h,cpp}, walletmigrate.{h,cpp}
- New tests: chaindb_runtime_tests, chaindb_equivalence_tests,
snapshotnet_tests
- Docs: BOOST-REMOVAL.md, ROCKSDB-DEFAULT-MIGRATION.md,
WALLET-SQLITE-MIGRATION.md
Does not yet build — needs CWalletDB->CWalletBatchTyped rebase in
walletdb.cpp/wallet.cpp/db.cpp and merge with origin/master for
v6 source files (checkpointpublisher, tor/, snapshot/, utxosnapshot,
bootstrap.cpp).
Build flags: -DBUILD_QT=OFF -DUSE_I2P_EMBEDDED=OFF
92 lines
4.7 KiB
Markdown
92 lines
4.7 KiB
Markdown
# Boost removal — progress
|
|
|
|
Goal: drop the Boost dependency in favor of C++17 std. No consensus or wire
|
|
behavior changes.
|
|
|
|
## Done
|
|
|
|
**Triangles' own code (daemon + GUI) is now completely Boost-free.** All nine
|
|
translation units that used Boost have been migrated. The only remaining Boost
|
|
usage in the tree is (1) the Boost.Test unit-test framework under `src/test/`,
|
|
and (2) Boost as a *transitive link dependency of the bundled embedded i2pd
|
|
router* (`libi2pd.a`) — not of any Triangles source. See "Remaining" below.
|
|
|
|
| File | Boost removed | Replacement |
|
|
|------|---------------|-------------|
|
|
| `txdb-leveldb.cpp` | `boost/version.hpp` (unused include) | deleted |
|
|
| `txdb-rocksdb.cpp` | `boost/version.hpp` (unused include) | deleted |
|
|
| `walletdb.cpp` | `boost/version.hpp` + `BOOST_VERSION` guard | unconditional `std::filesystem` branch |
|
|
| `util.cpp` | `boost::program_options` config-file parser + `to_internal` workaround | small C++17 INI parser in `ReadConfigFile` |
|
|
| `init.cpp` | `boost::interprocess::file_lock` + `using namespace boost` | portable `LockDataDirectory()` (`flock` POSIX / `LockFileEx` Win32) |
|
|
| `rpcdump.cpp` | `boost::posix_time` + `boost::gregorian` | `std::get_time` + `timegm`/`_mkgmtime` |
|
|
|
|
`wallet.cpp` and `triangles-cli.cpp` only ever *mentioned* Boost in comments —
|
|
no code change needed.
|
|
|
|
### Behavior notes for review
|
|
- **Config parser**: `name = value`; a line whose first non-whitespace char is
|
|
`#` is a comment; blank lines ignored; inline `#` is NOT a comment (so
|
|
`rpcpassword` may contain `#`). First value wins for single-valued settings;
|
|
`-name` keying and `nofoo=` negative-setting interpretation preserved.
|
|
- **File lock**: exclusive, non-blocking; the fd/handle is held for process
|
|
lifetime and released by the OS on exit (matches the old file_lock lifetime).
|
|
- **Dump time parser**: same five accepted formats, parsed as UTC.
|
|
|
|
### CMake note
|
|
`program_options` is no longer used by any source file and can be dropped from
|
|
the `find_package(Boost ... COMPONENTS ...)` list once the remaining two files
|
|
are migrated. It is left in place for now because removing it before the Asio
|
|
migration provides no benefit and the component is harmless if installed.
|
|
|
|
### RPC server (done — `trianglesrpc.cpp`)
|
|
|
|
The JSON-RPC/HTTP server previously used `boost::asio` (async sockets +
|
|
`boost::asio::ssl`), `boost::bind`, `boost::iostreams`,
|
|
`boost::shared_ptr`/`weak_ptr`, and `boost::system::error_code`. It was
|
|
rewritten onto **raw BSD sockets** behind a small `std::iostream`
|
|
(`src/rpc_httpsocket.h`), preserving the thread-per-connection model so the
|
|
HTTP parser, JSON-RPC dispatch, REST handler, and the blocking SSE handler are
|
|
all unchanged.
|
|
|
|
- New `src/rpc_httpsocket.h`: `CSocketIOStream` (a `std::iostream` over a
|
|
`SOCKET`), `ConnectRPCSocket()`, `BindRPCSockets()` (separate IPv4/IPv6
|
|
listeners, loopback unless `-rpcallowip`), `SockaddrToString()`.
|
|
- `ThreadRPCServer2` now binds sockets and runs a `select()`-based accept loop
|
|
that spawns `ThreadRPCServer3` per connection.
|
|
- `ClientAllowed` takes a numeric IP string.
|
|
- `CallRPC` connects via a raw socket.
|
|
- **`-rpcssl` is removed.** RPC TLS was a rarely used Asio::ssl feature; for
|
|
remote access, front the port with stunnel/nginx or reach it over SSH/Tor
|
|
(the same decision Bitcoin Core made). A warning is logged if `-rpcssl` is set.
|
|
|
|
### Qt URI handler (done — `qt/qtipcserver.cpp`)
|
|
|
|
The `triangles:` single-instance URI handoff used
|
|
`boost::interprocess::message_queue` + `boost::posix_time`. Rewritten onto
|
|
`QLocalServer` / `QLocalSocket` (QtNetwork), keeping the existing polling-thread
|
|
model via the blocking `waitForNewConnection` / `waitForReadyRead` /
|
|
`waitForConnected` methods (no Qt event loop required). `Qt5::Network` added to
|
|
the Qt find_package and the `triangles-qt` link.
|
|
|
|
### CMake
|
|
- `Boost::program_options`, `Boost::thread`, `Boost::chrono` removed from the
|
|
`triangles_common` link — Triangles' own objects reference no Boost symbols.
|
|
|
|
## Remaining
|
|
|
|
Two things still pull Boost into the build; neither is Triangles source:
|
|
|
|
1. **Embedded i2pd router.** When built with the embedded I2P router, the
|
|
bundled `libi2pd.a` / `libi2pdclient.a` link Boost
|
|
(`program_options`, `thread`, `chrono`, `filesystem`, `system`). The
|
|
i2pd-specific link block (and the top-level `find_package(Boost ...)`) are
|
|
therefore left intact. Fully dropping Boost from the build requires either a
|
|
Boost-free i2pd build or disabling the embedded router. This is an upstream
|
|
i2pd concern, not Triangles code.
|
|
|
|
2. **Unit tests.** `src/test/*` use the Boost.Test framework
|
|
(`Boost::unit_test_framework`). Optional follow-up: port to a header-only
|
|
framework (e.g. Catch2/doctest) to remove the last first-party Boost use.
|
|
|
|
When both are addressed, `find_package(Boost ...)` can be removed entirely.
|