A continuació detallem un seguit de passos per prepar un Grup de Mineria, no és necessari ser un usuari expert per acconseguir-ho però si que en algun punt sigui interessant poder tenir uns coneixaments bàsics de Linux… Comencem?
Primer de tot cal saber que un grup de mineria, o Pool, ha de ser un equip que estigui operatiu les 24 hores del dia, per tant “tot i que fem servir una màquina virtual en un pc per ensenyar com s’instal·la”, recomenem llogar un servidor al “núvol”.
Hi ha un script per instalació i configuració en el següent enllaç.
Utilizarem un Sistema Operatiu Ubuntu 20.04 server, la imatge en concret que utilitzem en aquest cas és (ubuntu-20.04.3-live-server-amd64). El nostre usuari es diu (usuaricroat), utilitzeu el vostre usuari en el seu lloc segons la ruta que us mostrem… pero mai utilitzeu el usuari root.
ENTREM AL SERVIDOR
Si ens validem amb el nostre usuari podem revisar el directori d’inici que serà (/home/usuari/), només començar estarà buit.
usuaricroat@ubuntuserver01:~$ cd ~ usuaricroat@ubuntuserver01:~$ ls
usuaricroat@ubuntuserver01:~$ whoami
usuaricroat@ubuntuserver01:~$ sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
usuaricroat@ubuntuserver01:~$ sudo reboot
usuaricroat@ubuntuserver01:~$ sudo apt install -y net-tools iotop htop
INSTAL·LAR I SINCRONITZAR EL NODE CROAT
Per a tenir un pool, necesitem tenir un node funcional, així que comencem per instal.lar i sincronitzar el node Croat.
Instal.lem les dependencies per compilar.
sudo apt install -y cmake build-essential libboost-all-dev libcurl4-openssl-dev
Descarreguem i compilem el codi font. Aixó trigarà uns minuts i depen de la rapidesa del vostre processador.
git clone https://github.com/CroatApps/Croat.git CroatGit cd CroatGit/ make all
Comprovem que s'hagi compilat correctament. Revisem si tenim els executables croatd i simplewallet
ls -lha build/release/src/croatd ls -lha build/release/src/simplewallet
Creem directori croat i movem els executables
mkdir -p ~/croat cp build/release/src/croatd ~/croat/ cp build/release/src/simplewallet ~/croat/ cd ~/croat
Ara executem el croatd, revisem si arrenca, i l'aturem amb Crtl+C
./croatd Crtl+C
Podem no aturar-lo i deixar-lo uns dies o setmanes a que es sincronit-zi del tot o bé podem copiar la blockchain des de un dels nodes que tinguem actius amb scp o de la última copia que hi ha http://blockchain.croat.community/ que es el que aquí mostrarem.
Per sincronitzar el node de forma rapida exeutarem el següent.
cd ~/.croat rm -r * wget http://blockchain.croat.community/CROAT-BlockChain-LAST.tar.gz tar -xvf CROAT-BlockChain-LAST.tar.gz rm CROAT-BlockChain-LAST.tar.gz
Tornem a executar el node per acabar de sincronitzar i sortiem amb Crtl+C una vegada tinguem el SYNCHRONIZED: OK
cd ~/croat ./croatd Crtl+C
Ara generem les carpetes, la configuració i els scripts d'inici/aturada i els de systemd
mkdir ~/croat/logs mkdir ~/croat/config mkdir ~/croat/scripts
Creem el fitxer de la configuració del croatd.
nano ~/croat/config/croat.conf
p2p-bind-port=46347
p2p-bind-ip=0.0.0.0
rpc-bind-port=46348
rpc-bind-ip=0.0.0.0
log-level=2
log-file=/home/usuaricroat/croat/logs/croat.log
restricted-rpc=true
Creem el fitxer scrip d'inici del croatd.
nano ~/croat/scripts/start_croatd.sh
#!/bin/bash
#
#
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }# ON START
_prepare_locking# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1### BEGIN OF SCRIPT ###
HOMEDIR=/home/usuaricroat
SERVICELOG=/home/usuaricroat/croat/logs/service.log
cd $HOMEDIRecho -e "`date` -#### INICIADOR DE CROAT NODE DAEMON ####-" >> $SERVICELOG
pkill -f '/home/usuaricroat/croat/croatd'
echo -e "`date` -## INICIANT CROAT NODE DAEMON..." >> $SERVICELOG
/home/usuaricroat/croat/croatd --config-file=/home/usuaricroat/croat/config/croat.conf --no-console > /dev/null 2>&1 &
echo -e "`date` -## CROAT NODE DAEMON INICIAT..." >> $SERVICELOGexit 0
Creem el fitxer scrip d'aturada del croatd.
nano ~/croat/scripts/stop_croatd.sh
#!/bin/bash
#
#
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }# ON START
_prepare_locking# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1### BEGIN OF SCRIPT ###
SERVICELOG=/home/usuaricroat/croat/logs/service.logecho -e "`date` -#### INICIANT ATURADA ####-" >> $SERVICELOG
echo -e "`date` -## ATURANT CROAT NODE DAEMON..." >> $SERVICELOGpkill -f '/home/usuaricroat/croat/croatd' &
PROC_ID=$!
echo -e "`date` -## ATURANT CROAT NODE DAEMON... PID: $PROC_ID" >> $SERVICELOG
wait $PROC_ID
echo -e "`date` -## FINALITZAT ##-" >> $SERVICELOGexit 0
Els fem executables i comprovem si arrenca el script
chmod +x scripts/*.sh ./scripts/start_croatd.sh ps aux | grep croatd
Si ens mostra una linea semblant a
usuaricroat 12620 0.2 50.9 4473044 4150560 ? S Jun25 2:43 /home/usuaricroat/croat/croatd --config-file=/home/usuaricroat/croat/config/croat.conf --no-console
es que ha arrencat bé i ara l'aturarem amb
./scripts/stop_croatd.sh
En uns segons l'hauria de aturar. També comprovarem si els ha arrencat i aturat i esta en el registre del serveis.
cat logs/service.log
Ens mostra la data i el que ha fet, hauria d'haver una serie de linies indicant quan ha iniciat i quan s'ha aturat.
Ara fem que sigui tot automàtic amb el systemd.
sudo nano /etc/systemd/system/croatd.service
[Unit]
Description=Croat Daemon Full Node
After=network.target[Service]
User=usuaricroat
Group=usuaricroatType=forking
ExecStart=/home/usuaricroat/croat/scripts/start_croatd.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=croatd-service
ExecStop=/home/usuaricroat/croat/scripts/stop_croatd.sh
Restart=on-failure[Install]
WantedBy=multi-user.target
Recarguem el systemd i fem comprovacions
sudo systemctl daemon-reload sudo systemctl status croatd.service
Hauria de dir que esta "loaded" i "inactive"
L'iniciem
sudo systemctl start croatd.service sudo systemctl status croatd.service
Hauria de dir que esta "loaded" i "active".
L'aturem
sudo systemctl stop croatd.service sudo systemctl status croatd.service
Ens indica que torna a estar "loaded" i "inactive"
Per activar-lo com a servei d'arranc en el sistema
sudo systemctl enable croatd.service
I el deixem iniciat
sudo systemctl start croatd.service
Ara ja disposem d'un node croat actiu i sincronitzat
CREAR MONEDER I PERMETRE CONEXIONS RPC
Ara necesitem general la billetera per el pool.
cd ~/croat/ ./simplewallet
G [i premer enter]
poolwallet [indicar el nom, en aquest exemple es poolwallet, i enter]
pass1234567890 [indicar la contrasenya per exemple pass1234567890, i enter]
pass1234567890 [tornar a escriure la contrasenya pass1234567890, i enter]
Esperem fins que ens apareixeri que tenim una frase mnemotècnica de 25 paraules i ens aparegui un promp groc. Heu de guardar aquestes paraules en un lloc segur.
exit
Amb exit sortim, pero us recomano guardar les claus privades
export_keys
Us apareix en pantalla una llista de claus, Spend, View i Private, les heu de uardar amb la frase mnemotècnica en un lloc segur.
Un cop tenim tot aixó ben guardat, repasseu que ho teniu tot es molt important i no es podria recuperar el wallet sense elles.
Nem a configurar el simplewallet
nano config/simplewalletd.conf
data-dir=/home/usuaricroat/.croat
wallet-file=/home/usuaricroat/croat/poolwallet.wallet
password=pass1234567890
rpc-bind-ip=127.0.0.1
rpc-bind-port=46349
daemon-port=46348log-file=/home/usuaricroat/logs/simplewallet.log
Ara l'executem
./simplewallet --config-file config/simplewalletd.conf
Ens ha de apareixer el nostre poolwallet obert automaticament. exit per sortir
exit
Ara ho farem que carregui automaticament com a servei systemd, necesitem el screen aixi que comprovem si el tenim instal·lat
screen -v
Si no veiem la versio o ens dona un error que no el troba, l'instal·larem amb:
sudo apt install -y screen
Creem els script
nano scripts/start_simplewalletd.sh
#!/bin/bash
#
#
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }# ON START
_prepare_locking# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1### BEGIN OF SCRIPT ###
HOMEDIR=/home/usuaricroat/croat
SERVICELOG=/home/usuaricroat/croat/logs/service.log
cd $HOMEDIRscreen -dmS simplewallet ./simplewallet --config-file config/simplewalletd.conf
echo -e "`date` -## INICIANT WALLET ..." >> $SERVICELOG
exit 0
nano scripts/stop_simplewalletd.sh
#!/bin/bash
#
#
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }# ON START
_prepare_locking# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1### BEGIN OF SCRIPT ###
SERVICELOG=/home/usuaricroat/croat/logs/service.log
screen -S simplewallet -p 0 -X stuff "^C"
sleep 10echo -e "`date` -## ATURANT WALLET ..." >> $SERVICELOG
exit 0
Els fem executables.
chmod +x scripts/*sh
Procedim a crear el fitxer per el systemd
sudo nano /etc/systemd/system/simplewalletd.service
[Unit]
Description=SimpleWallet Croat Daemon RPC
After=croatd.service[Service]
User=usuaricroat
Group=usuaricroatType=forking
ExecStart=/home/usuaricroat/croat/scripts/start_simplewalletd.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=simplewalletd-service
ExecStop=/home/usuaricroat/croat/scripts/stop_simplewalletd.sh
Restart=on-failure[Install]
WantedBy=multi-user.target
I recarguem i comprovem
sudo systemctl daemon-reload sudo systemctl status simplewalletd.service
Loaded i inactive
Ara l'iniciem.
sudo systemctl start simplewalletd.service sudo systemctl status simplewalletd.service
Loaded i active
Ara l'aturem.
sudo systemctl stop simplewalletd.service sudo systemctl status simplewalletd.service
Loaded i inactive
I ara l'habilitem al inici i el deixem iniciat.
sudo systemctl enable simplewalletd.service sudo systemctl start simplewalletd.service
Si tot ha anat com hauria, podem comprovar els seguents ports oberts:
sudo netstat -ntlp
El port 46348 es el que usa el simplewallet, el 46346 i 46347 son els del croatd.
Si estan, podem continuar amb el pool.
INSTAL·LAR I CONFIGURAR POOL
Ara que ja esta el node croat iniciat i sincronitzat, i tenim la wallet i el rpc, procedim amb la instal.lació del pool i el servidor web.
Comencem carregant els repos del node i del redis
cd ~ curl -fsSL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo add-apt-repository ppa:chris-lea/redis-server
Premem Enter cuan ens ho demani el add-apt per aceptar la insersió del repo.
Actualizem els repos i instalem els paquets.
sudo apt install -y nodejs redis-server
Tunegem una mica el redis per adaptar-lo per el pool.
Comprovem si tenim el rc.local actiu (per defecte no ho esta)
sudo systemctl status rc-local
Ens indica "inactive", doncs es que no esta carregat.
***Si esta actiu i ja esta activat, no cal seguir amb el següent pas, peró reviseu el rc.local i el redis si ja arrenca amb "transparent huge page".
Crearem els scripts i l'iniciarem
sudo nano /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99[Install]
WantedBy=multi-user.target
sudo nano /etc/rc.local
#!/bin/bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 1024 > /proc/sys/net/core/somaxconn
systemctl restart redis-server.service
exit 0
El fem executable, l'habilitem al inici i l'arrenquem i veiem l'estat
sudo chmod +x /etc/rc.local sudo systemctl enable rc-local sudo systemctl start rc-local.service sudo systemctl status rc-local.service
Ens ha de indicar "active i running".
Habilitem el redis al inici i el modifiquem entre ExecStart i ExecStop, per afegir la linea extra de ExecStartPost, la resta es queda tot igual.
sudo systemctl enable redis-server sudo nano /etc/systemd/system/redis.service
[...]
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid"
ExecStop=/bin/kill -s TERM $MAINPID
[...]
Recarguem, reiniciem el servei i comprovem l'estat
sudo systemctl daemon-reload sudo systemctl restart redis.service sudo systemctl status redis.service
No hauria de reportar el error del huges pages i estar iniciat "loaded i running".
Instal·lem les llibreries i el pool
sudo apt install -y libssl-dev libboost-all-dev libsodium-dev jq git clone git clone https://github.com/jowy81/croat-nodejs-pool.git pool cd pool git config --global url."https://github.com/".insteadOf git://github.com/ npm update
Trigara una estona, neu a pendre un café que teniu temps.
Un cop acabi ens reporta alguns warnings de dependencies obsoletes pero no ens ha de donar cap error.
Copiem el croat.coin example i fem que ens mostri la nostra adreça del wallet per pantalla.
cd ~/pool cat ../croat/poolwallet.address && echo ""
Heu de copiar aquesta adreça, useu un bloc de notes o algo extern
Ara editarem el fitxer config.json i l'heu de adaptar, us marco els punts més importants a tenir iguals, tot i que hi haura la exepció de l'adreça del vostre wallet i la vostra contrasenya per l'apartat d'administració del pool.
[...]
--> "poolHost": "0.0.0.0",--> "poolAddress": "Cnnn_LA_VOSTRA_ADREÇA_WALLET_QUE_ES_MOLT_LLARGA_xxx8",
--> "password": "La_vostr@_contrasenya",
[...]
Si voleu reviseu tots els altres camps per si voleu ajustar-ne algun altre.
Aquest modificats son els minims i bàsics, pero hi han altres opcions, com ara SSL, telegram, etc ...
Ja el podem arrencar (ens donara algún warning/error como ara el SSL, si hi ha algun altre error, premeu Ctrl+C i reviseu-ho...)
node init.js
Ens anira indicant qu eetsa arrencat i que va fent. L'aturem amb Crtl+C i crearem els scripts d'inici i aturada
sudo nano /etc/systemd/system/croat-pool.service
[Unit]
Description=Croat Pool Service
After=network.target redis-server.service simplewalletd.service[Service]
User=usuaricroat
Group=usuaricroat
Type=simple
Restart=always
SyslogIdentifier=croat-pool
ExecStart=/usr/bin/node init.js
WorkingDirectory=/home/usuaricroat/pool[Install]
WantedBy=multi-user.target
Recarguem el systemd i mirem de iniciar el pool com a servei
sudo systemctl daemon-reload sudo systemctl status croat-pool.service sudo systemctl start croat-pool.service sudo systemctl status croat-pool.service sudo systemctl stop croat-pool.service sudo systemctl status croat-pool.service sudo systemctl enable croat-pool.service sudo systemctl start croat-pool.service
Com hem fet fins ara, els executarem un a un i veurem si arrenca i atura amb la comanda status mes amunt.
Si tot ha anat bé i ja el tenim, ara en falta mostrar una pagina on la gent pugui connectar i minar amb el vostre pool, jo prefereixo instal·lar nginx com a servidor web, pero podeu usar apache o cualsevol altre.
L'instal·lem així
sudo apt install -y nginx
Movem el default index i copiem la pool-web a mostrar. Editem el fitxer de configuració, es molt important ficar la vostre ip o FQDN (pool.domini.cat), no modifiqueu el port 8117. També podeu canviar alguna altre opció com idioma, telegram, explorer...
sudo mv /var/www/html/index.nginx-debian.html /var/www/html/index.nginx-debian.html.orig sudo cp -r website_example/* /var/www/html/ sudo nano /var/www/html/config.js
var parentCoin = "COIN";
var api = "http://192.168.1.206:8117";
var poolHost = "192.168.1.206";var email = "[email protected]";
var telegram = "https://t.me/CroatPool";
var discord = "https://discordapp.com/invite/YourPool";var marketCurrencies = ["{symbol}-BTC", "{symbol}-USD", "{symbol}-EUR", "{symbol}-CAD"];
var blockchainExplorer = "http://explorer.croat.community/?hash={id}";
var transactionExplorer = "http://explorer.croat.community/?hash={id}";var themeCss = "themes/default.css";
var defaultLang = "ca";
Una vegada adaptat, accediu des del vostre navegador i ja tindreu el pool creat.
ALTRES CONFIGURACIONS
Per tal d'evitar una problemàtica amb les UTXOs, sha de crear aquest scrip i corre'l cada 15 minuts amb el cron.
nano ~/croat/scipts/optimize_simplewallet.sh
#!/bin/bash
CURL='/usr/bin/curl'
HOMEDIR=/home/admin81/croat/
LOG='logs/optimize_simplewallet.log'
CHECKIT=0cd $HOMEDIR
if test -f $LOG
then
CHECKIT=1
else
touch $LOG
CHECKIT=1
fidate -u >> $LOG
$CURL --location -w "\n" --request POST 'http://127.0.0.1:46349/json_rpc' --data-raw '{"jsonrpc": "2.0","id": "simplewallet","method": "estimate_fusion","params": {"threshold":1000000000000>
$CURL --location -w "\n" --request POST 'http://127.0.0.1:46349/json_rpc' --data-raw '{"jsonrpc": "2.0","id": "simplewallet","method": "send_fusion","params": {"threshold":100000000000000,">
unset CHECKIT
El fem executable, i fiquem al cron
chmod +x optimize_simplewallet.sh crontab -e
Hem de afegir aquesta linia al final.
*/15 * * * * /home/croatadmin/croat/scripts/optimize_simplewallet.sh
Podem revisar si es va executant en el log
tail ~/croat/logs/optimize_simplewallet.log
UTILITATS
Llistat de comandes:
Llistar les pantalles del screen
screen -ls
Conectar al screen simplewallet
screen -r simplewallet
Per sortir del screen prèmer:
Crtl+A+D
Veure l'estat d'un servei, en aquest cas substituir NOM per croatd, simpewalletd, croat-pool, redis-server, nginx...
sudo systemctl status NOM.service
Arrencar un servei
sudo systemctl start NOM.service
Aturar un servei
sudo systemctl stop NOM.service
Reiniciar un servei
sudo systemctl restart NOM.service
Llistar els ports oberts (si usem sudo netstat -ntlp ens mostrara més informació)
netstat -ntlp
Veure els processos, memoria, cpu, del servidor
htop
Veure els processos i el disc del servidor
iotop
TEST
#!/bin/bash
#
#
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99
# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval “exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }
# ON START
_prepare_locking
# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock
# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1
### BEGIN OF SCRIPT ###
HOMEDIR=/home/usuaricroat
SERVICELOG=/home/usuaricroat/croat/logs/service.log
cd $HOMEDIR
echo -e “`date` -#### INICIADOR DE CROAT NODE DAEMON ####-" >> $SERVICELOG
pkill -f ‘/home/usuaricroat/croat/croatd’
echo -e “`date` -## INICIANT CROAT NODE DAEMON…" >> $SERVICELOG
/home/usuaricroat/croat/croatd –config-file=/home/usuaricroat/croat/config/croat.conf –no-console > /dev/null 2>&1 &
echo -e “`date` -## CROAT NODE DAEMON INICIAT…" >> $SERVICELOG
exit 0