Plumb is Bitcoin Knots plus the spam-policy filters the Plumb maintainers
have reviewed and ACKed, whether they were opened against Knots or here, and
whether or not Knots merges them. Each release is one Knots release plus
those merges and one default of its own: -datacarriersize starts at 42
bytes, where Knots has started at 83 since v29.2.knots20251110.
It is a policy project, not a consensus project. The filters change what your node relays and what your node mines. They do not change which blocks are valid, so Plumb follows the same chain as the Knots release it is built on.
It is a drop-in replacement for Knots: same bitcoind and bitcoin-cli
binaries, same bitcoin.conf, same data directory. You can switch back to
Knots at any time.
- Fake output hashes and keys,
-rejectfakeoutputs, from knots#389: counts outputs whose hash or key is data as data carrier bytes. - Bare data envelopes,
-rejectbareenvelopes, from knots#319: counts a run of pushes ended by OP_DROP or OP_2DROP as data carrier bytes. - Fake multisig keys,
-rejectfakemultisig, from knots#422: counts the keys of a multisig that no signature in the spend proves, beyond 10 per script, as data carrier bytes. - Token messages,
-rejecttokenmessages, Plumb's own from plumb#2, no Knots pull request: refuses an OP_RETURN that holds a JSON token message or an Omni Layer message.
Every filter is on by default and is its own option. plumb/FILTERS.md
says what each one rejects and leaves alone, with an example transaction and
the line that turns it off. -corepolicy turns all of them off along with the
rest of the Knots policy. The node logs which filters are active at startup:
Plumb filter -rejectfakeoutputs=1 (knots#389)
Plumb filter -rejectbareenvelopes=1 (knots#319)
Plumb filter -rejectfakemultisig=1 (knots#422)
Plumb filter -rejecttokenmessages=1 (plumb#2)
The 42-byte -datacarriersize is not a filter and has no switch of its own:
set datacarriersize=83 to match Knots, and -corepolicy sets 83 too.
plumb/FILTERS.md says what 42 refuses
that 83 lets through.
The machine-readable list is plumb/filters.json, with the exact commit of each pull request that was merged.
plumb/conf/plumb.conf for Plumb and
plumb/conf/knots.conf for Knots, the same files as
on cesspool.lol/check, which also
has the settings for Umbrel and StartOS. Each writes its filter settings
out, so a corepolicy=1 set elsewhere can no longer reset them (it still
changes settings they do not set, such as the minimum relay fee), and sets
three values stricter than Knots' defaults: datacarriersize=42 (Plumb's
own default), datacarriercost=2 and bytespersigopstrict=51. The comment
above each says what it does;
cesspool.lol explains the
third, which refuses most fake multisig. If your bitcoin.conf already sets
one of these options, change or remove that line rather than adding a second
one.
A node that a Lightning node sends transactions through takes
plumb/conf/plumb-lightning.conf or
plumb/conf/knots-lightning.conf instead:
the same files with the three settings a zero-fee commitment channel needs
(subdustfeepenalty=0, mempooltruc=enforce and
permitephemeral=anchor,-send,dust) and the dust fee settings written out.
The comments above each say what the change lets through;
cesspool.lol/check/#lightning says
the rest.
Releases are signed git tags named after the Knots release they are built
on, for example v29.4.3.knots20260508.plumb8. Each release page carries
the source and, from plumb5 on, a pre-built bitcoind and bitcoin-cli
for x86_64 Linux; from plumb6 on, for 64-bit ARM (aarch64) Linux too.
Plumb is an app in Leo Haf's Misc community app store for Umbrel. The install steps, how to check that it runs Plumb, and what to do when the install fails are at plumbnode.org/umbrel.
The tarballs run on any x86_64 or aarch64 Linux with glibc 2.31 or newer:
Debian 11, Ubuntu 20.04, RHEL 9 and everything later. The aarch64 build has
been tested under emulation on an x86_64 machine, not yet on ARM hardware.
Download the one for your machine (uname -m says which) together with
SHA256SUMS and SHA256SUMS.asc from the release page, then:
gpg --keyserver hkps://keys.openpgp.org --recv-keys 89F0E41D72CE523F4AA1CDB692CDFFB7C40CD1BA
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
tar xzf bitcoin-*-"$(uname -m)"-linux-gnu.tar.gz
sudo install -m 0755 bitcoin-*/bin/bitcoind bitcoin-*/bin/bitcoin-cli /usr/local/bin/Install nothing until gpg --verify reports a good signature from Jason
Sopko and sha256sum says OK. It is one person's build on one machine,
not a reproducible build; the recipe is
plumb/tools/release-tarball.
git clone https://github.com/plumb-node/plumb
cd plumb
git checkout v29.4.3.knots20260508.plumb8
git verify-tag v29.4.3.knots20260508.plumb8
cmake -B build -DBUILD_GUI=OFF
cmake --build build -j"$(nproc)"Tags are signed by Jason Sopko,
89F0 E41D 72CE 523F 4AA1 CDB6 92CD FFB7 C40C D1BA. Fetch the key with
gpg --keyserver hkps://keys.openpgp.org --recv-keys 89F0E41D72CE523F4AA1CDB692CDFFB7C40CD1BA
or from https://github.com/jasonsopko.gpg.
Build dependencies and options are the same as Knots; see
doc/build-unix.md and the other doc/build-*.md files.
The binaries land in build/bin/.
To hear about new releases, use Watch, Custom, Releases on this repository. Each release page lists what changed and the Knots release underneath it.
Plumb takes anti-spam policy filters as pull requests on this repository. If you have one open against Knots, open it here too and link the two; we review it on its own merits and keep shipping it whatever happens upstream. A filter that Knots closes stays in Plumb.
Plumb also writes filters of its own, for shapes no Knots pull request covers. They go through a pull request here and the same bar as any other, and the filter list marks them as Plumb's own.
What a filter needs:
- Its own option, default on, turned off by
-corepolicy, the same shape as-rejectparasites. - Unit or functional tests for what it rejects and what it lets through.
- Numbers from the chain: how many transactions it would have rejected over a stated block range, and a look at the ones that might be payments. A filter that blocks ordinary wallet spends does not ship, however much data it catches.
We review it on the pull request, run it on a mainnet node, and post the
ACK there. It is merged at the commit that was ACKed and kept on its own
filter/<option> branch here, so it survives even if the author's branch
goes away. If the author stops maintaining it, we carry it forward to each
new Knots release ourselves.
To submit one, open a pull request. No code yet, or a filter open against Knots you want us to look at? Use the Propose a filter form. Found a new embedding shape and only have a transaction id or two? Use the Embedding shape form.
See plumb/MAINTAINING.md for the merge and release process.
Report Plumb problems here, not to Knots. If a problem also happens on the Knots release underneath, it belongs upstream at https://github.com/bitcoinknots/bitcoin. Security issues go through SECURITY.md.
Plumb is released under the terms of the MIT license, the same as Bitcoin Knots and Bitcoin Core. See COPYING. It is built on the work of the Bitcoin Core and Bitcoin Knots developers; see https://bitcoinknots.org for Knots itself.
