Base L2 Testnet Anchor Walkthrough
Anchor an Attestix artefact hash to Base L2 testnet via the Ethereum Attestation Service. End-to-end guide with Sepolia faucets, gas estimates, and verification.
This guide walks through anchoring an Attestix identity or credential to Base L2 testnet (Sepolia). Mainnet schema registration is planned for a future release; testnet is the default target today.
Why anchor?
An Attestix artefact (identity, credential, audit batch) is already Ed25519-signed and hash-chained. Anchoring commits the hash to a public ledger so any third party can:
- Confirm the artefact existed at a specific block height.
- Detect silent mutation of the local store.
- Link an Attestix issuer DID to an on-chain provenance record.
Anchoring is optional. Attestix works fully offline without it.
Prerequisites
pip install attestixYou will need:
- A Base Sepolia RPC endpoint.
- A funded wallet on Base Sepolia (0.001 ETH is plenty, free from public faucets).
- The EAS schema UID for Attestix. This ships with the package.
Step 1 / Configure the testnet RPC
export BASE_RPC_URL=https://sepolia.base.org
export EVM_PRIVATE_KEY=0xyour_private_key_hex_hereOr via .env:
BASE_RPC_URL=https://sepolia.base.org
EVM_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000EVM_PRIVATE_KEY is the full hex private key with the 0x prefix. Treat it as a secret. Never commit it. Never share it. Use a dedicated test wallet for testnet work; do not reuse mainnet keys.
Step 2 / Fund the wallet
Use any Base Sepolia faucet. Recommended:
- Coinbase Developer Platform faucet for Base Sepolia: https://portal.cdp.coinbase.com/products/faucet
- Alchemy Base Sepolia faucet: https://www.alchemy.com/faucets/base-sepolia
Send around 0.001 ETH to the address derived from EVM_PRIVATE_KEY.
Check balance via the Attestix CLI:
attestix blockchain balanceOr programmatically in Python:
from services.blockchain_service import BlockchainService
svc = BlockchainService()
print(svc.balance()) # e.g. 0.0012 ETH on Base SepoliaStep 3 / Estimate cost
svc.estimate_anchor_cost(artifact_id="attestix:f9bdb7a94ccb40f1")Typical numbers on Base Sepolia:
| Field | Value |
|---|---|
| Gas | ~48,000 |
| Gas price | ~1 gwei |
| Total | under $0.01 (testnet ETH has no market value) |
Step 4 / Anchor an identity
tx_hash = svc.anchor_identity(agent_id="attestix:f9bdb7a94ccb40f1")
print(tx_hash) # -> 0x8f2e4c9b...Step 5 / Anchor a credential
tx_hash = svc.anchor_credential(credential_id="urn:uuid:9e2f7a3c-...")Step 6 / Anchor a batch
Merkle-batch 100 artefacts into a single on-chain write:
tx_hash = svc.anchor_audit_batch(
artifact_ids=[...], # up to 10,000 per batch
)Gas cost stays ~48k regardless of batch size. The proof size grows as O(log n) per artefact.
Step 7 / Verify an anchor
status = svc.verify_anchor(artifact_id="attestix:f9bdb7a94ccb40f1")
# -> { "confirmed": True, "block": 23047881, "tx": "0x8f2e...", "schema": "AttestixAgentIdentityV1" }Run this on a different machine to prove the local store has not been tampered with.
Step 8 / Inspect on a block explorer
Paste the tx hash into Base Sepolia block explorer. You will see:
- The EAS attestation call
- The Attestix schema reference
- The artefact hash as a bytes32 field
Anyone can run the same verification without contacting Attestix or VibeTensor.
Troubleshooting
Error: BASE_RPC_URL not set
See configuration for all environment variables.
Error: insufficient funds
Top up the wallet at a Base Sepolia faucet.
Error: schema UID mismatch
Upgrade to the latest Attestix package: pip install --upgrade attestix.
Mainnet status
Mainnet schema registration is on the roadmap. Once the mainnet schema is registered and validated, BASE_RPC_URL can be pointed at https://mainnet.base.org and the same flow applies with real gas cost. Until then, use testnet.