Ethereum debug geth con Visual Studio Code

Siguiendo con la red privada Ethereum con el cliente geth y un entorno portable con Visual Studio Code y otras utilidades para que todo funcione correctamente (NodeJS, Git, gcc…), tal como se describe en post anteriores (Ethereum Blockchain privada, Ethereum: explorando base de datos leveldb), podemos debuggear el código de geth si lo omdificamos o para entender su funcionamiento.

En Visual Studio Code (que tenemos de manera portable, descomprimiendo el zip de descarga) tenemos que instalar el plugin Go, https://code.visualstudio.com/docs/languages/go, y seguir las instrucciones para para poder debuggear con delve ( https://github.com/golang/vscode-go/wiki/debugging), instalándolo desde el propio Visual Studio Code, con la paleta de comandos (CTR+MAYS+P) y eligiendo luego dlv

Comandos Visual Studio Code y debugger Delve

También necesitaremos el código fuente de geth (https://github.com/ethereum/go-ethereum)

Entorno Windows Portable

La estructura de carpetas es la siguiente (dentro de la de Visual Studio Code)

Entorno Windows portable

En la carpeta go-ehtereum tenemos el código fuente de ethereum, la carpeta private_BC tendrá los datos de nuestros nodos y los ejecutables de geth. Dentro de data tenemos el lenguaje de programación go y el compilador gcc (mingw_winlibs).

Para que el entorno arranque sin problemas, podemos crear un archivo bat con el siguiente contenido, donde tenemos que definir también variables de entorno de Go (GOPATH y GOROOT)

echo off
set gitdir=%~dp0\data\Git
set nodedir=%~dp0\data\Nodejs
set GOPATH=%~dp0\data\go\bin
set GOROOT=%~dp0\data\go\
set gccPATH=%~dp0\data\mingw_winlibs\bin
set path=%PATH%;%gitdir%;%gitdir%\bin;%gitdir%\cmd;%gitdir%\usr\bin;%gitdir%\mingw64\bin;%gitdir%\mingw64\libexec\git-core;%nodedir%;%gccPATH%
start Code.exe

Compilar y debug

Abrimos el Visual Studio Code (Nota: es posible que nos avise de que falta algún módulo de Go para la compilación, u otras utilidades, que habrá que instalar)

En la terminal de Visual Studio Code, que tiene cargadas las variables de entorno del fichero batch anterior, compilaremos geth con las opciones de debug (https://stackoverflow.com/questions/53304300/breakpoints-ignored-when-debugging-ethereum-go-in-visual-studio-code-with-rich-g), creando el ejecutable en nuestra carpeta de la blockchain privada, con nombre gethDebug.

go build -o ..\private_BC\gethDebug.exe -gcflags=all='-N -l' -v ./cmd/geth
compilar geth

Al compilar se empezarán a descargar los paquetes externos de go, y puede ser que falle, nos pedirá que ejecutemos el comando go mod tidy y luego volver a compilar, pero he experimentado errores en los que se queda en un bucle donde no encuentra los paquetes. Por tanto adjunto los archivos go.mod y go.sum, que están en la carpeta donde tenemos el código fuente (al copiarlos y repetir la compilación ya no dará error).

Configuración de Visual Studio para lanzar el debug

Ya podríamos debuggear el código, pero necesitamos configurar los parámetros de nuestro nodo geth.

La idea es como los post anteriores:

  • Nodo 1: nodo validador que actúa como rootnode. Siempre está funcionando (usaremos una copia del ejecutable geth, con otro nombre para que no interfiera en la depuración/debug). Lo lanzaremos desde una consola cmd o powershell independiente
  • Nodo 2: nodo (podría ser validador) que se conecta al anterior para sincronizarse y descargar la blockchain, usará el ejecutable que estamos debuggeando. Se ejecutará y lanzará en Visual Studio Code. Tenemos que crear un archivo de configuración para lanzarlo (con los parámetros del ejecutable)

En la carpeta de la blockchain tenemos lo siguiente:

getDebug1.exe es una copia del ejecutable compilado, y será el que ejecutará el Nodo 1 en una consola separada.

Nodo 1

Abrimos una consola de powershell/cmd en la carpeta de blockhain, y lo lanzamos (previamente tendremos que haber inicializado con el génesis)

.\gethDebug1.exe --datadir eth_network --networkid 888 --port 30304 --http  --allow-insecure-unlock --http.corsdomain "*" --nat extip:127.0.0.1 --unlock 0x598b65946815ae60c68ec34d747bae6d16690287 --mine --nodiscover --syncmode full
Nodo 1 ejecutándose aparte

Nodo 2

El comando que hemos estado usando para el Nodo 2 es, primero inicializar la cadena (con el génesi) y luego el nodo propiamente dicho. La primera parte la haremos desde otra consola powershell separada, con el comando siguiente (para inicializar no olvidar borrar previamente la carpeta con la blockchain eth_network2/geth)

./ gethDebug.exe init --datadir eth_network2 aepdeth_genesis.json

El comando para arrancar el nodo 2 y sincronizarlo con el Nodo 1 sería el siguiente, pero esto lo realizaremos desde la configuración de Visual Studio Code.

./ gethDebug.exe --datadir eth_network2 --networkid 888 --port 30305  --authrpc.port 8552 --ipcdisable --bootnodes "enode://e8021593007ca294dc66437fda9743f025610b210e4e0039a04596b7c981cbdc4dae556c900c530c8a032be06ec943309abf66b4585e3c5c72a702c5f3ddc4d8@127.0.0.1:30304?discport=30304" --syncmode full --verbosity 5

En Visual Studio Code, en el menú Ejecutar añadimos una configuración (archivo json) con lo siguiente (https://ethereum.stackexchange.com/questions/41001/how-to-build-and-debug-geth-with-visual-studio-code) :

Configuración de lanzamiento/ejecución en Visual Studio Code
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch file",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "..\\private_BC\\gethDebug.exe",
            "args": ["--datadir",
             "..\\private_BC\\eth_network2" ,
             "--networkid",
             "888",
             "--port",
             "30305",
             "--authrpc.port",
             "8852",
             "--ipcdisable",
            "--bootnodes",
            "enode://e8021593007ca294dc66437fda9743f025610b210e4e0039a04596b7c981cbdc4dae556c900c530c8a032be06ec943309abf66b4585e3c5c72a702c5f3ddc4d8@127.0.0.1:30304?discport=30304",  
            "--syncmode",
            "full",
            "--verbosity",
            "5"
        ],
        "showLog": true
        }
    ]
}

Ya podemos debuggear desde Visual Studio Code tal cual hacemos con cualquier aplicación:

Visua Studio Code en un breakpoint en geth

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.