Files
explorer-monorepo/docs/DEPLOYMENT_METHOD_VALIDATOR.md

6.3 KiB

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

# SSH into validator node
ssh root@192.168.11.100

# Or via Proxmox
pct enter 1000

Step 2: Verify Validator Status

# 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

# 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

# Set environment variables
export RPC_URL="http://localhost:8545"
export PRIVATE_KEY="<your-deployer-private-key>"
export GAS_PRICE="20000000000"  # 20 gwei
export GAS_LIMIT="10000000"     # 10M gas

Step 5: Deploy Contract

Method 1: Using forge create

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

# 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

# Get deployed contract address from output
CONTRACT_ADDRESS="<deployed-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:

#!/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