6.3 KiB
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
-
Validator Node Access
- SSH access to validator node
- Validator node IP: 192.168.11.100-104
- Validator VMID: 1000-1004
-
Network Configuration
- ChainID: 138
- RPC Endpoint: (validator node)
- Deployer Account: (with sufficient balance)
-
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
-
Validator Access
- Validator nodes are critical infrastructure
- Only authorized personnel should access
- Follow network security policies
-
Private Key Security
- Never store private keys on validator nodes
- Use secure key management
- Rotate keys regularly
-
Deployment Verification
- Always verify deployed contracts
- Check contract bytecode matches source
- Test contract functions after deployment
Network Administrator Contact
If validator deployment also fails:
-
Contact Network Administrators
- Provide deployment logs
- Share diagnostic report
- Request investigation
-
Request Manual Deployment
- Provide contract bytecode
- Request network administrator to deploy
- Verify deployment after completion
Next Steps
After successful deployment:
-
Update Configuration
- Update
.envwith contract address - Update CCIP configuration
- Update token lists
- Update
-
Verify Integration
- Test contract with CCIP bridge
- Verify token transfers work
- Check event emissions
-
Document Deployment
- Record deployment details
- Update deployment documentation
- Share with team
Last Updated: 2025-01-12