ποΈObol Key Splitting
Step 1: Clone the charon repo
Clone the charon repo into a new directory called charon-key-splitter
.
cd ~
mkdir charon-key-splitter
cd charon-key-splitter
git clone https://github.com/ObolNetwork/charon.git .
mkdir split_keys
Step 2: Create a directory containing keys to split
Copy the existing validator keystore.json
files into this new folder. Alongside them, with a matching filename but ending with .txt
should be the password to the keystore. E.g., keystore-0.json
keystore-0.txt
. These matching .txt
files can be generated with a bash script.
At the start of this process, you should have a file tree that looks something like this.
βββ charon-key-splitter
βββ split_keys
Β Β βββ keystore-0.json
Β Β βββ keystore-1.json
...
Β Β βββ keystore-*.json
Create the bash script file.
cd split_keys
vim generate_txt_files.sh
#!/bin/bash
# Get the input string (password) from the user
echo "Enter the string (password) to be used in all the .txt files:"
read input_string
# Iterate through all .json files in the directory
for file in *.json; do
# Check if the file is a regular file (not a directory)
if [[ -f "$file" ]]; then
# Get the file name without the extension
filename="${file%.*}"
# Create a .txt file with the same name and add the input string to it
echo "$input_string" > "${filename}.txt"
fi
done
Save this script and make it executable.
chmod +x generate_txt_files.sh
Run the script.
./generate_txt_files.sh
At the end of this process, you should have a tree like this.
βββ split_keys
Β Β βββ keystore-0.json
Β Β βββ keystore-0.txt
Β Β βββ keystore-1.json
Β Β βββ keystore-1.txt
...
Β Β βββ keystore-*.json
Β Β βββ keystore-*.txt
Step 3: Split the keys into keyshares
Split the validator keys into keyshares.
CHARON_VERSION= # E.g. v0.16.0
NETWORK= # E.g. goerli
CLUSTER_NAME= # E.g. EtherfiSoloStaker
WITHDRAWAL_ADDRESS= # Set withdrawal address
FEE_RECIPIENT_ADDRESS= # Set fee recipient address
THRESHOLD= # E.g. 3
NODES= # E.g. 4
docker run --rm -v $(pwd):/opt/charon obolnetwork/charon:${CHARON_VERSION} create cluster --name="${CLUSTER_NAME}" --network="${NETWORK}" --withdrawal-addresses="${WITHDRAWAL_ADDRESS}" --fee-recipient-addresses="${FEE_RECIPIENT_ADDRESS}" --split-existing-keys --split-keys-dir=/opt/charon/split_keys --threshold ${THRESHOLD} --nodes ${NODES}
In the .charon
directory there will now be a cluster
directory containing sub-directories, each named node0
, node1
, etc.
.charon/cluster/
ββ node[0-*]/ Directory for each node
ββ charon-enr-private-key Charon networking private key for node authentication
ββ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes
ββ deposit-data.json Deposit data file is used to activate a Distributed Validator on DV Launchpad
ββ validator_keys Validator keystores and password
ββ keystore-*.json Validator private share key for duty signing
ββ keystore-*.txt Keystore password files for keystore-*.json
Each solo staker participate will receive one of these directories in a compressed format. The exact format depends on the machine being used. The file formats needed for Avado and Dappnode machines are slightly different and are explained below.
Avado requires the files to be uploaded in a .zip
format.
Make sure you are in the .charon/cluster/
directory with all the node*
directories.
For each node directory, compress the folder using the following command:
zip -r node0.zip node0
Last updated