Skip to content
This repository has been archived by the owner on Apr 13, 2022. It is now read-only.

Despliegue de Cakeshop

Marcos Serradilla Diez edited this page Jan 9, 2018 · 7 revisions

Introducción

Cakeshop es una herramienta de monitorización, despliegue y pruebas de contratos solidity, explorador de bloques, etc. creado inicialmente por JPMorgan que desde el grupo de trabajo técnico de Alastria estamos adaptando a las necesidades de nuestro proyecto.

Una de las mayores aportaciones de este software, es que todas sus funcionalidades las expone a través de un API RESFUL que cualquiera puede explotar fácilmente.

cakeshop.war

Cakeshop se distribuye como un empaquetado java que contiene:

  1. Los ejecutables de quorum y constellation (a efecto de test-net) y el compilador de solidity.
  2. Un servicio spring boot con el que expone API's REST. Encapsula los servicios RPC API de Quorum, permitiendo desplegar contratos, obtener transacciones, obtener los peers del nodo, etc.
  3. Una base de datos (que puede ser H2SQLDB, PostgreSQL, MySQL u Oracle) para almacenar los bloques, transacciones, peers, accounts, eventos,... generados en la blockchain y que se utilizan a modo de caché de alto nivel.
  4. Una aplicación web angular que expone la funcionalidad del api en forma de aplicación web.

Inicialización con H2SQLDB contra un nodo regular

Requerimientos

  • JRE 1.8.0 o superior.
  • Linux x64.

Paths a tener en cuenta:

  • $HOME/alastria/bin/cakeshop.war: Empaquetado cakeshop.
  • $HOME/alastria/bin/start_cakeshop.sh: Inicializador de cakeshop.
  • $HOME/alastria/cakeshop: Carpeta desde donde se inicializará cakeshop.
  • $HOME/alastria/cakeshop/data/local/application.properties: Fichero de properties donde se configura la instancia.

start_cakeshop.sh

#!/bin/bash

set -e

cd /home/ubuntu/alastria/cakeshop

nohup java -jar /home/ubuntu/alastria/bin/cakeshop.war 2>> /home/ubuntu/alastria/logs/cakeshop.log &

set +e

application.properties

