Construyendo una cadena de bloques privada Ethereum basada en el entorno Mac para la simulación de minería

El primer paso: instalación de software relacionado

  • instalación del cliente go-ethereum
  • El cliente Go-ethereum generalmente se llama Geth, que es una interfaz de línea de comandos que ejecuta el nodo Ethereum completo implementado en Go. Geth se beneficia de la naturaleza multiplataforma del lenguaje Go y admite su uso en múltiples plataformas (como Windows, Linux, Mac). Geth se basa en la implementación específica del protocolo Ethereum. A través de Geth, puede implementar varias funciones de Ethereum, como la creación y eliminación de nuevas cuentas, la apertura de minería, la transferencia de monedas de éter y el despliegue y ejecución de contratos inteligentes.

Geth puede conectarse usando los siguientes tres protocolos JSON RPC:

  • Comunicación de proceso interno (IPC) : comunicación interna, generalmente utilizada en una computadora.
  • Llamada de programa remoto (RCP) : comunicación a través de computadoras. Por lo general, se utilizan los protocolos TCP y HTTP.
  • WS (sockets web) : use sockets para conectarse a Geth.

Significado de ID de cadena:

  • ID de cadena: 1 cadena pública Mainnet
  • ID de cadena: red 2 Morden (solo abierta para algunas personas)
  • ID de cadena: red 3 Ropsten
  • ID de cadena: 4 red Rinkeby
  • La ID de cadena mayor que 4 es una red privada
  • Use Geth --testnet para conectarse a la red Ropsten y Geth --rinkeby para conectarse a la red Rinkeby.
  • El comando de instalación es el siguiente:
brew tap ethereum/ethereum
brew install ethereum
  • Mi interfaz de pantalla

  • Compruebe si la instalación se realizó correctamente, ingrese el siguiente comando
geth --help
  •  Aparece la siguiente interfaz, es decir, la instalación es exitosa

Paso 2: construye una cadena privada

  • Ethereum admite bloques de creación personalizados. Para ejecutar una cadena privada, necesitamos definir nuestros propios bloques de creación. La información del bloque de creación se escribe en un archivo de configuración de formato json. Primero guarde el siguiente contenido en un archivo json, generalmente llamado así por genesis.json.
  • Los comandos de operación de requisitos previos son los siguientes
