Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
d76c667
feat(pointer): create, update, read and resolve pointers
grumbach Sep 18, 2026
456846b
refactor(pointer): follow the protocol record, and pin the chain by b…
grumbach Sep 18, 2026
aa6e166
feat(pointer): store on a quorum, verify every answer
grumbach Sep 18, 2026
8f45041
fix(pointer): store and read the same close group, concurrently
grumbach Sep 18, 2026
23bf57d
fix(pointer): derive the quorum from the group, not from a constant
grumbach Sep 18, 2026
a95dfc7
fix(pointer): drop the import the fixed quorum no longer uses
grumbach Sep 18, 2026
f7dcf13
refactor(pointer): test the fan-out instead of restating it
grumbach Sep 18, 2026
e816117
fix(pointer): hold a pointer PUT to the single-node proof timeout
grumbach Sep 18, 2026
190134b
test(pointer): prove the feature against a live testnet
grumbach Sep 18, 2026
acb3707
style(pointer): apply rustfmt to the e2e suite
grumbach Sep 18, 2026
6946f72
fix(pointer): do not let one peer decide what a pointer says
grumbach Sep 18, 2026
1f1bb38
fix(pointer): check the address on a refusal too
grumbach Sep 18, 2026
227aa28
docs(pointer): the read and the write share a definition, not a lookup
grumbach Sep 18, 2026
3fe1505
fix(pointer): one peer must not be able to bury the state the group a…
grumbach Sep 18, 2026
325c21e
fix(pointer): do not pay to store on nobody
grumbach Sep 18, 2026
e621f8a
docs(pointer): a retry cannot move the pointer, but it does pay
grumbach Sep 18, 2026
23f0143
fix(pointer): ask who the storers are after paying, not before
grumbach Sep 18, 2026
37af316
docs(pointer): an unknown target kind is not an error
grumbach Sep 18, 2026
915e8f4
docs(pointer): the pointer ADR is 0016
grumbach Sep 24, 2026
bf4e5a7
fix(pointer): keep the pointer API off the browser build
grumbach Sep 24, 2026
aee2111
chore: rebase onto the client's own 0.10.0 release
grumbach Sep 24, 2026
bc65eb5
test(pointer): prove skips, catch-up and fork healing end to end
grumbach Sep 24, 2026
5fdb285
test(pointer): make the E2E suite prove what it claims
grumbach Sep 24, 2026
fb22bd6
feat(pointer): pointers from the browser and the CLI
grumbach Sep 25, 2026
ccf1589
chore: align pointer protocol and node revision pins
Sep 27, 2026
414234b
merge: resolve conflicts with main (PR #206)
Sep 28, 2026
a67c822
ci(browser): bump devnet node revision to main (pointer support)
Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ ant-core/src/
│ ├── payment.rs # pay_for_storage, approve_token_spend
│ ├── quote.rs # get_store_quotes from network peers
│ ├── merkle.rs # Merkle batch payment (PaymentMode enum)
│ ├── pointer.rs # pointer_create/update/get/resolve (ADR-0016)
│ └── cache.rs # In-memory LRU chunk cache
└── node/ # Node management
├── mod.rs # add_nodes, remove_node, reset
Expand Down Expand Up @@ -108,6 +109,7 @@ ant-cli/src/
├── data/
│ ├── file.rs # ant file upload/download
│ ├── chunk.rs # ant chunk put/get
│ ├── pointer.rs # ant pointer keygen/address/create/update/get/resolve
│ └── wallet.rs # ant wallet address/balance
└── node/
├── mod.rs
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@
members = ["ant-core", "ant-cli"]
resolver = "2"

[patch.crates-io]
# The published ant-protocol 3.0.0 has no `Pointer` record or wire messages
# (ADR-0016). Pin the pointer revision until a release includes it.
# Versions are bumped at release; this immutable revision remains 3.0.0.
ant-protocol = { git = "https://github.com/WithAutonomi/ant-protocol", rev = "d11d1010d93958fee6e63e4aace8770f39a0678b" }
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,15 @@ There is no browser-specific recovery probe or relaxed payment threshold.
The requested responder count must be satisfied before quote witnessing and
storage-majority checks proceed.

Pointers work from the browser too: `getPointer`, `resolvePointer`,
`createPointer` and `updatePointer` on `BrowserNetworkClient`, and
`pointerAddress(seed)` offline. They run the native client's own read quorum,
corroboration and write quorum, and pay each state through the same wallet
callback file uploads take. The owner key is passed as its 32-byte seed. Only
nodes that advertise `pointer_protocol` are asked. A write can hand the paid
record and proof to an `onPaid` callback; `storePaidPointer` stores them later
without paying again.

Browser protocol v5 and browser manifest v6 advertise only the payment chain ID
and token/vault addresses. RPC providers belong to the application or wallet;
the node's verification RPC URL is never sent to the browser. Paid uploads
Expand Down Expand Up @@ -292,6 +301,56 @@ $ ant chunk get a1b2c3d4... -o output.bin
|------|-------------|
| `-o, --output <PATH>` | Write to file instead of stdout. |

### `ant pointer` — Pointer Operations

A pointer is a mutable reference to a chunk or to another pointer, signed by an
owner key that can never change. Every state is paid for; reads are free. The
owner key is kept as a 32-byte seed in a file only its owner can read (`0600`
on Unix; on Windows it takes its directory's permissions, so keep it in your
user profile). Losing it means the pointer can never be updated again.

#### `ant pointer keygen --output <FILE>`

Create a new owner key and print the address of the pointer it controls. Never
overwrites an existing file.

```
$ ant pointer keygen --output owner.key
Owner key written to owner.key
9f3c...
```

#### `ant pointer address --key <FILE>`

Print the address of the pointer a key controls. Needs no network.

#### `ant pointer create --key <FILE> <TARGET> [--kind chunk|pointer]`

Create the pointer, pointing at `TARGET` (hex). Requires `SECRET_KEY` to pay.
Refused before paying if the pointer already exists.

#### `ant pointer update --key <FILE> <TARGET> [--kind chunk|pointer]`

Point it at `TARGET`, one past the counter the network serves (or create it).
Requires `SECRET_KEY` to pay for the new state.

#### `ant pointer get <ADDRESS>`

Print a pointer's counter, target and state.

```
$ ant pointer get 9f3c...
address: 9f3c...
counter: 1
kind: chunk
target: a1b2...
state_id: 5e7d...
```

#### `ant pointer resolve <ADDRESS>`

Follow a chain of pointers to the target at its end.

### `ant wallet` — Wallet Operations

Inspect the EVM wallet derived from `SECRET_KEY`.
Expand Down
4 changes: 4 additions & 0 deletions ant-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ clap = { version = "4", features = ["derive", "env"] }
colored = "3.1.1"
hex = "0.4"
indicatif = "0.17"
rand = "0.8"
rmp-serde = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing-appender = "0.2"

[dev-dependencies]
tempfile = "3"
7 changes: 6 additions & 1 deletion ant-cli/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use ant_core::data::MultiAddr;
use clap::{ArgAction, Parser, Subcommand};
use std::path::PathBuf;

use crate::commands::data::{ChunkAction, FileAction, WalletAction};
use crate::commands::data::{ChunkAction, FileAction, PointerAction, WalletAction};
use crate::commands::node::NodeCommand;
use crate::commands::update::UpdateArgs;

Expand Down Expand Up @@ -110,6 +110,11 @@ pub enum Commands {
#[command(subcommand)]
action: ChunkAction,
},
/// Pointer operations (owner-signed mutable references, paid per update)
Pointer {
#[command(subcommand)]
action: PointerAction,
},
/// Update the ant binary to the latest version
Update(UpdateArgs),
}
Expand Down
2 changes: 2 additions & 0 deletions ant-cli/src/commands/data/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
pub mod chunk;
pub mod file;
pub mod pointer;
pub mod wallet;

pub use chunk::ChunkAction;
pub use file::FileAction;
pub use pointer::PointerAction;
pub use wallet::WalletAction;
Loading
Loading