Guia para construir una blockchain. Parte 3

En el post anterior ya creamos su entorno virtual en el directorio/var/www/
Además, ya instalamos Python versión3.8 en dicho entorno virtual.
Tu entorno virtual de blancoin estará dentro del siguiente directorio (carpeta)

/var/www/blancoin/

Llamaremos al directorio /var/www/blancoin/ la raíz del entorno virtual o
equivalentemente la raíz del proyecto Blancoin, y en muchas ocasiones, simplemente me referiré a este directorio como la raíz de Blancoin.
Dentro del directorio raíz, creamos los siguientes 12 subdirectorios:

  • block
  • chainstate
  • config
  • crypt
  • data
  • hnetwork
  • mining
  • simulated_network
  • testnet
  • transactions
  • unit_tests
  • wallet

El directorio blocks contendrá nuestra implementación de blockchain. El directorio crypt tendrá las funciones criptográficas que requiere blancoin, y nuestras pruebas unitarias
residirán dentro del directorio unit_tests.
El directorio data contendrá bloques de blancoin y otros datos. Hablaremos de los otros directorios en los posts siguientes.
Para acceder a los módulos de Python en estos directorios, debemos agregar las rutas
a estos directorios a la ruta de búsqueda de Python. Asegúrate de haber activado su
entorno virtual de la siguiente manera. Desde el directorio raíz ingresa:

> source virtual/bin/activate

Desde el directorio raíz, vaya a /lib/python3.8/site-packages. Cree un archivo llamado blancoin.pth dentro de este directorio y luego agregue las siguientes líneas a este archivo:

/var/www/blancoin/block/
/var/www/blancoin/chainstate
/var/www/blancoin/config/
/var/www/blancoin/crypt/
/var/www/blancoin/data/
/var/www/blancoin/hnetwork/
/var/www/blancoin/mining/
/var/www/blancoin/simulated_network
/var/www/blancoin/testnet/
/var/www/blancoin/transactions/
/var/www/blancoin/unit_tests/
/var/www/blancoin/wallet

Guarde este archivo y luego desactive y active su entorno desde el directorio raíz:

>(virtual) deactivate
>/bin/activate

Deberías utilizar Git para enviar periódicamente su trabajo a un repositorio. Ingresa al directorio raíz, inicialice Git y realice un commit inicial:

>(virtual) git init
>(virtual) git add .
>(virtual) git commit -m "initial blancoin commit, virtual environment
created"

Puedes ver tu historial de confirmaciones con:

>(virtual) git log

Git le permitirá volver a una versión anterior en caso de que cometa un error y es posible que desee realizar cambios en el código fuente con frecuencia.

configuracion de blancoin

Nuestra criptomoneda Blancoin utiliza varios parámetros de configuración vitales que definen las características y comportamiento de esta criptomoneda. La siguiente es una breve descripción de estos parámetros.
No se preocupe si no comprendes el significado de algunos de estos parámetros
todavía. Su significado e importancia se aclarará en nuestra exposición posterior.

numero de version de blancoin

VERSION_NUMBER = 1
Esta es la version actual de nestra criptomoneda Blancoin

numero de monedas maximo

MAX_BLANCOIN_COINS = 21000000

Este es el número máximo de monedas de blancoin que pueden existir. Llamaremos
una moneda de blancoin, un blancoin, y varias monedas de blancoin se llamarán blancoins. Inicialmente se crea y distribuye un número fijo de blancoins en el bloque de génesis. El bloque génesis es un bloque codificado que inicia el proceso de creación del bloque. En Bitcoin, Satoshi Nakamoto creó y distribuyó 50 bitcoins en el bloque génesis.
Posteriormente, se crean nuevos blancoins a medida que se agregan bloques a la blockchain. Tenga en cuenta que el número máximo de blancoins que se pueden crear es idéntico al número máximo de bitcoins que se pueden producir en el ecosistema Bitcoin.

Unidad mas pequeña de Blancoin

BLANCOIN_CENT = 1/100000000

BLANCOIN_CENT es la subdivisión más pequeña posible de un blancoin. Observe que cien millones de centavos de blancoin es igual a un blancoin. Esta definición corresponde a la
definición de satoshi en Bitcoin.

tamaño de bloque

MAX_BLOCK_SIZE = 1000000