mkdir myeth
cd myeth
vi genesis.json
  • El contenido del archivo json es el siguiente: simplemente cópielo directamente.
{
  "config": {
        "chainId": 666999, 
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}
  • Explicación de los parámetros anteriores.

  • Tenga en cuenta que me refiero a muchos artículos que faltan en la oración eip150Block: 0, esto estará mal.
  • La condición de error es Error al bloque de génesis wirte: pedido no admitido

Inicialización de red

  • Ingrese el comando geth init, el archivo genesis.json, la carpeta para almacenar datos de bloque y el almacén de claves para inicializar.
geth init "/Users/chy/Desktop/myeth/genesis.json" --datadir "/Users/chy/Desktop/myeth/chaindata"
  • Se ha generado el bloque de génesis y se puede iniciar el nodo Geth. El protocolo IPC se usa de manera predeterminada cuando se inicia Geth. Para garantizar que se pueda acceder al nodo Geth a través del protocolo PRC, el parámetro RPC debe incluirse en el comando 
  • La operación de comando es la siguiente

 Configurar el entorno en el que se ejecuta el nodo

geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 15 –allow-insecure-unlock
  • Explicación de comandos
  • –Datadir: especifique la ubicación de almacenamiento de los datos de blockchain ; esto requiere que todos se ajusten de acuerdo con la situación real y reemplacen su propia ruta
  • –Rpc: indica habilitar el servicio HTTP-RPC;
  • –Rpcapi “eth, web3, miner, admin, personal, net”: este comando indica el comando que permite el acceso a través de RPC. Por defecto, Geth permite web3.
  • –Nodiscover: desactive el mecanismo de descubrimiento de nodos para evitar unir nodos extraños con la misma configuración inicial;
  • –Identidad: especifique la ID del nodo para facilitar la identificación de su propio nodo entre un gran grupo de nodos;
  • –Rpcport: especifique el número de puerto de escucha del servicio HTTP-RPC (el valor predeterminado es 8545);
  • –Rpcaddr: especifique la dirección IP;
  • –Puerto: especifique el número de puerto utilizado para conectarse con otros nodos (el valor predeterminado es 30303);
  • –Maxpeers 0 Si no desea que alguien se conecte a su cadena de prueba, use maxpeers 0. O bien, puede ajustar los parámetros cuando sepa exactamente cuántos nodos desea conectar.
  • Si no utiliza el comando –allow-insecure-unlock, recibirá un error al desbloquear: Error: el desbloqueo de la cuenta con acceso HTTP está prohibido. Originalmente, por razones de seguridad, el canal HTTP no puede desbloquear la cuenta de forma predeterminada . Consulte las preguntas relacionadas
  • Después de ejecutar el comando anterior, se encontró que Fatal: Error al iniciar la pila de protocolos: datadir ya utilizado por otro proceso. Este problema se debe a que es necesario cerrar por la fuerza el proceso geth en ejecución. El comando es el siguiente: 54148 es el número de identificación del proceso geth
  • Agregue el parámetro –allow-insecure-unlock nuevamente para reiniciar la cadena privada g. Ahora ejecute el comando de desbloqueo de cuenta para tener éxito.

geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 15 --allow-insecure-unlock
ps aux | grep "geth"
kill -9 54148
  • La información del nodo es la identidad del nodo en la red. Si otros nodos están listos para unirse a esta red, deben proporcionar sus propios valores de enodo. El acceso RPC puede ser a través de http://127.0.0.1:8545 o http: // localhost: 8545, y el acceso IPC puede ser a través del comando ** \. \ Pipe \ geth.ipc **. El comando se ejecuta continuamente en forma de servicio. Debe abrir una ventana de línea de comando nuevamente , pero la ventana original no se puede cerrar . Ingrese el comando de la siguiente manera:

Geth attach rpc:http://localhost:8545
  • Aparece la siguiente página, ingrese a la página de control. Use el protocolo IPC para conectarse al nodo y poder ejecutar otros comandos.

Entorno de ejecución interactivo

  • Este es un entorno de ejecución de JavaScript interactivo donde se puede ejecutar el código JavaScript, donde> es el símbolo del sistema. En este entorno, algunos objetos JavaScript para operar Ethereum también están integrados, y estos objetos se pueden usar directamente. Estos objetos incluyen principalmente:
  • eth: contiene algunos métodos relacionados con el funcionamiento de blockchain;
  • net: contiene algunos métodos para ver el estado de la red p2p;
  • admin: contiene algunos métodos relacionados con la gestión de nodos;
  • minero: contiene algunos métodos para iniciar y detener la minería;
  • personal: contiene principalmente algunos métodos para administrar cuentas;
  • txpool: contiene algunos métodos para ver el grupo de memoria de transacciones;
  • web3: contiene los objetos anteriores y también contiene algunos métodos de conversión de unidades.

Comandos comunes:

  • personal.newAccount (): crea una cuenta;
  • personal.unlockAccount (): desbloquear cuenta;
  • eth.accounts: enumera las cuentas en el sistema;
  • eth.getBalance (): vea el saldo de la cuenta, la unidad de valor de retorno es Wei (Wei es la unidad de denominación de moneda más pequeña en Ethereum, similar a Satoshi en Bitcoin, 1 éter = 10 ^ 18 Wei);
  • eth.blockNumber: enumera el número total de bloques;
  • eth.getTransaction (): Obtener transacción;
  • eth.getBlock (): Obtener bloque;
  • miner.start (): comienza a minar;
  • miner.stop (): detiene la minería;
  • web3.fromWei (): Convierte Wei a Ether;
  • web3.toWei (): Convierte Ether a Wei;
  • txpool.status: estado en el grupo de transacciones;
  • admin.addPeer (): se conecta a otros nodos;

Paso 3: configurar una cuenta

  • Después de conectarse al nodo Geth, el siguiente paso es configurar una cuenta coinbase o etherbase. Para crear una cuenta, puede usar el método newAccout del objeto personal y establecer una contraseña (la contraseña no está visible). El comando es el siguiente.
personal.newAccount()
  • Si necesita cambiar la dirección original de la cuenta coinbase, puede operarla a través de la función setEtherBase del objeto address.miner. Esta operación reemplazará la cuenta original de coinbase con una cuenta nueva. El comando es el siguiente
miner.setEtherbase("0x19b4029dad20824db6dc201437f9cac2a7e1fc5c")
  • Ejecute el comando de consulta, puede ver que la dirección establecida ha tenido efecto. La minería ahora puede comenzar. Dado que solo hay un minero que recibirá todas las recompensas de minería, el Éter de la cuenta coinbase aumentará gradualmente.
eth.coinbase
  • Crea otra cuenta de la misma manera
  • Ver usuarios actuales
eth.accounts
  • El código se ejecuta de la siguiente manera

Paso 4: Comience a minar

  • El parámetro en inicio representa el número de subprocesos utilizados para la minería. El comando es el siguiente
miner.start(8)
  • En este momento, cambie a la ventana de la línea de comando que creó la cadena privada antes y podrá ver el resultado del proceso de minería. Esto se refiere a la primera ventana que creamos en ese momento.

  • Si es la primera vez que extrae, se deben generar archivos relacionados con DAG, lo que lleva una cierta cantidad de tiempo. No es necesario después de la segunda vez.

  • Debido a que estoy minando por segunda vez, no hay un archivo anterior.

  • Al usar el método de registro de entrada, puede ingresar el comando tail -f geth.log para rastrear el progreso de la minería
  • Vea los saldos de Ether de la cuenta 0 que se ha extraído y la cuenta 1 que no se ha extraído. El comando para ver el saldo de la billetera es el siguiente: cambie el 0 a 1 para ver el saldo de la segunda cuenta.
eth.getBalance(eth.accounts[0])
  • La implementación es la siguiente:


 

  • Minar un bloque recompensará 5 éter, y las recompensas de la minería entrarán en la cuenta del minero. Esta cuenta se llama coinbase. Por defecto, coinbase es la primera cuenta en la cuenta local.

  • La unidad del valor de retorno de getBalance () es wei, wei es la unidad más pequeña de Ether, 1 Ether = 10 a la 18a potencia de wei. Para ver cuántos Ethereum hay, puede usar web3.fromWei () para convertir el valor de retorno a Ethereum

  • Detener la minería, el comando es el siguiente

miner.stop()
  • El diseño general de la operación, el lado izquierdo monitorea dinámicamente la entrada del usuario, y la ventana derecha es la consola Ethereum Javascript. El diseño de la página es el siguiente

Paso 5: hacer una transacción

  • Queremos transferir de la cuenta 0 a la cuenta 1. Debe desbloquear la cuenta antes de poder transferir, de lo contrario recibirá un error.
  • El comando de desbloqueo es el siguiente
personal.unlockAccount(eth.accounts[0])
  • Inicie una transacción, transfiera 200 Ether de la cuenta 0 a la cuenta 1, el comando es el siguiente
personal.unlockAccount(eth.accounts[0])
amount = web3.toWei(200,'ether')
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
  • En este punto, la transacción se ha enviado a la cadena de bloques y se ha devuelto el hash de la transacción, pero aún no se ha procesado. Hay una transacción que se confirmará en el grupo de transacciones local. Puede usar eth.getBlock ("pendiente", verdadero) .transacciones para ver las transacciones pendientes actuales Confirma la transacción.
eth.getBlock("pending", true).transactions
  • Para que se procesen las transacciones, se debe realizar la extracción. Aquí comenzamos a minar, y luego dejamos de minar después de esperar a que se extraiga un bloque. El comando es el siguiente:

miner.start(1);admin.sleepBlocks(1);miner.stop();
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
  • En este punto, la transacción ha entrado en vigencia y la cuenta 1 debería haber recibido 200 éter.

Documentos de referencia

 

Publicado 76 artículos originales · ganado elogios 2 · Vistas 3773

Supongo que te gusta

Origin blog.csdn.net/CHYabc123456hh/article/details/105588927
Recomendado
Clasificación