A truly decentralized blockchain node implementation that prioritizes accessibility, fairness, and real-world utility over speculation and wealth concentration.
- True Decentralization: Anyone can participate without expensive hardware or large token stakes
- Collaborative Consensus: Energy-efficient, work-based consensus mechanism
- Multi-Runtime Support: EVM, SVM, and WASM smart contract execution
- Web2 Integration: Service bus for seamless traditional application integration
- Modular Architecture: Pluggable components for future extensibility
- Fair Launch: No pre-mine, no ICO, earn through contribution
βββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββββββββββ
β Consensus β Database β Network β
β Module β Module β Module β
βββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββ€
β Collaborative β Multi-level β libp2p-based β
β 4-phase β RocksDB β Peer Discovery β
βββββββββββββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββ
βββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββββββββββ
β File System β Virtual Machine β Service Bus β
β Module β Module β Module β
βββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββ€
β IPFS-based β EVM/SVM/WASM β WebSocket + β
β Distributed β Multi-runtime β Webhook Events β
βββββββββββββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββ
Some crates use native dependencies (e.g. RocksDB / zstd / OpenSSL) and require a C toolchain + headers.
- Ubuntu/Debian:
sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev clang libclang-dev cmake
- Fedora/RHEL:
sudo dnf install -y gcc gcc-c++ make pkgconf-pkg-config openssl-devel clang clang-devel cmake
If your repo lives under a GVFS mount (paths containing /gvfs/), Cargoβs file locking inside target/ may fail with Operation not supported (os error 95).
This repoβs makefile/Makefile automatically sets CARGO_TARGET_DIR to a local cache dir in that case.
Additionally, some GVFS/SMB mounts prevent Cargo from updating Cargo.lock. In that case, make build will build from a local rsynced mirror under ~/.cache/catalyst-node/gvfs-workdir/src to avoid lockfile write failures.
# Clone the repository
git clone https://github.com/catalyst-network/catalyst-node
cd catalyst-node
# Set up development environment
make setup
# Build the project
make build
# Run a basic node
make run
# Run as validator
make run-validator
# Run with storage provision
make run-storageThis repo includes a working local testnet harness that runs 3 nodes with:
- deterministic faucet funding
- RPC enabled on node1 (
http://127.0.0.1:8545) - signature + nonce validation
- LSU application into RocksDB state
- DFS-backed LSU sync (CID gossip + local content store)
- persistent mempool with deterministic re-broadcast on restart
Start:
make testnetStop:
make stop-testnetmake testnet blocks (it waits on node processes). For day-to-day testing, use:
make testnet-up
make testnet-status
make testnet-basic-test
make testnet-downTail logs:
make testnet-logs NODE=node1This uses a deterministic initcode fixture (testdata/evm/return_2a_initcode.hex) that deploys a contract which returns 0x2a on empty calldata.
make testnet-up
make testnet-contract-test
make testnet-downRuns an end-to-end test that:
- starts the 3-node testnet
- submits a faucet transaction to node1
- restarts node1 to test mempool persistence + rehydrate + deterministic re-broadcast
- verifies node1 balance increases
- stops the testnet
make smoke-testnetLogs:
testnet/node1/logs/stdout.logtestnet/node2/logs/stdout.logtestnet/node3/logs/stdout.log
Get node1 public key (used as the βaddressβ in this scaffold):
NODE1_PUBKEY=$(grep -a "Node ID:" -m1 testnet/node1/logs/stdout.log | awk '{print $NF}')
echo "node1_pubkey=$NODE1_PUBKEY"Send 25 units from the faucet:
cargo run -p catalyst-cli -- send $NODE1_PUBKEY 25 --key-file testnet/faucet.key --rpc-url http://127.0.0.1:8545Check node1 balance:
cargo run -p catalyst-cli -- balance $NODE1_PUBKEY --rpc-url http://127.0.0.1:8545Peers:
cargo run -p catalyst-cli -- peers --rpc-url http://127.0.0.1:8545Head:
cargo run -p catalyst-cli -- status --rpc-url http://127.0.0.1:8545Nonce (faucet):
FAUCET_PUBKEY=$(python3 -c 'print("fa"*32)')
curl -s -X POST http://127.0.0.1:8545 -H 'content-type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"catalyst_getNonce\",\"params\":[\"0x${FAUCET_PUBKEY}\"]}"
echoPending protocol transactions are persisted in RocksDB and reloaded on startup. On restart, node1 will:
- rehydrate the mempool from persisted txs (after revalidation)
- deterministically rebroadcast them periodically (stable txid order)
- prune them once their sender nonce is applied (LSU application)
# Build Docker image
make docker-build
# Run with Docker
make docker-runYou can run a single-node βdevnetβ that:
- listens on a public P2P port
- exposes RPC externally (binds to
0.0.0.0) - prints the bootstrap multiaddr + RPC URL to share
- Config template:
crates/catalyst-config/configs/public_testnet.toml - Minimal runbook:
docs/public_testnet_runbook.md
Start (replace HOST with your public IP or DNS name):
make devnet-up HOST=<public_ip_or_dns> P2P_PORT=30333 RPC_PORT=8545Stop:
make devnet-downOn a remote machine, they run their node and point it at your bootstrap address:
cargo run -p catalyst-cli -- start \
--validator --rpc --rpc-address 127.0.0.1 --rpc-port 8545 \
--bootstrap-peers "/ip4/<HOST>/tcp/30333"This repo currently has a scaffolded SmartContract transaction flow:
catalyst deploy <bytecode_file>stores contract bytecode underevm:code:<addr20>catalyst_getCodereturns that stored bytecodecatalyst callis a placeholder (no real EVM bytecode execution yet)
# Basic node (user role)
catalyst start
# Validator node with RPC
catalyst start --validator --rpc
# Storage provider node
catalyst start --storage --storage-capacity 100
# Full node (validator + storage + RPC)
catalyst start --validator --storage --rpcCreate a configuration file:
# Generate default configuration
catalyst start --config catalyst.toml
# Generate node identity
catalyst generate-identity --output identity.json
# Create genesis configuration
catalyst create-genesis --output genesis.json# Check node status
catalyst status
# View connected peers
catalyst peers
# Send KAT tokens
catalyst send <recipient_address> <amount> --key-file wallet.key
# Check account balance
catalyst balance <address>
# Deploy a smart contract
catalyst deploy contract.bytecode --runtime evm --key-file wallet.key
# Call a smart contract
catalyst call <contract_address> "transfer(address,uint256)" --key-file wallet.keycatalyst-node/
βββ crates/
β βββ catalyst-core/ # Core traits and types
β βββ catalyst-consensus/ # Collaborative consensus implementation
β βββ catalyst-network/ # P2P networking (libp2p)
β βββ catalyst-storage/ # RocksDB storage layer
β βββ catalyst-runtime-evm/ # Ethereum Virtual Machine runtime
β βββ catalyst-runtime-svm/ # Solana Virtual Machine runtime
β βββ catalyst-service-bus/ # Web2 integration service bus
β βββ catalyst-dfs/ # IPFS-based distributed file system
β βββ catalyst-crypto/ # Cryptographic utilities
β βββ catalyst-rpc/ # JSON-RPC server
β βββ catalyst-config/ # Configuration management
β βββ catalyst-utils/ # Common utilities
β βββ catalyst-cli/ # Command-line interface
βββ configs/ # Configuration files
βββ docs/ # Documentation
βββ scripts/ # Build and deployment scripts
βββ tests/ # Integration tests
# Format code
make fmt
# Run lints
make clippy
# Run tests
make test
# Run benchmarks
make bench
# Generate documentation
make docs
# Start local testnet
make testnet
# Watch for changes
make watch- Create a new crate:
cargo new --lib crates/catalyst-my-module - Add to workspace in root
Cargo.toml - Implement the appropriate trait from
catalyst-core - Register in the main node configuration
Example module implementation:
use async_trait::async_trait;
use catalyst_core::{CatalystModule, CatalystResult};
pub struct MyModule {
// Module state
}
#[async_trait]
impl CatalystModule for MyModule {
fn name(&self) -> &'static str {
"my-module"
}
fn version(&self) -> &'static str {
"0.1.0"
}
async fn initialize(&mut self) -> CatalystResult<()> {
// Initialize module
Ok(())
}
async fn start(&mut self) -> CatalystResult<()> {
// Start module processing
Ok(())
}
async fn stop(&mut self) -> CatalystResult<()> {
// Stop module gracefully
Ok(())
}
async fn health_check(&self) -> CatalystResult<bool> {
// Check module health
Ok(true)
}
}Connect traditional applications to blockchain events:
// Node.js example
const CatalystServiceBus = require('catalyst-service-bus');
const bus = new CatalystServiceBus('ws://localhost:8546');
// Listen for token transfers
bus.on('token_transfer', (event) => {
console.log('Token transfer:', event);
// Update your traditional database
updateUserBalance(event.to_address, event.amount);
// Send notification
sendPushNotification(event.to_address, 'Payment received');
});
bus.connect();# Python example
from catalyst_service_bus import ServiceBus
bus = ServiceBus('ws://localhost:8546')
@bus.on('contract_event')
def handle_contract_event(event):
if event.event_name == 'Transfer':
# Process transfer event
process_transfer(event.data)
bus.start()Deploy existing Ethereum contracts:
# Deploy with Hardhat/Truffle configuration
npx hardhat deploy --network catalyst
# Or use Catalyst CLI directly
catalyst deploy MyContract.sol --runtime evm --args "constructor_arg"- Fair Launch: No pre-mine, no ICO
- Work-Based Rewards: Earn through network contribution
- Dynamic Supply: 1-2% annual inflation based on network needs
- Low Fees: Optimized for usage, not speculation
- Validator Rewards: Participate in consensus
- Storage Rewards: Provide file storage
- Compute Rewards: Execute smart contracts
- Development Rewards: Contribute code
Minimum (User Node):
- 2 CPU cores
- 4 GB RAM
- 20 GB storage
- Broadband internet
Recommended (Validator):
- 4 CPU cores
- 8 GB RAM
- 100 GB SSD storage
- Stable internet connection
No Special Hardware Required - runs on commodity computers
- Byzantine Fault Tolerance: Secure with <33% malicious nodes
- Sybil Resistance: Resource proofs prevent fake nodes
- Economic Security: Attack cost scales with network size
- Curve25519: Elliptic curve for signatures and keys
- Blake2b: Fast, secure hashing
- Bulletproofs: Confidential transaction privacy
- Schnorr Signatures: Efficient signature aggregation
# Run all tests
make test
# Run specific module tests
cargo test --package catalyst-consensus
# Run with output
cargo test -- --nocapture# Run integration tests
make test-integration
# Start local testnet for testing
make testnet# Run performance benchmarks
make bench
# Profile performance
make profile- Technical Consensus Paper - Detailed mathematical specification
- API Documentation - Complete API reference
- Developer Guide - Building on Catalyst
- Node Operator Guide - Running infrastructure
We welcome contributions! Please see our Contributing Guide.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
make test - Submit a pull request
- Format code:
make fmt - Pass lints:
make clippy - Add tests for new features
- Update documentation
This project is licensed under the MIT License - see the LICENSE file for details.
- Discord: Join our Discord
- GitHub: Contribute on GitHub
- Forum: Community Forum
- Documentation: docs.catalyst.network
- β Modular architecture
- β Collaborative consensus
- β EVM compatibility
- β Basic networking
- π Fair launch preparation
- π Service bus implementation
- π SVM runtime integration
- π Mobile applications
- π Developer tools expansion
- π Cross-chain bridges
- π Enterprise tools
- π Additional runtimes
- π Global scaling
Q: How is Catalyst different from Ethereum? A: Catalyst prioritizes accessibility over artificial scarcity. No 32 ETH required to validate, collaborative consensus instead of competitive staking.
Q: Can I run existing Ethereum contracts? A: Yes! Catalyst supports EVM compatibility, so existing Ethereum smart contracts can be deployed without modification.
Q: How do I earn rewards? A: Run a node and contribute resources - validation, storage, or computation. Rewards are proportional to contribution, not capital.
Q: What's the service bus? A: A WebSocket/webhook system that lets traditional web applications receive blockchain events like database triggers.
Q: Is there a token sale? A: No. Catalyst launches fairly like Bitcoin - anyone can run a node and earn from day one.
"The future of blockchain is not about who can afford to participate, but about who chooses to contribute."