# Instalación y actualización

## Creación de folder para ejecutables

{% hint style="info" %}
Este paso solo se requiere en instalaciones nuevas.
{% endhint %}

Creamos el folder `.local/bin`&#x20;

```
mkdir -p ~/.local/bin
```

## Variables de sistema

A continuación vamos a definir algunas variables necesarias para el correcto funcionamiento de nuestro nodo. Para esto vamos a modificar nuestro archivo `~/.bashrc` y agregamos estas líneas al final:

{% hint style="info" %}
Reemplazar "ubuntu" por el nombre de usuario que corresponda en tu sistema.\
Este paso solo se requiere en instalaciones nuevas.
{% endhint %}

{% code title="\~/.bashrc" %}

```bash
# Cardano node
export PATH="/home/ubuntu/.local/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"
export CARDANO_NODE_SOCKET_PATH=/home/ubuntu/cardano-node/db/block/node.socket
```

{% endcode %}

Luego ejecutamos `source ~/.bashrc` para aplicar los cambios a nuestra sesión actual.

## Instalar ghcup

{% hint style="info" %}
Este paso solo se requiere en instalaciones nuevas.
{% endhint %}

Esta herramienta nos permitirá actualizar `ghc` y `cabal` muy fácilmente de ahora en adelante.

```
mkdir -p ~/src && cd ~/src
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```

Debemos dar *ENTER* por lo menos dos veces par aceptar la instalación de `ghcup` y de sus dependencias. Luego el programa consultará si deseas instalar el HLS, podemos contestar NO y continuar. Finalmente nos preguntará si deseamos que el instalador agregue la ruta de `ghcup` al `$PATH` de nuestro sistema. Se recomienda aceptar estos cambios automáticamente con YES, aunque podemos decirle que NO y copiar los ejecutables a mano o insertar nuestra propia ruta.

## Instalación del compilador de Haskell GHC

{% hint style="info" %}
Si `ghcup list` muestra que tenemos ya la versión recomendada de `ghc`, se puede omitir este paso.
{% endhint %}

Instalamos`ghc`, configuramos la versión a usar por defecto y verificamos.

```
source ~/.bashrc

ghcup upgrade
ghcup list

ghcup install ghc 8.10.7
ghcup set ghc 8.10.7
ghc --version
```

## Instalación de Cabal

{% hint style="info" %}
Si `ghcup list` muestra que tenemos ya la versión recomendada de `cabal`, se puede omitir este paso.
{% endhint %}

{% tabs %}
{% tab title="Nueva instalación" %}

```
ghcup install cabal 3.8.1.0
ghcup set cabal 3.8.1.0
cabal --version

cabal clean && cabal update
```

{% endtab %}

{% tab title="Update de instalación previa" %}

```
ghcup install cabal 3.8.1.0
ghcup set cabal 3.8.1.0
; Con el siguiente comando eliminamos la version previa de Cabal
ghcup rm cabal 3.6.2.0
cabal --version

cabal clean && cabal update
```

{% endtab %}
{% endtabs %}

## Instalación de libsodium

Usamos el fork de `libsodium` mantenido por IOHK.

{% hint style="info" %}
Este paso solo se requiere en instalaciones nuevas o si estas actualizando desde una version previa a la 8.0.0.
{% endhint %}

```
cd ~/src

git clone https://github.com/input-output-hk/libsodium
cd libsodium
git checkout dbb48cc
./autogen.sh
./configure
make
sudo make install
```

## Instalación de libsecp256k1

Descargamos e instalamos `libsecp256k1`

{% hint style="info" %}
Este paso solo se requiere en instalaciones nuevas o si estas actualizando desde una versión previa a la 1.35.0.
{% endhint %}

```
cd ~/src
git clone https://github.com/bitcoin-core/secp256k1
cd secp256k1
git checkout ac83be33
./autogen.sh
./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental
make
sudo make install
```

## Instalación de blst

Primero ubicamos la versión correcta de `blst`:

```
BLST_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/master/flake.lock | jq -r '.nodes.blst.original.ref')
echo "Using blst version: ${BLST_VERSION}"
```

Una vez identificada la versión, la descargamos e instalamos.

<pre><code><strong>cd ~/src
</strong><strong>
</strong><strong>: ${BLST_VERSION:='v0.3.11'}
</strong>git clone --depth 1 --branch ${BLST_VERSION} https://github.com/supranational/blst
cd blst
./build.sh
cat > libblst.pc &#x3C;&#x3C; EOF
prefix=/usr/local
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib
includedir=\${prefix}/include

Name: libblst
Description: Multilingual BLS12-381 signature library
URL: https://github.com/supranational/blst
Version: ${BLST_VERSION#v}
Cflags: -I\${includedir}
Libs: -L\${libdir} -lblst
EOF
sudo cp libblst.pc /usr/local/lib/pkgconfig/
sudo cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp  /usr/local/include/
sudo cp libblst.a /usr/local/lib
sudo chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}
</code></pre>

## Clonar repositorio cardano-node

{% hint style="info" %}
Este paso solo se requiere en instalaciones nuevas.
{% endhint %}

```
cd ~
git clone https://github.com/input-output-hk/cardano-node.git
cd cardano-node
```

## Instalar cardano-node y cardano-cli

```
cd ~/cardano-node
git fetch --all --recurse-submodules --tags
git checkout tags/8.9.0

echo "with-compiler: ghc-8.10.7" >> cabal.project.local

cabal update
cabal build all
```

{% hint style="warning" %}
Si estas actualizando desde una versión anterior a 8.0.0, necesitarás ademas descargar el archivo `conway-genesis.json` y modificar tu `config.json` o descargarlo nuevamente.

<https://book.world.dev.cardano.org/environments/mainnet/>
{% endhint %}

## Backup de los ejecutables

{% hint style="warning" %}
Este paso solo es necesario en ACTUALIZACIONES
{% endhint %}

Hacemos una copia de los ejecutables actuales por si llegase a fallar algo, así tenemos un rollback inmediato.

```
cd ~/.local/bin
cp cardano-node cardano-node.8.8.2
cp cardano-cli cardano-cli.8.8.2
```

## Copiar ejecutables a nuestro folder bin

Para actualizar los ejecutables es posible que tengas que detener tu nodo primero con:\
`sudo systemctl stop <NOMBRE-DE-SERVICIO>`

```
cd ~/cardano-node
cp -p "$(./scripts/bin-path.sh cardano-node)" ~/.local/bin/
cp -p "$(./scripts/bin-path.sh cardano-cli)" ~/.local/bin/

# Opcional si deseamos instalar el cardano-submit-api
cp -p "$(./scripts/bin-path.sh cardano-submit-api)" ~/.local/bin/
```

Podemos verificar que hemos realizado correctamente la instalación con:\
`cardano-cli --version && cardano-node --version`

## Reiniciar nodo

Dependiendo de como administres tus nodos éste método puede variar, por lo general un comando similar a:

```
sudo systemctl restart <NOMBRE-DE-SERVICIO>
```
