Silvia_Prada_Aprilia/vote-block-skripsi/geth-vote/setup.sh
2024-12-31 11:46:10 +07:00

134 lines
4.4 KiB
Bash

#!/bin/bash
# Variables (Set these according to your configuration)
CHAIN_ID=120202
ETHER_AMOUNT="1000000000000000000000000000000" # 1 million Ether in Wei
NETWORK_ID=120202
PASSWORD=12345
# Function to kill any running bootnode process
kill_bootnode() {
local pid
pid=$(pgrep bootnode)
if [[ -n $pid ]]; then
echo "Stopping existing bootnode process (PID: $pid)..."
kill -9 $pid
fi
}
# Function to kill any running geth process
kill_geth() {
local pid
pid=$(pgrep geth)
if [[ -n $pid ]]; then
echo "Stopping existing geth process (PID: $pid)..."
kill -9 $pid
fi
}
# Kill any existing bootnode and geth processes
kill_bootnode
kill_geth
# Remove existing data directories to clear previous state
rm -rf ./node1/data
rm -rf ./node2/data
rm -rf ./node3/data
# Create directories for Node 1 and Node 2
mkdir -p ./node1/data
mkdir -p ./node2/data
mkdir -p ./node3/data
# Create a password file
echo $PASSWORD > password.txt
# Create accounts for both nodes and capture addresses
echo "Creating account for Node 1."
FIRST_NODE_OUTPUT=$(geth --datadir "./node1/data" account new --password password.txt)
echo "$FIRST_NODE_OUTPUT"
FIRST_NODE_ADDRESS=$(echo "$FIRST_NODE_OUTPUT" | grep -oP '(?<=Public address of the key: 0x).*')
echo "Creating account for Node 2."
SECOND_NODE_OUTPUT=$(geth --datadir "./node2/data" account new --password password.txt)
echo "$SECOND_NODE_OUTPUT"
SECOND_NODE_ADDRESS=$(echo "$SECOND_NODE_OUTPUT" | grep -oP '(?<=Public address of the key: 0x).*')
echo "Creating account for Node 3."
THIRD_NODE_OUTPUT=$(geth --datadir "./node3/data" account new --password password.txt)
echo "$THIRD_NODE_OUTPUT"
THIRD_NODE_ADDRESS=$(echo "$THIRD_NODE_OUTPUT" | grep -oP '(?<=Public address of the key: 0x).*')
# Initial signer address is the same as the first node address
INITIAL_SIGNER_ADDRESS=$FIRST_NODE_ADDRESS
# Create the Genesis file
cat <<EOF > genesis.json
{
"config": {
"chainId": $CHAIN_ID,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000${INITIAL_SIGNER_ADDRESS}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"${FIRST_NODE_ADDRESS}": { "balance": "${ETHER_AMOUNT}" },
"${SECOND_NODE_ADDRESS}": { "balance": "${ETHER_AMOUNT}" },
"${THIRD_NODE_ADDRESS}": { "balance": "${ETHER_AMOUNT}" }
}
}
EOF
# Initialize both nodes with the Genesis file
geth --datadir "./node1/data" init genesis.json
geth --datadir "./node2/data" init genesis.json
geth --datadir "./node3/data" init genesis.json
# Create bootnode key
bootnode -genkey boot.key
# Start bootnode and capture enode URL, logging output to bootnode.log
bootnode -nodekey boot.key -verbosity 7 -addr "127.0.0.1:30301" > bootnode.log 2>&1 &
# Wait for bootnode to start and log the enode URL
sleep 5
# Extract enode URL from the bootnode log
BOOTNODE_URL=$(grep -oP 'enode:\/\/[a-zA-Z0-9@:.]+' bootnode.log)
# Append discport if missing
if [[ $BOOTNODE_URL != *"discport"* ]]; then
BOOTNODE_URL="${BOOTNODE_URL}?discport=30301"
fi
# Check if the enode URL is valid
if [[ -z "$BOOTNODE_URL" ]]; then
echo "Error: Failed to retrieve bootnode enode URL."
exit 1
fi
# Save enode URL to file
echo $BOOTNODE_URL > enodeurl
# Start Node 1 and redirect log to node1.log
geth --datadir "./node1/data" --port 30304 --bootnodes "$BOOTNODE_URL" --authrpc.port 8547 --ipcdisable --allow-insecure-unlock --http --http.corsdomain="https://remix.ethereum.org" --http.api web3,eth,debug,personal,net --networkid $NETWORK_ID --unlock 0x$FIRST_NODE_ADDRESS --password password.txt --mine --miner.etherbase=0x$INITIAL_SIGNER_ADDRESS > node1.log 2>&1 &
# Start Node 2 and redirect log to node2.log
geth --datadir "./node2/data" --port 30306 --bootnodes "$BOOTNODE_URL" --authrpc.port 8546 --networkid $NETWORK_ID --unlock 0x$SECOND_NODE_ADDRESS --password password.txt > node2.log 2>&1 &
# Start Node 2 and redirect log to node2.log
geth --datadir "./node3/data" --port 30308 --bootnodes "$BOOTNODE_URL" --authrpc.port 8548 --networkid $NETWORK_ID --unlock 0x$THIRD_NODE_ADDRESS --password password.txt > node3.log 2>&1 &