Skip to content

Storage node v0.23.0+ds.18

Choose a tag to compare

@github-actions github-actions released this 28 Oct 02:45
· 44 commits to main since this release
Immutable release. Only release title and notes can be modified.

Storage node v0.23.0+ds.18 for Linux x86_64 (Ubuntu 24.04 or newer).

Running nodes install it by themselves within the staged-rollout window.
The archive is signed with ML-DSA-65; check it with:
ant-keygen verify --key release-signing-key.pub --input ant-node-cli-linux-x64.tar.gz --signature ant-node-cli-linux-x64.tar.gz.sig

The archive also contains LICENSE-MIT and LICENSE-APACHE, plus THIRD-PARTY-NOTICES.txt and RUST-STD-COPYRIGHT.html with the licences and copyright notices of the third-party code in the binary and of the tools used to build it.

What changes

ds.18 nodes work next to ds.17 and older nodes. They send no new kind of message: the one change on the wire is a byte per key appended at the very end of a paid-list reply, which older nodes' decoders stop before. A client released before ds.18 is quoted and paid exactly as before, on every node. What is new is a second way to pay, by the size of the record, which clients take up only once no storer before ds.18 is left on the network.

Records priced by size class

  • The weight of a record. A record now weighs the top of its size class as a share of a full 4 MiB chunk: a fixed quarter, plus three quarters scaled by the class top. There are nine classes, with power-of-two tops from 16 KiB to 4 MiB:

    Class top Weight, in 1/1,024 of a full chunk
    16 KiB 259
    32 KiB 262
    64 KiB 268
    128 KiB 280
    256 KiB 304
    512 KiB 352
    1 MiB 448
    2 MiB 640
    4 MiB 1,024

    A full chunk weighs exactly 1 and pays exactly what it paid before. Payments on chain show a record's size only to within a factor of two.

  • Pointers are weighed by their data type at their fixed 5,303 bytes, whatever size a request declares: the 16 KiB class. Paying to create and to update a pointer is unchanged.

  • What a store requires. A client settling under version 2 pays 3 times the median quote times the record's weight. Every store check now requires at least that, with the class taken from the bytes the node holds: a payment for a larger class clears, one for a smaller class is refused, and an overpayment always clears. A full-price payment, as every released client makes, always clears. The amount paid is still read through the proof's receipts and the vault's record; an amount that falls short goes on to the record read, and is never taken as nothing paid.

  • Unchanged: the price curve and its ×32 multiplier, the quote format, the price ceiling, merkle (batch) payments still refused, and every refusal still coming from the vault's record.

Quotes

  • The weight total. Each node adds up its committed records' weights (in full chunks, rounded up) whenever it builds its hourly storage commitment, and once at start for a commitment it reloads. It is held in memory only: the retention file is unchanged, so ds.17 and ds.18 read each other's. The commitment line logs weight_total=, or unknown until it is read.
  • Who is quoted what. A quote request declaring settlement version 2 is quoted at the price of the weight total, or of the key count if that is lower or the total isn't known yet. Every other request, unversioned or version 1, is quoted at the key-count price, as before. The quote still carries the key count.
  • A price band. A quote is now checked against a band, not one exact price: from the price of 259/1,024 of the key count up to the price of the key count. At a key count of 0 the band is the baseline price alone. The shape and key-cap checks, and the cross-check of the key count against the node's pinned commitment, are unchanged.
  • Settlement version 2. Nodes now settle up to version 2 and still accept version 1. A node before ds.18 answers a version-2 quote with StorerUpdateRequired, and the client asks another node.
  • Browsers. The browser listener accepts protocol version 6 for a quote alone, as a version-2 quote at the weight total, beside version 5 for every request, quoted as before. hello lists size_priced_quote. A node before ds.18 refuses a version-6 request before quoting, so a browser never pays a node that can't take a payment by size.
  • Traffic. The chunk traffic summary, every 5 minutes, counts versioned quote requests by the settlement version they declare: quote_v2_settlement_1_count, quote_v2_settlement_2_count and quote_v2_settlement_other_count, and the same for merkle requests, browser quotes included.

Payment notices record the class they paid

  • The paid class. A payment notice carries no bytes, so it is admitted at the smallest class's amount, and the class its settled amount covers is written beside the key in the paid list, as one byte. A class is only ever raised, never lowered. The full class is written as no byte at all, which is how every key admitted before ds.18 reads, and how ds.17 and older nodes keep writing every key. Older nodes never read the byte.
  • Paid-list replies. A node answers a paid-list query with the class each key records, appended at the very end of its reply. A reply from an older node reads as the full class for every key. A node that learns a key from a quorum of paid lists alone records the class a quorum of them record or exceed, not the full class.
  • The check on fetch. When fetched bytes arrive for a key this node knows only from paid lists, and the recorded class is below the class of the bytes, that fetch ends: no other source is tried, no peer is charged, and the paid-list entry and any copy already held stay. A key a majority of holders proved they store is fetched at any size, as before.

The price floor

  • The revenue floor's reference is now the price at the bottom of the median count's band, times the record's weight. It still runs in shadow mode by default; a node that enforces it (ANT_PRICE_FLOOR_ENFORCE) never refuses a correct payment by size, and a full-price payment clears it as before.

Older nodes and payments by size

A node before ds.18 can't check a payment by size anywhere: it refuses the fresh offers and drops the payment notices of a record paid that way, and its close group's possession checks and audits then charge it for a record it doesn't hold, as they charge any node. No node is spared by the release it advertises. So clients keep paying full price, version 1, until no storer before ds.18 is left; until then, ds.18 changes nothing a client pays.

Updating the image (Docker)

ds.18 changes nothing in the image. Nodes install ds.18 by themselves, with everything above, whether or not you pull.

What ds.17's notes say about images still applies: the nodes status list of full nodes needs ds.17's image or later, and on an image older than the one that ships darwin-nodes, pull the new one (docker compose pull, then docker compose up -d).