Paper Notes

Annotated summary of "IPv6 Bitcoin-Certified Addresses for IoT Networks" by Mathieu Ducroux (nChain AG), arXiv:2311.15842.

Citation

Ducroux, M. (2023). IPv6 Bitcoin-Certified Addresses for IoT Networks. arXiv:2311.15842v1.

Status

Preprint. Not peer-reviewed at a top security venue. Authored by a researcher at nChain AG. No known production deployments prior to this IronIP implementation.

The problem the paper addresses

CGA (RFC 3972) was designed for SEND (RFC 3971) to let IPv6 devices prove identity at the network layer without certificates. The idea was good; the performance was fatal:

The paper's insight

Bitcoin miners already do massive proof-of-work. What if IoT devices could borrow that work?

The construction anchors a device's public key to a Bitcoin transaction via OP_RETURN. The block header mining that transaction carries the proof-of-work. The device's IPv6 address then derives from a hash incorporating the block header, transaction, and a device-specific modifier.

The security level achievable is determined by the Bitcoin block's difficulty, not the device's CPU. At modern Bitcoin (BSV) difficulty, sec = 2 gives 89-bit security — in <1ms per address on any microcontroller.

Key definitions from the paper

SymbolMeaning
PKDevice's public key
m_iModifier i (16 random bytes), i ∈ [0, 31]
MRMerkle root of the 32 modifiers. Placed in the anchor tx's OP_RETURN.
txThe Bitcoin anchor transaction. Contains OP_RETURN(H(PK) ‖ MR).
BHThe 80-byte block header that includes tx.
PSubnet prefix (/64 IPv6 prefix).
ccCollision count, ∈ {0, 1, 2}.
Hash1SHA-256(m_i ‖ BH ‖ P ‖ cc ‖ tx) — the output whose leftmost 64 bits form the interface identifier.
secSecurity parameter encoded in the interface ID. Determines required leading-zero bits in SHA-256²(BH).

Paper Table I — security levels

secLeading zero bits required in BH hashEffective security
03259 bits
14875 bits
26489 bits
380107 bits
496123 bits
5112139 bits
6128155 bits
7144171 bits

Paper Table II — BCA Parameters

The 8 fields that travel with a device to enable offline verification. IronIP's src/lib/bca-core.js uses the same names.

  1. modifier
  2. publicKey
  3. transaction
  4. blockHeader
  5. subnetPrefix
  6. collisionCount
  7. merkleProofTx — proof that tx is in the block identified by blockHeader
  8. merkleProofMod — proof that modifier is in the Merkle tree whose root is stored in tx's OP_RETURN

Paper Section IV — verification algorithm

The 8 steps. Full walkthrough in 8-Step Verification. Key points:

Departures and extensions in IronIP

Open questions from the paper

Why we implemented this anyway

Even as a preprint, the core contribution is solid: SHA-256, Merkle trees, and Bitcoin PoW are each battle-tested individually. The combination is novel but doesn't introduce new cryptographic assumptions. A working implementation lets us pressure-test the ideas in practice, identify gaps (like revocation and strict verification UX), and build the adapter ecosystem that the paper gestures at but doesn't concretely specify.

See also