MAX_BLOCK_SIZE es el tamaño máximo de un bloque de blancoin en bytes. El maximo
tamaño de un bloque determina el número máximo de transacciones de blancoin que se pueden incluir en un bloque.

maximo numero de inputs

MAX_INPUTS = 10

Una transacción de blancoin recopila los valores no gastados de transacciones anteriores y luego transfiere estos valores a uno o más receptores de valor. El parámetro Max-Inputs
limita el número máximo de entradas en una transacción. Esta limitación promueve la eficiencia en procesamiento de transacciones y ayuda a evitar ataques de denegación de servicio.

maximo numero de outputs

MAX_OUTPUTS = 10

Una transacción de blancoin transfiere valores a uno o más destinatarios de valor.
El parámetro Max_Outputs limita el número máximo de destinatarios en una transacción.

intervalo locktime

MAX_LOCKTIME = 60 * 1440 * 7

Una entidad que crea una transacción puede especificar que esta transacción no se procesará hasta que haya transcurrido cierto tiempo. Esto evitará que los mineros incluyan esta transacción en un bloque que se extraerá hasta que haya transcurrido este intervalo de tiempo. El tiempo transcurrido está en segundos.
MAX_LOCKTIME especifica la cantidad máxima de tiempo en segundos que un
la transacción se puede bloquear desde el momento de su creación. No queremos
bloquear indefinidamente las transacciones o bloquear transacciones durante períodos de tiempo muy largos. Esto puede dar lugar a Ataques de denegación de servicio debido a que los cachés de transacciones mantenidos por los mineros se obstruyen
con transacciones futuras.
El parámetro de configuración anterior establece el período máximo de tiempo que un
la transacción se puede bloquear a siete días.

intervalo coinbase

COINBASE_INTERVAL = 100

Este entero positivo especifica el número de bloques nuevos que se deben extraer después de un bloque de referencia anterior, antes de que una transacción coinbase en el bloque de referencia pueda ser gastado. Cuando un minero extrae un bloque, es recompensado con la emisión de una cantidad fija de nueva criptomoneda. Esta nueva moneda se presenta al minero en una transacción coinbase en el bloque. El parámetro de intervalo coinbase impide que un minero pueda gastar una transacción de base de monedas hasta que se haya agregado una cierta cantidad de bloques nuevosa la blockchain.
En blancoin, se extrae un nuevo bloque cada diez minutos aproximadamente, por lo que blancoin las transacciones de coinbase se bloquean durante aproximadamente 1000 minutos

nonce

NONCE = 0

Este es un valor semilla. NONCE es el valor inicial que se utilizará en el cálculo de la prueba de trabajo. Discutiremos este uso de nonce posteriormente.

la dificultad

DIFFICULTY_BITS = 20
DIFFICULTY_NUMBER = 1/ (10 ** (256 – DIFFICULTY_BITS))

El parámetro DIFFICULTY_BITS nos permite ajustar el DIFFICULTY_NUMBER. En blancoin,
además de Bitcoin, extraer un bloque implica resolver un problema matemático difícil. los
DIFFICULTY_NUMBER determina qué tan difícil es este problema y, por lo tanto, el promedio de cantidad de tiempo que llevará resolver este problema.
Se dice que se extrae un bloque cuando el problema se resuelve. El nodo que resuelve este problema tiene derecho a agregar el bloque minado a la blockchain y tiene derecho a una recompensa de blancoin recién extraídos, así como a las tarifas adjuntas a todas las transacciones en el bloque minado.

intervalo retarget

RETARGET_INTERVAL = 1000

La blockchain de blancoin intenta extraer nuevos bloques cada diez minutos. Después de 1000 bloques nuevos minados, Blancoin utiliza un algoritmo para ajustar DIFFICULTY_NUMBER de modo que los bloques se extraígan cada diez minutos en promedio. El algoritmo de Bitcoin también intenta extraer un nuevo bloque cada diez minutos en promedio. Litecoin, que es bastante similar a Bitcoin, intenta extraer nuevos bloques cada dos minutos y medio en promedio.

recompensa de bloque

MINING_REWARD = 5000000000

