# Validator Deployment Guide - ChainID 138 **Date**: 2025-01-12 **Purpose**: Guide for deploying contracts via validator nodes when RPC deployment fails --- ## Overview Validator nodes typically have full network permissions and may be able to deploy contracts even when RPC nodes cannot. This guide explains how to deploy contracts via validator nodes. --- ## Prerequisites 1. **Validator Node Access** - SSH access to validator node - Validator node IP: 192.168.11.100-104 - Validator VMID: 1000-1004 2. **Network Configuration** - ChainID: 138 - RPC Endpoint: (validator node) - Deployer Account: (with sufficient balance) 3. **Required Tools** - Foundry (forge, cast) - SSH access - Contract source code --- ## Step-by-Step Deployment ### Step 1: Access Validator Node ```bash # SSH into validator node ssh root@192.168.11.100 # Or via Proxmox pct enter 1000 ``` ### Step 2: Verify Validator Status ```bash # Check Besu service status systemctl status besu-validator # Check if validator is synced cast block-number --rpc-url http://localhost:8545 # Verify chain ID cast chain-id --rpc-url http://localhost:8545 ``` ### Step 3: Prepare Deployment Environment ```bash # Create deployment directory mkdir -p /tmp/contract-deployment cd /tmp/contract-deployment # Initialize Foundry project forge init --no-git --force . # Copy contract source # (Copy MockLinkToken.sol to src/MockLinkToken.sol) ``` ### Step 4: Configure Deployment ```bash # Set environment variables export RPC_URL="http://localhost:8545" export PRIVATE_KEY="" export GAS_PRICE="20000000000" # 20 gwei export GAS_LIMIT="10000000" # 10M gas ``` ### Step 5: Deploy Contract #### Method 1: Using forge create ```bash forge create src/MockLinkToken.sol:MockLinkToken \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --gas-price "$GAS_PRICE" \ --gas-limit "$GAS_LIMIT" \ --legacy \ --broadcast ``` #### Method 2: Using forge script ```bash # Create deployment script cat > script/DeployMockLinkToken.s.sol << 'EOF' // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import {Script} from "forge-std/Script.sol"; import {MockLinkToken} from "../src/MockLinkToken.sol"; contract DeployMockLinkToken is Script { function run() external returns (MockLinkToken) { vm.startBroadcast(); MockLinkToken token = new MockLinkToken(); vm.stopBroadcast(); return token; } } EOF # Deploy forge script script/DeployMockLinkToken.s.sol:DeployMockLinkToken \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --broadcast \ --gas-price "$GAS_PRICE" \ --gas-limit "$GAS_LIMIT" \ --legacy ``` ### Step 6: Verify Deployment ```bash # Get deployed contract address from output CONTRACT_ADDRESS="" # Verify contract exists cast code "$CONTRACT_ADDRESS" --rpc-url "$RPC_URL" # Test contract functions cast call "$CONTRACT_ADDRESS" "name()" --rpc-url "$RPC_URL" cast call "$CONTRACT_ADDRESS" "symbol()" --rpc-url "$RPC_URL" cast call "$CONTRACT_ADDRESS" "totalSupply()" --rpc-url "$RPC_URL" ``` --- ## Alternative: Direct Validator Deployment Script Create a deployment script that can be run on validator nodes: ```bash #!/usr/bin/env bash # Deploy MockLinkToken on Validator Node set -euo pipefail RPC_URL="${1:-http://localhost:8545}" PRIVATE_KEY="${2:-}" GAS_PRICE="${3:-20000000000}" GAS_LIMIT="${4:-10000000}" if [ -z "$PRIVATE_KEY" ]; then echo "Error: PRIVATE_KEY not provided" exit 1 fi echo "Deploying MockLinkToken..." echo "RPC: $RPC_URL" echo "Gas Price: $GAS_PRICE" echo "Gas Limit: $GAS_LIMIT" echo "" # Deploy DEPLOY_OUTPUT=$(forge create src/MockLinkToken.sol:MockLinkToken \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --gas-price "$GAS_PRICE" \ --gas-limit "$GAS_LIMIT" \ --legacy \ --broadcast 2>&1) echo "$DEPLOY_OUTPUT" # Extract contract address CONTRACT_ADDRESS=$(echo "$DEPLOY_OUTPUT" | grep -oE "Deployed to: 0x[0-9a-fA-F]{40}" | awk '{print $3}' || echo "") if [ -n "$CONTRACT_ADDRESS" ]; then echo "" echo "✅ Contract deployed: $CONTRACT_ADDRESS" echo "" echo "Verifying deployment..." CODE=$(cast code "$CONTRACT_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "") if [ -n "$CODE" ] && [ "$CODE" != "0x" ] && [ ${#CODE} -gt 100 ]; then echo "✅ Contract verified on-chain" else echo "⚠️ Contract not found on-chain" fi else echo "❌ Deployment failed" exit 1 fi ``` --- ## Troubleshooting ### Issue: Cannot Access Validator Node **Solution**: - Verify SSH access is configured - Check Proxmox container status - Ensure network connectivity ### Issue: Validator Not Synced **Solution**: - Wait for validator to sync - Check validator logs: `journalctl -u besu-validator -f` - Verify validator is producing blocks ### Issue: Deployment Still Fails **Solution**: - Check validator logs for errors - Verify deployer account has sufficient balance - Try with different gas settings - Check if validator has deployment permissions --- ## Security Considerations 1. **Validator Access** - Validator nodes are critical infrastructure - Only authorized personnel should access - Follow network security policies 2. **Private Key Security** - Never store private keys on validator nodes - Use secure key management - Rotate keys regularly 3. **Deployment Verification** - Always verify deployed contracts - Check contract bytecode matches source - Test contract functions after deployment --- ## Network Administrator Contact If validator deployment also fails: 1. **Contact Network Administrators** - Provide deployment logs - Share diagnostic report - Request investigation 2. **Request Manual Deployment** - Provide contract bytecode - Request network administrator to deploy - Verify deployment after completion --- ## Next Steps After successful deployment: 1. **Update Configuration** - Update `.env` with contract address - Update CCIP configuration - Update token lists 2. **Verify Integration** - Test contract with CCIP bridge - Verify token transfers work - Check event emissions 3. **Document Deployment** - Record deployment details - Update deployment documentation - Share with team --- **Last Updated**: 2025-01-12