• v0.13.8 7c315584da

    btcbob released this 2026-09-18 14:33:59 +00:00 | 4 commits to main since this release

    Consensus

    CHECKLOCKTIMEVERIFY (BIP65). OP_NOP2 becomes OP_CHECKLOCKTIMEVERIFY, enforced from
    block 2,000,000 on mainnet, the same height as the AuxPoW merge-mining fork, so the network
    takes one upgrade instead of two. Below that height the opcode behaves exactly as it always did,
    which is what keeps this a soft fork. This is what atomic swaps need; nothing else in the release
    depends on it.

    Signature verification moved from OpenSSL to libsecp256k1 v0.5.1. Validation no longer depends
    on which OpenSSL version a binary happened to link against. Unlike CLTV this is live the moment
    the node runs
    , not at a future height. Signing already used libsecp256k1; only verification was
    on the OpenSSL path.

    Block-version comparisons read the base version. Past block 2,000,000 the AuxPoW chain ID
    occupies the high bits of nVersion, so every block reads as version 11,534,339 and a plain
    nVersion >= N comparison is true for every N. Six comparisons, including the soft-fork majority
    checks, now call GetBaseVersion(). A no-op below 2,000,000 and the reason soft-fork logic still
    means something above it.

    Network

    A peer running an older protocol version is no longer refused. MIN_PEER_PROTO_VERSION was
    defined as PROTOCOL_VERSION itself, so the next bump of the protocol version, for any reason at
    all, would have made the new release refuse every node already on the network while those nodes
    happily accepted it. Nothing changes today; the floor is the literal 70005, where the network has
    been since the v10.2.0 hardfork.

    Ten spare DNS seeds. seed1.dobbscoin.info through seed10.dobbscoin.info ship alongside
    seed.dobbscoin.info. They have resolved since 2026-08-16; until now the client asked for one of
    them. One seed name is one thing to break.

    A peer-selection loop no longer burns a CPU core. CAddrMan::Select_() retried an unbounded
    random walk over a sparse address table, and on a node with few known addresses it could spin at
    essentially 100% of a core indefinitely. It is bounded now, and it stops using the slow RNG to do
    it. Measured on a real node: 99.2% of a core before, 0.1% after.

    Wallet

    The pool field defaults to pool.dobbscoin.info:3033. A blank field sent miners to 3032 at
    difficulty 15,000, where a small rig finds nothing and sees no error. 3033 starts at difficulty 4.

    Node operators

    -assumevalid=<blockhash>. Skips signature verification for the named block and everything
    before it, which until now only the last checkpoint could do. It defaults to block 1,890,000 and
    -assumevalid=0 turns it off and verifies everything. This is a local sync-speed setting: it
    relaxes no consensus rule, every other check still runs on every block, and a block that fails one
    is still rejected. The named block has to be on the header chain the node is actually following, so
    a low-work chain cannot talk a node out of verifying.

    getblockheader, and getblock accepts an integer verbosity. Standard RPC shapes that tooling
    expects.

    Developer

    qa/run-all.sh runs every suite in the tree in one command: the unit tests, the CLTV and AuxPoW and
    assumevalid chain harnesses, and all twenty functional tests. 25 suites, 0 failures, about five
    and a half minutes.

    The twenty functional tests in qa/rpc-tests had not run in years; they were written for Python 2.
    They run again. Regtest also stopped retargeting its difficulty, which it had been doing from block
    20 on a chain whose block times are all zero, hardening the target by three orders of magnitude and
    taking mining from 30 milliseconds a block to 33 seconds.


    Should you upgrade?

    Miners and pool operators: yes, before block 2,000,000 (roughly 2027-01-24 at 120-second
    spacing). CLTV is a soft fork, which means it makes previously-valid things invalid. A miner running
    older software past that height can mine a block that violates a CLTV lock; upgraded nodes will
    reject it and that block is lost. There is no version signaling to warn anyone first: the AuxPoW
    chain ID makes version bits unreadable past 2,000,000, so activation is by height, flag-day style.

    Everyone else: yes, whenever convenient. The addrman fix is the one change with an effect you
    can see today. A node older than this release still follows the chain until 2,000,000, and v0.12.0
    remains the floor for the AuxPoW fork itself.

    Evidence behind the consensus changes

    • 68,863 real mainnet transactions revalidated with the new verification path: verifychain 4 50000, heights 1,855,101 to 1,905,101, all above checkpoint 1,848,000 so signatures are genuinely
      checked. No inconsistencies.
    • That harness was proved by sabotage, not trusted: patching Verify to fail after its first
      200 calls makes the same check return false.
    • High-S signatures proved by mutation. Low-S is not a consensus rule on this chain, so a
      libsecp256k1 port that normalises wrong would reject blocks an OpenSSL node accepts. Deleting the
      normalisation line makes a real high-S spend get rejected on a real chain while the entire unit
      test suite still passes
      .
    • A/B against production. A node running this build followed mainnet alongside a node running
      v0.13.7, compared every five minutes on tip hash rather than height. Zero divergences.
    • -assumevalid proved by sabotage too. With an abort wired into the signature-checking branch,
      a node with -assumevalid set syncs the whole chain and the control node stops dead at the first
      block carrying a spend.
    • CLTV activation suite 3/3, signature normalisation suite 2/2, on freshly built binaries.
    • AuxPoW regtest suites: RPC contract 6/6 and the consensus path 9/9, the latter accepting a real
      merge-mined block and refusing eight malformed proofs, each for its own distinct reason.
    • Full unit suite 163 cases, no errors, and the encrypt-wallet round trip passes.

    The test suite passes, for the first time

    test_dobbscoin had reported failures for years: 62 of them, then 42 after signature verification
    moved to libsecp256k1. It is now 163 test cases with no errors. The last 42 were fixtures, not
    code — script_tests.cpp builds its cases at run time and asserts each appears in
    script_valid.json / script_invalid.json, and 42 did not, each differing from a same-named entry
    only in the signature bytes. The missing vectors were merged in rather than overwriting the files,
    which would have deleted about a thousand hand-written ones.

    That matters more than it sounds: while 42 tests were red, a new regression was indistinguishable
    from the standing noise.

    What the Linux builds need

    The .tar.gz builds are dynamically linked. On Debian or Ubuntu:

    sudo apt install libnatpmp1 libminiupnpc17 libssl3 \
                     libboost-chrono1.74.0 libboost-filesystem1.74.0 \
                     libboost-program-options1.74.0 libboost-thread1.74.0
    

    Most systems have all of these except libnatpmp1. Without it the daemon fails in the loader
    before it can say anything itself:

    error while loading shared libraries: libnatpmp.so.1
    

    That is a missing package, not a bad download. This has been true of every Linux build since
    v0.13.5, when NAT-PMP was added; it went unnoticed because our own nodes were older than the
    feature. The AppImage bundles all of them and needs none of this.

    Downloads