#Fri Jan 05 13:09:09 UTC 2018
cakeshop.database.vendor=hsqldb
cakeshop.hibernate.hbm2ddl.auto=update
cakeshop.hibernate.jdbc.batch_size=20
cakeshop.jdbc.pass=sdk
cakeshop.jdbc.user=sdk
cakeshop.mvc.async.pool.queue.max=2000
cakeshop.mvc.async.pool.threads.core=250
cakeshop.mvc.async.pool.threads.max=1000
contract.poll.delay.millis=5000
contract.registry.addr=0x6d5b7d3a57d3ebf0955720fee5695cc382db2e2f
endpoints.actuator.enabled=true
geth.auto.start=false
geth.auto.stop=false
geth.block.maker=0xca843569e3427144cead5e4d5999a3d0ccf92b8e
geth.bootnode.address=
geth.bootnode.key=
geth.bootnodes.list=
geth.cors.enabled=true
geth.cors.url=
geth.cred1=admin
geth.cred2=$2a$10$dbGiTnfK/w8MhcpIj3XgROYXRsFMlEYJRWoUYArkr8aSPypUFV25G
geth.datadir=/home/ubuntu/alastria/cakeshop/data/local/ethereum
geth.db.enabled=true
geth.identity=ubuntu
geth.log=/logs
geth.mining=false
geth.networkid=1006
geth.node.port=30303
geth.params.extra=
geth.rpcapi.list=admin,db,eth,debug,miner,net,shh,txpool,personal,web3
geth.unlock.timeout=1000
# URL al nodo regular
geth.url=http\://ec2-35-176-19-89.eu-west-2.compute.amazonaws.com\:22000
geth.verbosity=
geth.vote.account=0x0fbdc686b912d7722dc86510934589e0aaf3b55a
geth.vote.contract.addr=0x0000000000000000000000000000000000000020
management.context-path=/manage
management.security.enabled=false
security.basic.enabled=false
security.ignored=/**
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
spring.main.banner-mode=off
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Inicialización con PostgreSQL contra un nodo regular

El proceso de inicialización de cakeshop es exactamente el mismo que en el caso de HSQLDB, excepto por la configuración de la base de datos, que en nuestro caso, la hemos cambiado en el fichero start_cakeshop.sh manteniendo application.properties.

start_cakeshop.sh

#!/bin/bash

set -e

cd /home/ubuntu/alastria/cakeshop

java -Dcakeshop.database.vendor=postgres -Dcakeshop.jdbc.url=jdbc:postgresql://localhost/cakeshop -Dcakeshop.jdbc.user=cakeshop -Dcakeshop.jdbc.pass=Secreto -Dcakeshop.hibernate.hbm2ddl.auto=update -jar cakeshop.war
 2>> /home/ubuntu/alastria/logs/cakeshop.log &

set +e

NOTA: El driver de PostgreSQL no inicicializa correctamente la base de datos y no genera correctamente el esquema de eventos.

Inicialización con MySQL contra un nodo regular

El proceso de inicialización de cakeshop es exactamente el mismo que en el caso de HSQLDB, excepto por la configuración de la base de datos, que en nuestro caso, la hemos cambiado en el fichero start_cakeshop.sh manteniendo application.properties.

start_cakeshop.sh

#!/bin/bash

set -e

cd /home/ubuntu/alastria/cakeshop

java -Dcakeshop.database.vendor=mysql -Dcakeshop.jdbc.url="jdbc:mysql://172.17.0.2/cakeshop?autoReconnect=true&useSSL=false" -Dcakeshop.jdbc.user=cakeshop -Dcakeshop.jdbc.pass=Secreto -Dcakeshop.hibernate.hbm2ddl.auto=update -jar cakeshop.war
 2>> /home/ubuntu/alastria/logs/cakeshop.log &

set +e

Configuración para uso de nginx como proxy web de Cakeshop

Debe configurarse la ruta dedicada a cakeshop en nginx para que sea compatible con websockets y tenga el CORS habilitado. Para ello, nos dirigimos al archivo de configuración del site de nginx reservado para cakeshop, generalmente localizado en /etc/nginx/sites-enabled/, y colocamos la siguiente configuración:

location /cakeshop {                                                                                                          
                                                                                                                                     
    if ($request_method = 'OPTIONS') {
       add_header 'Access-Control-Allow-Origin' '*';
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
       #
       # Custom headers and headers various browsers *should* be OK with but aren't
       #
       add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-C
ontrol,Content-Type,Content-Range,Range';
       #
       # Tell client that this pre-flight info is valid for 20 days
       #
       add_header 'Access-Control-Max-Age' 1728000;
       add_header 'Content-Type' 'text/plain; charset=utf-8';
       add_header 'Content-Length' 0;
       return 204;                                                                                                                  
    }

    if ($request_method = 'POST') {
       add_header 'Access-Control-Allow-Origin' '*';
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
       add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-C
ontrol,Content-Type,Content-Range,Range';
       add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-
Control,Content-Type,Content-Range,Range';
    }

if ($request_method = 'GET') {
       add_header 'Access-Control-Allow-Origin' '*';
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
       add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-C
ontrol,Content-Type,Content-Range,Range';
       add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-
Control,Content-Type,Content-Range,Range';
    }
                                                                                                                                     
               proxy_pass http://127.0.0.1:8080/cakeshop;
               #Web Socket compatibility                                                              
               proxy_http_version 1.1;                                                                                              
               proxy_set_header Upgrade $http_upgrade;                                                                              
               proxy_set_header Connection 'upgrade';
               proxy_set_header Host $host;                                                                                          
               proxy_cache_bypass $http_upgrade;                                                                                    
       }

NOTA: En este archivo CORS se ha habilitado para cualquier dominio. Esto deberá restringirse según las políticas de seguridad que quiera seguir en su proxy cada uno de los nodos. Contacta a los administradores para cualquier consulta al respecto.

Además, deberá habilitarse CORS en el application.properties de Cakeshop, así como determinar los dominios en los que se aceptará CORS configurando el parámetro geth.cors.url. En el sigueinte ejemplo, se habilita CORS para cualquier dominio *

#Fri Jan 05 13:09:09 UTC 2018
cakeshop.database.vendor=hsqldb
cakeshop.hibernate.hbm2ddl.auto=update
cakeshop.hibernate.jdbc.batch_size=20
cakeshop.jdbc.pass=sdk
cakeshop.jdbc.user=sdk
cakeshop.mvc.async.pool.queue.max=2000
cakeshop.mvc.async.pool.threads.core=250
cakeshop.mvc.async.pool.threads.max=1000
contract.poll.delay.millis=5000
contract.registry.addr=0x6d5b7d3a57d3ebf0955720fee5695cc382db2e2f
endpoints.actuator.enabled=true
geth.auto.start=false
geth.auto.stop=false
geth.block.maker=0xca843569e3427144cead5e4d5999a3d0ccf92b8e
geth.bootnode.address=
geth.bootnode.key=
geth.bootnodes.list=
geth.cors.enabled=true
geth.cors.url=*
geth.cred1=admin
geth.cred2=$2a$10$dbGiTnfK/w8MhcpIj3XgROYXRsFMlEYJRWoUYArkr8aSPypUFV25G
geth.datadir=/home/ubuntu/alastria/cakeshop/data/local/ethereum
geth.db.enabled=true
geth.identity=ubuntu
geth.log=/logs
geth.mining=false
geth.networkid=1006
geth.node.port=30303
geth.params.extra=
geth.rpcapi.list=admin,db,eth,debug,miner,net,shh,txpool,personal,web3
geth.unlock.timeout=1000
# URL al nodo regular
geth.url=http\://ec2-35-176-19-89.eu-west-2.compute.amazonaws.com\:22000
geth.verbosity=
geth.vote.account=0x0fbdc686b912d7722dc86510934589e0aaf3b55a
geth.vote.contract.addr=0x0000000000000000000000000000000000000020
management.context-path=/manage
management.security.enabled=false
security.basic.enabled=false
security.ignored=/**
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
spring.main.banner-mode=off
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp