GUARDIAN CONTRACT TEST COVERAGE: Add complete wallet security test suite New Test File: apps/blockchain-node/tests/test_guardian_contract.py Test Coverage: 1. Contract Initialization Tests (2 tests): - Contract initialization with proper storage - Storage database initialization 2. Spending Limit Tests (4 tests): - Per-transaction limit enforcement - Hourly spending limit checks - Daily spending limit checks - Weekly spending limit checks 3. Transaction Management Tests (6 tests): - Small amount immediate approval - Large amount time lock requirement - Spending limit rejection - Transaction execution success - Transaction not found handling - Time lock enforcement 4. Security Controls Tests (3 tests): - Emergency pause functionality - Emergency unpause with signatures - Spending status reporting 5. Utility Tests (5 tests): - Period key generation for time tracking - Operation hash creation - Configuration properties validation - Nonce increment tracking - Pending operations management Key Features Tested: ✅ Spending limit enforcement (per-transaction, hourly, daily, weekly) ✅ Time lock protection for large transactions ✅ Emergency pause/unpause functionality ✅ Transaction lifecycle management ✅ Persistent storage across instances ✅ Guardian signature validation ✅ Operation hashing and tracking Test Quality: - 20+ comprehensive tests covering all major functionality - Temporary storage fixtures for isolated testing - Mock configuration for realistic test scenarios - Edge case testing and error handling - Security feature validation This provides critical test coverage for the Guardian Contract, ensuring the reliability of wallet protection mechanisms that safeguard agent funds from unauthorized access and excessive spending.
Blockchain Node (Brother Chain)
Production-ready blockchain node for AITBC with fixed supply and secure key management.
Status
✅ Operational — Core blockchain functionality implemented.
Capabilities
- PoA consensus with single proposer
- Transaction processing (TRANSFER, RECEIPT_CLAIM)
- Gossip-based peer-to-peer networking (in-memory backend)
- RESTful RPC API (
/rpc/*) - Prometheus metrics (
/metrics) - Health check endpoint (
/health) - SQLite persistence with Alembic migrations
- Multi-chain support (separate data directories per chain ID)
Architecture
Wallets & Supply
- Fixed supply: All tokens minted at genesis; no further minting.
- Two wallets:
aitbc1genesis(treasury): holds the full initial supply (default 1 B AIT). This is the cold storage wallet; private key is encrypted in keystore.aitbc1treasury(spending): operational wallet for transactions; initially zero balance. Can receive funds from genesis wallet.
- Private keys are stored in
keystore/*.jsonusing AES‑256‑GCM encryption. Password is stored inkeystore/.password(mode 600).
Chain Configuration
- Chain ID:
ait-mainnet(production) - Proposer: The genesis wallet address is the block proposer and authority.
- Trusted proposers: Only the genesis wallet is allowed to produce blocks.
- No admin endpoints: The
/rpc/admin/mintFaucetendpoint has been removed.
Quickstart (Production)
1. Generate Production Keys & Genesis
Run the setup script once to create the keystore, allocations, and genesis:
cd /opt/aitbc/apps/blockchain-node
.venv/bin/python scripts/setup_production.py --chain-id ait-mainnet
This creates:
keystore/aitbc1genesis.json(treasury wallet)keystore/aitbc1treasury.json(spending wallet)keystore/.password(random strong password)data/ait-mainnet/allocations.jsondata/ait-mainnet/genesis.json
Important: Back up the keystore directory and the .password file securely. Loss of these means loss of funds.
2. Configure Environment
Copy the provided production environment file:
cp .env.production .env
Edit .env if you need to adjust ports or paths. Ensure chain_id=ait-mainnet and proposer_id matches the genesis wallet address (the setup script sets it automatically in .env.production).
3. Start the Node
Use the production launcher:
bash scripts/mainnet_up.sh
This starts:
- Blockchain node (PoA proposer)
- RPC API on
http://127.0.0.1:8026
Press Ctrl+C to stop both.
Manual Startup (Alternative)
cd /opt/aitbc/apps/blockchain-node
source .env.production # or export the variables manually
# Terminal 1: Node
.venv/bin/python -m aitbc_chain.main
# Terminal 2: RPC
.venv/bin/bin/uvicorn aitbc_chain.app:app --host 127.0.0.1 --port 8026
API Endpoints
RPC API available at http://127.0.0.1:8026/rpc.
Blockchain
GET /rpc/head— Current chain headGET /rpc/blocks/{height}— Get block by heightGET /rpc/blocks-range?start=0&end=10— Block rangeGET /rpc/info— Chain informationGET /rpc/supply— Token supply (total & circulating)GET /rpc/validators— List of authoritiesGET /rpc/state— Full state dump
Transactions
POST /rpc/sendTx— Submit transaction (TRANSFER, RECEIPT_CLAIM)GET /rpc/transactions— Latest transactionsGET /rpc/tx/{tx_hash}— Get transaction by hashPOST /rpc/estimateFee— Estimate fee
Accounts
GET /rpc/getBalance/{address}— Account balanceGET /rpc/address/{address}— Address details + txsGET /rpc/addresses— List active addresses
Health & Metrics
GET /health— Health checkGET /metrics— Prometheus metrics
Note: Admin endpoints (/rpc/admin/*) are disabled in production.
Multi‑Chain Support
The node can run multiple chains simultaneously by setting supported_chains in .env as a comma‑separated list (e.g., ait-mainnet,ait-testnet). Each chain must have its own data/<chain_id>/genesis.json and (optionally) its own keystore. The proposer identity is shared across chains; for multi‑chain you may want separate proposer wallets per chain.
Keystore Management
Encrypted Keystore Format
- Uses Web3 keystore format (AES‑256‑GCM + PBKDF2).
- Password stored in
keystore/.password(chmod 600). - Private keys are never stored in plaintext.
Changing the Password
# Use the keystore.py script to re‑encrypt with a new password
.venv/bin/python scripts/keystore.py --name genesis --show --password <old> --new-password <new>
(Not yet implemented; currently you must manually decrypt and re‑encrypt.)
Adding a New Wallet
.venv/bin/python scripts/keystore.py --name mywallet --create
This appends a new entry to allocations.json if you want it to receive genesis allocation (edit the file and regenerate genesis).
Genesis & Supply
- Genesis file is generated by
scripts/make_genesis.py. - Supply is fixed: the sum of
allocations[].balance. - No tokens can be minted after genesis (
mint_per_unit=0). - To change the allocation distribution, edit
allocations.jsonand regenerate genesis (requires consensus to reset chain).
Development / Devnet
The old devnet (faucet model) has been removed. For local development, use the production setup with a throwaway keystore, or create a separate ait-devnet chain by providing your own allocations.json and running scripts/make_genesis.py manually.
Troubleshooting
Genesis missing: Run scripts/setup_production.py first.
Proposer key not loaded: Ensure keystore/aitbc1genesis.json exists and keystore/.password is readable. The node will log a warning but still run (block signing disabled until implemented).
Port already in use: Change rpc_bind_port in .env and restart.
Database locked: Delete data/ait-mainnet/chain.db and restart (only if you're sure no other node is using it).
Project Layout
blockchain-node/
├── src/aitbc_chain/
│ ├── app.py # FastAPI app + routes
│ ├── main.py # Proposer loop + startup
│ ├── config.py # Settings from .env
│ ├── database.py # DB init + session mgmt
│ ├── mempool.py # Transaction mempool
│ ├── gossip/ # P2P message bus
│ ├── consensus/ # PoA proposer logic
│ ├── rpc/ # RPC endpoints
│ └── models.py # SQLModel definitions
├── data/
│ └── ait-mainnet/
│ ├── genesis.json # Generated by make_genesis.py
│ └── chain.db # SQLite database
├── keystore/
│ ├── aitbc1genesis.json
│ ├── aitbc1treasury.json
│ └── .password
├── scripts/
│ ├── make_genesis.py # Genesis generator
│ ├── setup_production.py # One‑time production setup
│ ├── mainnet_up.sh # Production launcher
│ └── keystore.py # Keystore utilities
└── .env.production # Production environment template
Security Notes
- Never expose RPC API to the public internet without authentication (production should add mTLS or API keys).
- Keep keystore and password backups offline.
- The node runs as the current user; ensure file permissions restrict access to the
keystore/anddata/directories. - In a multi‑node network, use Redis gossip backend and configure
trusted_proposerswith all authority addresses.