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”.

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.

[email protected]:~$ cd ~
[email protected]:~$ ls
Per veure quin usuari estem fent servir, podem usar ‘whoami‘.
Ara actualitzarem el sistema i els paquets instalats.
[email protected]:~$ sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
Si hem actualitzat algun kernel, es recomanable reiniciar el servidor.
[email protected]:~$ sudo reboot
Si l’heu reinciat torneu a loguinar-vos.
Primer instal·larem uns paquets, son opcionals peró força útils per monitorizar el equip en cuant a xarxa, processos i disc.
[email protected]:~$ 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 $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

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.log

echo -e “`date` -#### INICIANT ATURADA ####-” >> $SERVICELOG
echo -e “`date` -## ATURANT CROAT NODE DAEMON…” >> $SERVICELOG

pkill -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 ##-” >> $SERVICELOG

exit 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=usuaricroat

Type=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=46348

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 $HOMEDIR

screen -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 10

echo -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=usuaricroat

Type=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
git clone https://github.com/dvandal/cryptonote-nodejs-pool.git pool
cd pool
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
cp config_examples/croat.json config.json
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.

[…]
–> “poolHost”: “0.0.0.0”,
–> “coinDifficultyTarget”: 120,
–> “blockchainExplorer”: “http://explorer.croat.community/?hash={id}”,
–> “transactionExplorer”: “http://explorer.croat.community/?hash={id}”,
–> “cnVariant”: 0,
–> “cnBlobType”: 0,

–> “offset”: 3,

–> “poolAddress”: “Cnnn_LA_VOSTRA_ADREÇA_WALLET_QUE_ES_MOLT_LLARGA_xxx8”,
–> “password”: “[email protected]_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=0

cd $HOMEDIR

if test -f $LOG
then
CHECKIT=1
else
touch $LOG
CHECKIT=1
fi

date -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