aere-docs/AERE-VSM.md
Aere Network e4cead319d Initial public release
Aere Network public source. Everything here can be checked against the live
chain (chain id 2800, https://rpc.aere.network).

Scope note, stated up front rather than buried: consensus on chain 2800 is
classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at
the signature, precompile, account and transport layers. Nothing here makes the
consensus post-quantum, and no document in it should be read as claiming so.
2026-07-20 01:01:36 +03:00

251 lines
13 KiB
Markdown

# Aere VSM: Verifiable Semantic Memory for AI Agents
Status: on-chain registry, attested retrieval, and AERE402 paid query are BUILT and TESTED [VERIFY].
The embedding model, the vector similarity search, and the raw vector data are OFF-CHAIN [MEASURE].
Contract: `aerenew/contracts/contracts/agentic/AereVectorStore.sol` (solc 0.8.23).
Tests: `aerenew/contracts/test/aere-vector-store.test.js` (8 passing, Falcon mocked in test).
---
## 1. What this is
An AI agent's long-term memory is a vector store: text, decisions, and preferences are turned
into embeddings and indexed for nearest-neighbour retrieval. Today that memory has no clear
owner, no verifiable history, and no way for a consumer to check that a returned result was
really part of the memory the agent claims to hold. Switch provider and the memory dies with
the vendor.
Aere VSM gives an agent's vector store three on-chain properties it does not have anywhere else:
1. A clear OWNER, an account or an agent identity that the memory is bound to.
2. A verifiable, APPEND-ONLY HISTORY of committed memory states, each optionally authenticated
by a post-quantum Falcon-512 signature verified in full on-chain.
3. PAID, ATTESTED RETRIEVAL, so a retrieval provider can attest "for this query, against this
committed memory version, these are the results", metered through the existing AERE402
agentic payment rail, and a consumer can verify a returned vector was actually committed.
This is the "decentralized AI memory" idea anchored to Aere's live post-quantum precompiles and
its existing payment rail. It is deliberately honest about the boundary between what a chain can
prove (provenance, ownership, that a retrieval named a committed version) and what it cannot
(that the embeddings are semantically good).
---
## 2. Architecture
```
OFF-CHAIN [MEASURE] ON-CHAIN [VERIFY] (chain 2800)
------------------------------ ------------------------------------------
documents / events / prefs
|
v embedding model AereVectorStore.sol
vectors + metadata ------------------------------------------
| createStore(storeId, falconPubKey?, token?,
v build index + Merkle root price?, recipient?)
vectorRoot = Merkle/commitment -------> commit(storeId, vectorRoot, vectorCount,
over the vectors uri, falconSig)
| - post-quantum store: falconSig verified
v publish snapshot via 0x0AE1 (Falcon-512), fail-closed
uri (ipfs:// / https://) - classical store: msg.sender == owner
- append-only version history
query embedding paidQuery(storeId, queryHash, agentId, amount,
| nonce, deadline, authSig)
v similarity search (ANN) - settles on the AERE402 rail (references
candidate vectors -------------------> AERE402Facilitator, does not redeploy it)
| - mints a receipt bound to (store, query)
v Merkle proofs + resultRoot
result set attestRetrieval(storeId, version, queryHash,
resultRoot, receiptId)
- version must exist (fail-closed)
- priced store: consumes a paid receipt
- records the provider's attestation
consumer holds a returned vector -------> verifyVectorInclusion(storeId, version,
leaf, proof) -> membership in the
committed vectorRoot
verifyResultInclusion(retrievalId, leaf, proof)
-> membership in the attested resultRoot
```
The flow is: embed and index OFF-CHAIN, commit the root ON-CHAIN, attest retrieval ON-CHAIN,
pay for the query on the AERE402 rail, and let the consumer verify inclusion against the
committed root.
---
## 3. The on-chain object model
### Store
A store is created once and its configuration is FIXED at creation (no setter for the Falcon
key, the price, the settlement token, or the recipient). A store is either:
- CLASSICAL: no Falcon key. Commits require `msg.sender == owner`.
- POST-QUANTUM: a 897-byte Falcon-512 public key (header `0x09`). Commits require a Falcon
signature that verifies on-chain via the live precompile at `0x0AE1`. Authorship IS the
signature, so any relayer may submit the transaction and only the key holder can produce a
valid commit.
### Version (append-only)
Each `commit` appends a new `Version { vectorRoot, vectorCount, committedAt, blockNumber, uri }`.
Version numbers start at 1 and increase by exactly one. No function can overwrite or delete a
committed version. The current root and every past version stay queryable forever. There is no
admin, no owner override, and no upgrade hook, so there is nothing that can rewrite a committed
root.
### Retrieval attestation
`attestRetrieval(storeId, version, queryHash, resultRoot, receiptId)` records that a provider
(the transaction sender) attests: for `queryHash`, run against committed store `version`, the
returned result set is committed by `resultRoot`. The named version MUST exist (1..current) or
the call reverts, so an attestation can never point at a store state that was never committed.
### Paid query receipt
On a priced store, `paidQuery` settles a payment on the AERE402 rail and mints a
`QueryReceipt` bound to `(storeId, queryHash, agentId, nonce)`. A retrieval attestation on a
priced store must cite a matching, unconsumed receipt; the receipt is consumed one-shot.
---
## 4. Post-quantum authentication
A post-quantum store's commit is authenticated by a Falcon-512 signature over a per-version
challenge:
```
challenge = keccak256(abi.encode(
COMMIT_DOMAIN, block.chainid, address(this),
storeId, version, vectorRoot, vectorCount, keccak256(bytes(uri))))
```
The challenge binds the chain, this contract, the store, the exact version, the committed root,
the vector count, and the URI. Because `version` is part of the challenge and advances by one
per commit, a signature is single-use and cannot be replayed onto a later version.
Verification uses the same input construction as `AerePQCAttestation.sol`, restricted to
Falcon-512 at `0x0AE1`:
```
falconSig = nonce(40) || esig (the envelope handed to commit)
input = pk(897) || sm
sm = sigLen(2, big-endian) || nonce(40) || challenge(32) || esig
esig = 0x29 || compressedSig, sigLen == esig.length
```
The precompile returns a 32-byte word, `0x..01` for valid and `0x..00` otherwise. An empty or
zero return, which is what a pre-fork node with no precompile would produce, is treated as
INVALID, so a stale caller can never record a commit. A commit whose Falcon signature does not
verify reverts `PQCVerificationFailed` and records nothing (fail-closed).
The live Falcon-512 precompile at `0x0AE1` was activated on mainnet 2800 at block 9,189,161
(see `besu_pqc_fork_proven_2026-07-11`). In the Hardhat test suite the precompile is mocked
(`MockPQCPrecompile`, installed at `0x0AE1` via `hardhat_setCode`), which parses the input at
the precompile's spec offsets; the real Falcon-512 encoding is proven separately against the
LIVE mainnet precompile by the `AerePQCAttestation` verification path [VERIFY].
---
## 5. Paid query on the AERE402 rail
Aere VSM references the existing `AERE402Facilitator` (the agentic payment rail); it does NOT
redeploy or fork it, and it introduces NO new token. Queries settle in whatever ERC-20 the store
owner selects (for example WAERE or USDC.e).
`paidQuery` works as an on-chain AERE402 provider endpoint:
1. The paying agent authorizes the payment with its EIP-712 `PaymentAuth` signature to the
facilitator, exactly as any AERE402 payment, with the vector store as the `payee`.
2. `paidQuery` calls `FACILITATOR.settle(...)`. Because the vector store is both the caller and
the payee, the facilitator's own `msg.sender == payee` guard is satisfied. The facilitator
debits the agent's prepaid balance, takes the 25-bps protocol fee to AereSink, and transfers
the remainder to the vector store.
3. The vector store measures the exact amount it received (a balance delta, robust to a changed
fee) and forwards it, in the same transaction, to the store's payment recipient. The contract
custodies no balance across calls, and it never holds an agent's funds.
4. A receipt is minted, bound to `(store, query)`, that a retrieval provider can later cite.
On a priced store, `attestRetrieval` reverts `PaymentRequired` when no valid receipt is cited,
`ReceiptConsumed` on reuse, and `ReceiptMismatch` when the receipt was paid for a different
store or query. This is the payment gate: a metered retrieval must be backed by a real,
on-chain settlement on the AERE402 rail.
---
## 6. Trust model
### What the on-chain part GUARANTEES [VERIFY]
- AUTHENTICITY of a committed root. A post-quantum store's commit carries a Falcon-512 signature
verified in full on-chain. An invalid signature records nothing.
- APPEND-ONLY HISTORY and IMMUTABILITY. No path rewrites or deletes a committed version; there is
no admin and no owner override over committed roots.
- OWNERSHIP. Every store is bound to an owner at creation; a classical store's commits require
the owner, a post-quantum store's commits require the Falcon key.
- RETRIEVAL AGAINST A COMMITTED VERSION. An attestation can only name a version that was actually
committed, and it records who attested it.
- INCLUSION. A consumer can prove, on-chain, that a returned vector was a member of a committed
version's `vectorRoot` (`verifyVectorInclusion`) and of a provider's attested `resultRoot`
(`verifyResultInclusion`).
- PAID, METERED RETRIEVAL. On a priced store, a retrieval attestation is backed one-for-one by an
AERE402 payment.
### What the on-chain part does NOT guarantee (OFF-CHAIN, [MEASURE])
- It does NOT compute embeddings, does NOT run the similarity search, and does NOT hold the
vectors. The embedding model, the nearest-neighbour index, and the raw vector data all live
off-chain.
- It does NOT and CANNOT prove that the embeddings are SEMANTICALLY GOOD, that the index is
well-built, or that the provider ran an honest similarity search. On-chain attestation proves
PROVENANCE and OWNERSHIP of a committed root and that a retrieval named a committed version. It
does NOT prove RELEVANCE. Semantic quality is an off-chain property, measured off-chain
[MEASURE].
- Inclusion in `resultRoot` proves the provider committed to returning that result; it does not
prove the result was the best or the correct nearest neighbour for the query.
### Scope boundary
Aere VSM is application-layer PQC authentication plus settlement. It does NOT change Aere
consensus: blocks are still produced and signed by Besu QBFT validators with classical ECDSA
(secp256k1). PQC-authenticated memory commits do NOT make consensus post-quantum. What is
post-quantum here is the AUTHENTICITY of a store commit, through the live Falcon-512 precompile.
---
## 7. Honest status
| Component | Status | Flag |
| --- | --- | --- |
| On-chain commit registry, versioned + append-only | Built, tested | [VERIFY] |
| Falcon-512 authenticated commits via `0x0AE1` | Built, tested (Falcon mocked in test) | [VERIFY] |
| Falcon-512 encoding vs the LIVE mainnet precompile | Proven separately (AerePQCAttestation) | [VERIFY] |
| Retrieval attestation, fail-closed on a missing version | Built, tested | [VERIFY] |
| Inclusion proofs (vectorRoot, resultRoot) | Built, tested | [VERIFY] |
| AERE402 paid-query gate | Built, tested against the real facilitator | [VERIFY] |
| Embedding model | Off-chain | [MEASURE] |
| Vector similarity search / index | Off-chain | [MEASURE] |
| Raw vector data + semantic quality / relevance | Off-chain | [MEASURE] |
The on-chain layer is built and tested. The semantic layer (embeddings, similarity search, and
the vector data) is off-chain research-frontier work, and its quality is measured off-chain, not
proven on-chain.
---
## 8. Test result
`npx hardhat test test/aere-vector-store.test.js`, run from `aerenew/contracts`, reports
8 passing:
1. commits a PQC store version 1, then version 2, preserving history append-only
2. rejects a tampered Falcon signature fail-closed (nothing recorded)
3. treats an empty precompile return (pre-fork / stale node) as invalid
4. records a retrieval attestation against a committed version and reverts on a missing version
5. verifies an inclusion proof for a committed vector and rejects a non-member
6. meters a priced store on the AERE402 rail and gates attestRetrieval on payment
7. classical store: only the owner may commit
8. createStore rejects a malformed Falcon key and inconsistent price config