- 80GB available disk space required.
Open the following ports on the server:
- 8545, 8546 (for HTTP/WebSocket RPC)
- 30303, 30304 (for P2P network communication)
# Install Git
apt install git
# Verify installation
git --version Expected output (version may vary):
git version 1.8.3.1
# Install Golang
apt install golang
# Verify installation (requires version 1.14 or higher)
go version Expected output:
go version go1.15.14 linux/amd64
# Download the SAVW package
wget http://code.savwscan.com/geth-alltools-linux-amd64-1.9.25-e7872729.tar.gz
# Extract the package
tar -xzvf geth-alltools-linux-amd64-1.9.25-e7872729.tar.gz Create a directory to store SAVW node data:
mkdir node Copy the geth executable to the global binary directory:
cp ./geth /usr/local/bin Upload the genesis file savw.json (generated by the first node) to the SAVW directory:
cd savw
ls # Verify the file exists: node/ savw.json Initialize the node using the uploaded genesis file:
geth --datadir node init savw.json Note: --datadir specifies the node data directory.
In the first node’s console, run:
admin.nodeInfo.enode Example output:
"enode://25171137a57910084d605dd417d139e74cfd559722c7fb8e564365efcf2616c21ef3a9b7136f649c5571ea17ec08fb5952027248db0783bb8305ad7793f7f122@15.188.81.51:30303"
Start a subsequent node and access its console:
geth --port 30303 --networkid 321123 --datadir node --maxpeers 5000 --http --http.port 8545 --http.addr 0.0.0.0 --http.corsdomain "" --http.api "eth,net,web3,personal" --ws --ws.addr 0.0.0.0 --ws.port 8546 --allow-insecure-unlock console In the subsequent node’s console, run:
admin.addPeer("enode://620eb3eba5d6c5e55def63ec73f384d62c19eb321e959fd2156594aa818ac8334e7d507e2c5e27a5de59757128f763f669426c87f8600605d3584905dba3afc4@116.24.67.1:30303") Note: If within a local network, replace the IP with the local network IP; otherwise, addPeer will fail.
Check peer information in the console:
admin.peers Example output (successful connection shows the added enode):
[{
caps: ["eth/65", "eth/66", "snap/1"],
enode: "enode://25171137a57910084d605dd417d139e74cfd559722c7fb8e564365efcf2616c21ef3a9b7136f649c5571ea17ec08fb5952027248db0783bb8305ad7793f7f122@15.188.81.51:30303",
id: "ccf430543622baa54e1add4182ca8528093b08d1326c07ff7433da3578461233",
name: "Geth/v1.10.5-unstable-b89016b4-20210728/linux-amd64/go1.15.14",
network: {
inbound: false,
localAddress: "******:53270",
remoteAddress: "******:30303",
static: false,
trusted: false
},
protocols: {
eth: {
difficulty: 1941,
head: "0x9bf4dd6ef1e790db4bbb8d0f97490f46b28a518e56ad2d3b6e72988996922057",
version: 66
},
snap: {
version: 1
}
}
}]
In the console, run (replace 123456 with your password):
personal.newAccount("123456") Example output:
"0xe5289037d47c*********327a23906fef2af1b"
Set the generated account as the coinbase (mining reward destination):
miner.setSAVW("0xe5289037d47c2d*********a23906fef2af1b") Expected output:
true
In the initial node’s console, unlock the coinbase account (use the password from Step 7.1):
personal.unlockAccount(eth.coinbase, "123456", 0) Expected output:
true
Authorize the new node as a signer:
clique.propose("0xe5289037d47c2d18******27a23906fef2af1b", true) Expected output:
true
Check the list of authorized signers:
clique.getSigners() On each node, stop mining temporarily:
miner.stop() Note: If more than one signer node is added, half of the signers must authorize the new node.
In the subsequent node’s console, start mining:
miner.start() A successful start will display mining-related logs.