diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c0f1c2 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# ALASTRIA # + +## Requisitos del sistema + +Caracteristicas de la máquina: + +* **CPU's**: 2 + +* **Memoria**: 4 Gb + +* **Disco duro**: 30 Gb + +* **Sistema operativo**: Ubuntu 16.04 64 bits + +Es necesario habilitar los siguientes puertos de E/S en la maquina en la que vamos a desplegar el nodo: + +* **21000**: TCP/UDP - Puerto para establecer la comunicación entre procesos geth. + +* **41000**: TCP - Puerto para el consenso RAFT de Quorum. + +* **9000**: TCP - Puerto para la comunicación de Constellation. + +* **22000**: TCP - Puerto para establecer la comunicación RPC. + +## Instalación de nodo Quorum + Constellation + +Para configurar e instalar Quorum y Constellation, debe clonar el repositorio git que indicamos a continuación en el servidor de aplicaciones y ejecutar el siguiente script `scripts/bootstrap.sh`. + +``` +$ git clone https://github.com/marcossanlab/alastria-node.git +$ cd alastria-node/scripts/ +$ sudo -H ./bootstrap.sh +``` + +## Configuración del nodo + Es necesario seguir los siguientes pasos para la configuración de los nodos: + +1. **Ejecutar script init.sh** + + Configura el nodo Quorum junto con Constellation. + + Al ejecutar este script debemos de pasar como parametro la IP pública del nodo que estamos configurando. + ``` + $ ./init.sh <> + ``` + +2. **Configuración del fichero de nodos Quorum** + + El nodo quorum que estamos desplegando se configura automaticamente con el script de inicialización ejecutado en el paso anterior. + + Una vez que comprobemos que el fichero de nodos `static-nodes.json` tiene añadido nuestro enode, es necesario subirlo de nuevo al repositorio git, para que todos los integrantes de la red tengan actualizado su fichero de nodos. + +3. **Configurción del fichero de nodos de Constellation** + + El nodo Constellation que estamos desplegando se configura automaticamente con el script de inicialización ejecutado en el paso anterior. + + Una vez que comprobemos que el fichero de nodos de constellation `constellation-nodes.json` tiene añadido nuestro nodo, es necesario subirlo de nuevo al repositorio git, para que todos los integrantes de la red tengan actualizado su fichero de nodos de constellation. + +**NOTA** +En este punto ya tendriamos desplegado un nuevo nodo en la red, que incluiria el despliegue y configuración de Quorum y Constellation. + +Si necesitamos desplegar mas nodos para nuestra red, es necesario volver a realizar los pasos descritos anteriormente. + +## Arranque de nodo Quorum + Constellation +Una vez instalado y configurado todo ya podemos arrancar nuestro nodo. Para arrancar ejecutamos la siguiente orden: +``` +$ ./start.sh +``` +**NOTA** +Si el nodo que vamos a levantar es el primer nodo de la red, debemos arrancar con la siguiente orden: +``` +$ ./start.sh init +``` + +## Habilitar el nodo para empezar a realizar transacciones +A la hora de realizar transacciones en la red de Alastria es necesario realizar el siguiente procedimiento: + +Una vez que se levantado el nodo, es necesaria la realización de una transferencia de fondos de la cuenta principal a la cuenta que acaba de ser generada al iniciarse el nodo. + +Con el fin de realizar este procedimiento se debe indicar al administrador del primer nodo de la red, poseedor de la cuenta principal, la cuenta que se ha generado al levantar el nodo. Tras esto, el administrador deberá asignar a la cuenta del nodo la cantidad que se haya acordado. \ No newline at end of file diff --git a/data/constellation-nodes.json b/data/constellation-nodes.json new file mode 100644 index 0000000..4d2f6e5 --- /dev/null +++ b/data/constellation-nodes.json @@ -0,0 +1,7 @@ +[ + "http://52.56.69.220:9000/", + "http://35.176.197.87:9000/", + "http://52.56.69.220:9100/", + "http://52.169.13.168:9000", + "http://52.164.228.204:9000" +] \ No newline at end of file diff --git a/data/genesis.json b/data/genesis.json new file mode 100644 index 0000000..0c03c42 --- /dev/null +++ b/data/genesis.json @@ -0,0 +1,16 @@ +{ + "alloc": { + "0x58b8527743f89389b754c63489262fdfc9ba9db6" : {"balance" : "1000000000000000000000000000"} + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "config": { + "homesteadBlock": 0 + }, + "difficulty": "0x0", + "extraData": "0x", + "gasLimit": "0x2FEFD800", + "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", + "nonce": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" +} \ No newline at end of file diff --git a/data/keystore/UTC--2017-09-20T08-43-59.003454005Z--58b8527743f89389b754c63489262fdfc9ba9db6 b/data/keystore/UTC--2017-09-20T08-43-59.003454005Z--58b8527743f89389b754c63489262fdfc9ba9db6 new file mode 100644 index 0000000..94f648c --- /dev/null +++ b/data/keystore/UTC--2017-09-20T08-43-59.003454005Z--58b8527743f89389b754c63489262fdfc9ba9db6 @@ -0,0 +1 @@ +{"address":"58b8527743f89389b754c63489262fdfc9ba9db6","crypto":{"cipher":"aes-128-ctr","ciphertext":"20f46e1aacd6bf28b66e37b5b6cf9b1cefc42ac8a4461e86893ae4ccd7e671c7","cipherparams":{"iv":"4d455255a895091952f653c4b59c92c7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"74b089663af7571962992c5a1bb68c1e82e5f8308c646b68cfe576c1c6f38d5c"},"mac":"5ce860f522494ff1322f776d93ee6fb149eb1cddb53722e2e59191c4d0bdd8c9"},"id":"2db34512-2c46-44b7-a8a9-6b73302dde1e","version":3} \ No newline at end of file diff --git a/data/static-nodes.json b/data/static-nodes.json new file mode 100644 index 0000000..045f4bb --- /dev/null +++ b/data/static-nodes.json @@ -0,0 +1,7 @@ +[ + "enode://ef65a78e2c785f64561449ff6d7954a31d771a7bbf3ef36119f13f91b1bb9c2e0100e3cb5e8298e6bbce643142d2ba530396c7b5a2f9e2d5662dc33ec7598812@52.56.69.220:21000?raftport=41000", + "enode://95444283ac4585db5e8118a9b0d949fd0bc0bcfb24c8a0994bb7764e9acb19b55c6fda9c45eafb8c21220cfb312a5f290cb376e7f9205553a6df7cda18367fed@35.176.197.87:21000?raftport=41000", + "enode://f4d45250117bfc9414e6af97fbc7f61371575c2dcebb68b32e125128a57ff50b1ed97618b03a96a85f222085eef4fd2a2462ecbce04788c5997ec2bd0c192307@52.56.69.220:23000?raftport=41000", + "enode://8968447208d65c25044a4d93a9449a0ed003b72405e9b37d896eb2483d05921b2188fba6fd377a3d70bea6a2eee641c0f2e0fbbd32adcf29bdcd7196a30ce296@52.169.13.168:21000?raftport=41000", + "enode://c54bd82e7954887795334037a90e3f33845bd7a1a1f8a878cd65d28a385c9468047ad570c5094dca4dd6cf9b164f42aae2bf0ce25cc7ef0121865062444415cb@52.164.228.204:21000?raftport=41000" +] diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh new file mode 100755 index 0000000..a0ebdbd --- /dev/null +++ b/scripts/bootstrap.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -e + +GOREL="go1.7.3.linux-amd64.tar.gz" +PATH="$PATH:/usr/local/go/bin" + +sudo rm -Rf /usr/local/go + +sudo apt-get update && sudo apt-get install -y + +#INSTALACION DE LIBRERIAS +sudo apt-get install -y software-properties-common unzip wget git make gcc libsodium-dev build-essential libdb-dev zlib1g-dev libtinfo-dev sysvbanner wrk psmisc + +#INSTALACION ETHEREUM +sudo add-apt-repository -y ppa:ethereum/ethereum && sudo apt-get update && sudo apt-get install -y solc + +#INSTALACION CONSTELLATION 0.1.0 +wget -q https://github.com/jpmorganchase/constellation/releases/download/v0.1.0/constellation-0.1.0-ubuntu1604.tar.xz +unxz constellation-0.1.0-ubuntu1604.tar.xz +tar -xf constellation-0.1.0-ubuntu1604.tar +sudo cp constellation-0.1.0-ubuntu1604/constellation-node /usr/local/bin && sudo chmod 0755 /usr/local/bin/constellation-node +sudo rm -rf constellation-0.1.0-ubuntu1604.tar.xz constellation-0.1.0-ubuntu1604.tar constellation-0.1.0-ubuntu1604 + +#INSTALACION DE GO +wget -q "https://storage.googleapis.com/golang/${GOREL}" +tar -xvzf "${GOREL}" +mv go /usr/local/go +sudo rm "${GOREL}" + +#INSTALACION DE QUORUM +git clone https://github.com/jpmorganchase/quorum.git +cd quorum && git checkout tags/v1.1.0 && make all && cp build/bin/geth /usr/local/bin && cp build/bin/bootnode /usr/local/bin + +cd .. +sudo rm -rf constellation-0.1.0-ubuntu1604.tar.xz constellation-0.1.0-ubuntu1604.tar constellation-0.1.0-ubuntu1604 quorum + +set +e diff --git a/scripts/init.sh b/scripts/init.sh new file mode 100755 index 0000000..33f4188 --- /dev/null +++ b/scripts/init.sh @@ -0,0 +1,119 @@ +#!/bin/bash +set -u +set -e + +MESSAGE="Usage: init CURRENT_HOST_IP | auto" +if ( [ $# -ne 1 ] ); then + echo "$MESSAGE" + exit +fi + +CURRENT_HOST_IP="$1" + +if ( [ "auto" == "$1" ]); then + echo "Autodiscovering public host IP ..." + CURRENT_HOST_IP="$(dig +short myip.opendns.com @resolver1.opendns.com 2>/dev/null || curl -s --retry 2 icanhazip.com)" + echo "Public host IP found: $CURRENT_HOST_IP" +fi + +PWD="$(pwd)" +CONSTELLATION_NODES=$(cat ../data/constellation-nodes.json) +STATIC_NODES=$(cat ../data/static-nodes.json) + +update_constellation_nodes() { + NODE_IP="$1" + CONSTELLATION_PORT="$2" + URL=", + \"http://$NODE_IP:$CONSTELLATION_PORT/\" +]" + CONSTELLATION_NODES=${CONSTELLATION_NODES::-2} + CONSTELLATION_NODES="$CONSTELLATION_NODES$URL" + echo "$CONSTELLATION_NODES" > ~/alastria-node/data/constellation-nodes.json +} + +update_static_nodes() { + ENODE=", + \"$1\" +]" + STATIC_NODES=${STATIC_NODES::-2} + STATIC_NODES="$STATIC_NODES$ENODE" + echo "$STATIC_NODES" > ~/alastria-node/data/static-nodes.json +} + +generate_conf() { + #define parameters which are passed in. + NODE_IP="$1" + CONSTELLATION_PORT="$2" + OTHER_NODES="$3" + PWD="$4" + + #define the template. + cat << EOF +# Externally accessible URL for this node (this is what's advertised) +url = "http://$NODE_IP:$CONSTELLATION_PORT/" + +# Port to listen on for the public API +port = $CONSTELLATION_PORT + +# Socket file to use for the private API / IPC +socket = "$PWD/alastria/data/constellation/constellation.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = $OTHER_NODES + +# The set of public keys this node will host +publickeys = ["$PWD/alastria/data/constellation/keystore/node.pub"] + +# The corresponding set of private keys +privatekeys = ["$PWD/alastria/data/constellation/keystore/node.key"] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +passwords = "$PWD/alastria/data/passwords.txt" + +# Where to store payloads and related information +storage = "$PWD/alastria/data/constellation/data" + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 + +EOF +} + +echo "[*] Cleaning up temporary data directories" +rm -rf ~/alastria +mkdir -p ~/alastria/data/{keystore,geth,constellation} +mkdir -p ~/alastria/data/constellation/{data,keystore} +mkdir -p ~/alastria/logs + +# Creamos el fichero de passwords con la contraseña de las cuentas +echo "Passw0rd" > ~/alastria/data/passwords.txt + +echo "[*] Initializing quorum" +geth --datadir ~/alastria/data init ~/alastria-node/data/genesis.json +cd ~/alastria/data/geth +ENODE_KEY=$(bootnode -genkey nodekey -writeaddress) +cd ~ +update_static_nodes "enode://${ENODE_KEY}@${CURRENT_HOST_IP}:21000?raftport=41000" +cp ~/alastria-node/data/static-nodes.json ~/alastria/data/static-nodes.json + +echo " Por favor, introduzca como contraseña 'Passw0rd'." +geth --datadir ~/alastria/data account new + +echo "[*] Initializing Constellation node" +update_constellation_nodes "${CURRENT_HOST_IP}" "9000" +generate_conf "${CURRENT_HOST_IP}" "9000" "$CONSTELLATION_NODES" "${PWD}" > ~/alastria/data/constellation/constellation.conf +cd ~/alastria/data/constellation/keystore +cat ~/alastria/data/passwords.txt | constellation-node --generatekeys=node +echo "______" +cd ~ + +set +u +set +e diff --git a/scripts/restart.sh b/scripts/restart.sh new file mode 100755 index 0000000..98c8b6b --- /dev/null +++ b/scripts/restart.sh @@ -0,0 +1,76 @@ +#!/bin/bash +set -u +set -e + +MESSAGE="Usage: restart CURRENT_HOST_IP | auto" +if ( [ $# -ne 1 ] ); then + echo "$MESSAGE" + exit +fi + +CONSTELLATION_NODES=$(cat ../data/constellation-nodes.json) +STATIC_NODES=$(cat ../data/static-nodes.json) +CURRENT_HOST_IP="$1" +PWD="$HOME" + +if ( [ "auto" == "$1" ]); then + echo "Autodiscovering public host IP ..." + CURRENT_HOST_IP="$(dig +short myip.opendns.com @resolver1.opendns.com 2>/dev/null || curl -s --retry 2 icanhazip.com)" + echo "Public host IP found: $CURRENT_HOST_IP" +fi + + +generate_conf() { + #define parameters which are passed in. + NODE_IP="$1" + CONSTELLATION_PORT="$2" + OTHER_NODES="$3" + PWD="$4" + + #define the template. + cat << EOF +# Externally accessible URL for this node (this is what's advertised) +url = "http://$NODE_IP:$CONSTELLATION_PORT/" + +# Port to listen on for the public API +port = $CONSTELLATION_PORT + +# Socket file to use for the private API / IPC +socket = "$PWD/alastria/data/constellation/constellation.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = $OTHER_NODES + +# The set of public keys this node will host +publickeys = ["$PWD/alastria/data/constellation/keystore/node.pub"] + +# The corresponding set of private keys +privatekeys = ["$PWD/alastria/data/constellation/keystore/node.key"] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +passwords = "$PWD/alastria/data/passwords.txt" + +# Where to store payloads and related information +storage = "$PWD/alastria/data/constellation/data" + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 + +EOF +} + +cp ~/alastria-node/data/static-nodes.json ~/alastria/data/static-nodes.json +generate_conf "${CURRENT_HOST_IP}" "9000" "$CONSTELLATION_NODES" "${PWD}" > ~/alastria/data/constellation/constellation.conf + +~/alastria-node/scripts/start.sh + +set +u +set +e diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100755 index 0000000..fda932f --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -u +set -e + +NETID=96323 +GLOBAL_ARGS="--networkid $NETID --raft --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum" + +_TIME=$(date +%Y%m%d%H%M%S) + +echo "[*] Starting Constellation node" +nohup constellation-node ~/alastria/data/constellation/constellation.conf 2>> ~/alastria/logs/constellation_"${_TIME}".log & +sleep 6 + +echo "[*] Starting quorum node" +PRIVATE_CONFIG=~/alastria/data/constellation/constellation.conf +if ( [ $# -ne 1 ] ); then + nohup geth --datadir ~/alastria/data $GLOBAL_ARGS --rpcport 22000 --port 21000 --password ~/alastria/data/passwords.txt 2>> ~/alastria/logs/quorum_"${_TIME}".log & +else + nohup geth --datadir ~/alastria/data $GLOBAL_ARGS --rpcport 22000 --port 21000 --unlock 0 --password ~/alastria/data/passwords.txt 2>> ~/alastria/logs/quorum_"${_TIME}".log & +fi + +set +u +set +e \ No newline at end of file diff --git a/scripts/stop.sh b/scripts/stop.sh new file mode 100755 index 0000000..e004f48 --- /dev/null +++ b/scripts/stop.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +pkill -f alastria + +set +e \ No newline at end of file