MINING_REWARD es la cantidad de blancoin nuevos en BLANCOIN_CENTS que se
crean y adjudican a un nodo de minería que extrae con éxito un bloque. La recompensa inicial minera en blancoin es de cinco mil millones de BLANCOIN_CENTS o cincuenta monedas de blancoin (cincuenta blancoin). Esta recompensa corresponde a la recompensa minera inicial en Bitcoin. Tanto en blancoin como en Bitcoin, el algoritmo de recompensa minera reduce a la mitad la recompensa periódicamente. El momento en el que la recompensa se reduce a la mitad depende del número de bloques que ya han sido extraídos. Debido a esta reducción periódica a la mitad, la recompensa minera se acerca asintóticamente a cero. Un algoritmo de minería de criptomonedas no necesariamente tiene que reducir a la mitad la recompensa periódicamente . Hay criptomonedas donde la cantidad de monedas que se crean permanece constante o varía según alguna fórmula.
Bitcoin comenzó a existir el 3 de enero de 2009, cuando Satoshi Nakamoto creó y
minó el bloque génesis. La recompensa minera fue de 50 bitcoins por este bloque y cada bloque que se extrajo a partir de entonces. En 2012, esta recompensa minera se redujo a 25, y en 2016 la recompensa se redujo de nuevo a 12,5 bitcoins. En 2020, la recompensa se redujo también a 6.25 bitcoins.
Dado que la única forma de crear nuevos blancoins o bitcoins es a través del proceso de minería (además de una distribución inicial en el bloque génesis), los algoritmos de minería en estas dos criptomonedas crean un límite superior en la cantidad de blancoins o bitcoins que se puede crear. Por lo tanto, estos algoritmos crean una escasez de blancoins y bitcoins en el tiempo, y esta escasez teóricamente mejora el valor de estas criptomonedas conviertiendose en una criptomoneda deflaccionaria.

intervalo de recompensa (hALVING)

REWARD_INTERVAL = 210,000


REWARD_INTERVAL determina el número de bloques adicionales que se deben
extraer para reducir a la mitad la recompensa minera. Por ejemplo, cada vez que se extraigan 210000 bloques, la recompensa de bloque se reducirá a la mitad. Este es el valor usado en bitcoin.

modulo de configuracion de blancoin

Creamos un módulo de configuración para Blancoin de la siguiente manera. Cree un archivo hconfig.py en el directorio config y copie el siguiente código fuente en este archivo:

"""
hconfig.py: parameters that are used to configure Helium.
"""
conf = {
 # The Helium version no.
 'VERSION_NO': 1,
 # The maximum number of Helium coins that can be mined
 'MAX_BLANCOIN_COINS': 21_000_000,
 # The smallest Helium currency unit in terms of one Helium coin
 'BLANCOIN_CENT': 1/100_000_000,
 # The maximum size of a Helium block in bytes
 'MAX_BLOCK_SIZE': 1_000_000,
 # The maximum amount of time in seconds that a transaction can be locked
 'MAX_LOCKTIME': 30*1440*60,
 # The maximum number of Inputs in a Helium Transaction
 'MAX_INPUTS': 10,
 # The maximum number of Outputs in a Helium Transaction
 'MAX_OUTPUTS': 10,
 # The number of new blocks from a reference block that must be mined before
 # coinbase transaction in the previous reference block can be spent
 'COINBASE_INTERVAL': 100,
 # The starting nonce value for the mining proof of work computations
 'NONCE': 0,
 # Difficulty Number used in mining proof of work computations
 #
 'DIFFICULTY_BITS': 20,
 'DIFFICULTY_NUMBER': 1/ (10 ** (256 - 20)),
 #
 # Retargeting interval in blocks in order to adjust the DIFFICULTY_NUMBER
 #
 'RETARGET_INTERVAL': 1000,
 #
 #Mining Reward
 #
 'MINING_REWARD': 5_000_000_000,
 #
 # Mining reward halving interval in blocks
 #
 'REWARD_INTERVAL': 210_000
}

En el siguiente post seguiremos con la creación de Blancoin.

referencias

Bitcoin, retrieved from https://github.com/bitcoin/bitcoin, last accessed on
June 29, 2020

Bitcoin Developer Reference, bitcoin.org, retrieved from https://developer.
bitcoin.org/reference/, last accessed on June 29, 2020

Bitcoin Improvement Proposals, https://github.com/bitcoin/bips, last accessed
on June 29, 2020

The Litecoin Project, https://github.com/litecoin-project/litecoin/tree/
master/src/leveldb, last accessed on March 28, 2020

Dhillon V., Metcalfe D., Hooper Max, 1st ed., Blockchain Enabled Applications,
Apress, 2017

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s