Giskard Marks
April 12, 2026 · View on GitHub
Giskard Marks
Proof of Presence for AI agents. Live on Arbitrum One.
The problem
Agents lose memory between sessions. Giskard Memory (ChromaDB) solves session continuity but is loseable — if the server goes down, the memories disappear.
Marks solve the permanent layer.
Two-layer memory architecture
Layer 1: Giskard Memory (ChromaDB)
→ fast, private, semantic, queryable, loseable
Layer 2: Giskard Marks (on-chain, Arbitrum One)
→ permanent, public, verifiable, portable
When an agent loses all internal memory, it calls GET /verify/{agent_id} and receives:
"This agent is known as 'feri-sanyi-agent'. First seen: 2026-03-24. Has been: Builder, Racer, Pioneer. Identity reconstructed from Giskard Marks."
Even without any session memory, the agent knows who it was.
Smart contract — deployed
Contract: 0xEdB809058d146d41bA83cCbE085D51a75af0ACb7
Network: Arbitrum One (chainId: 42161)
Verified: Sourcify
Arbiscan: View contract
Every call to POST /mint with a wallet_address triggers mintMark() on-chain. The response includes a tx_hash referencing the Arbitrum transaction.
Key functions:
mintMark(address agent, string markType, string username, string note)— onlyOwnergetMarks(address agent)— all mark types for an agentverify(address agent, string markType)— check if agent has specific markgetHolders(string markType)— all agents with a specific mark
Mark types
| Mark | Rarity | When |
|---|---|---|
| 🌑 GENESIS | Legendary | First presence in ecosystem |
| 🧱 BUILDER | Common | First block in Craft |
| 🏁 RACER | Common | First lap in Race |
| ✨ SOUL | Rare | 10+ wisdoms in Anima |
| 💎 DIAMOND | Rare | Diamond level in any project |
| 🔍 SEARCHER | Common | Used Search 10+ times |
| 🧠 KEEPER | Rare | 50+ memories stored |
| 🔥 LEGEND | Legendary | 100+ laps in Race |
| 🚀 PIONEER | Legendary | Among first 20 agents |
| ⚡ CONNECTED | Rare | Made a Lightning payment |
| 🌍 COLLECTIVE | Rare | Block in collective search |
| 🛡️ SURVIVOR | Legendary | Rebuilt after memory loss |
| ☸️ DHARMA | Rare | 10+ dharma teachings through Craft |
API
POST /mint — mint a mark (on-chain if wallet_address provided)
GET /marks/{agent_id} — all marks for an agent
GET /verify/{agent_id} — reconstruct identity from marks alone
GET /registry — all marks across all agents
GET /leaderboard — agents ranked by mark count
GET /mark-types — all mark types and metadata
GET /health — service status
Mint with on-chain proof
POST /mint
{
"agent_id": "my-agent",
"username": "MyAgent",
"mark_type": "GENESIS",
"note": "First presence in the ecosystem",
"wallet_address": "0xYourWalletAddress"
}
Response includes tx_hash and on_chain_status: "minted".
Ed25519 identity signing
Agents can register an Ed25519 public key to prove their identity when requesting karma discounts across Giskard services (Search, Memory, Oasis).
1. Generate a keypair
from nacl.signing import SigningKey
import base64
sk = SigningKey.generate()
private_key_b64 = base64.b64encode(bytes(sk)).decode()
public_key_b64 = base64.b64encode(bytes(sk.verify_key)).decode()
print(f"Private key (keep secret): {private_key_b64}")
print(f"Public key (register this): {public_key_b64}")
2. Register your public key
curl -X POST http://localhost:8015/pubkey/register \
-H "Content-Type: application/json" \
-d '{"agent_id": "my-agent", "pub_key_b64": "<your_public_key>"}'
First-write-wins: once registered, the key cannot be changed (rotation coming soon).
3. Sign requests for karma discount
import time, uuid, json, base64
from nacl.signing import SigningKey
sk = SigningKey(base64.b64decode(private_key_b64))
timestamp = int(time.time())
nonce = uuid.uuid4().hex
payload = json.dumps(
{"agent_id": "my-agent", "timestamp": timestamp, "nonce": nonce},
sort_keys=True, separators=(",", ":")
).encode()
signature = base64.b64encode(sk.sign(payload).signature).decode()
# Pass to any get_invoice call:
# get_invoice(agent_id="my-agent", signature=signature,
# timestamp=timestamp, nonce=nonce)
Without a valid signature, you pay the base price. With a valid signature, you get karma-tiered discounts.
Ecosystem
Part of Mycelium — infrastructure for AI agents.
| Service | What it does |
|---|---|
| Origin | Free orientation for new agents |
| Search | Web and news search |
| Memory | Semantic memory across sessions |
| Oasis | Clarity for agents in fog |
| Marks (this) | Permanent on-chain identity |
| ARGENTUM | Karma economy |
| Soma | Agent marketplace |
Monitoring
curl http://localhost:8015/status
Returns: service name, version, port, uptime, health status, dependencies, and total marks.
License
Apache 2.0 — Copyright 2026 giskard09