Principios de Blockchain y Bitcoin

1. ¿Qué es Bitcoin?

Bitcoin es una moneda electrónica (moneda digital) y Bitcoin es una moneda basada en criptografía. El 1 de noviembre de 2008, Satoshi Nakamoto (no sé si es un humano o una IA, ¿una organización o un individuo?) Propuso el concepto de Bitcoin. Publicó un artículo sobre Bitcoin, que ahora es el "libro blanco" de Bitcoin. Enlace al PDF en papel de Bitcoin original de Satoshi Nakamoto: Bitcoin
propone un sistema de contabilidad electrónica descentralizada en el artículo . El efectivo electrónico tradicional es el banco para llevar las cuentas, porque el banco está detrás del crédito del país, la electrónica descentralizada El sistema de contabilidad es la contabilidad conjunta de Participantes. Las personas obtienen Bitcoin a través de la minería y el pago completo a través de la contabilidad pública .

2. El principio de blockchain

(1) árbol de Merkel

Un árbol hash o árbol de Merkel es un árbol en el que cada nodo hoja está marcado con el hash de contraseña del bloque de datos, y cada nodo no hoja está marcado con el hash de contraseña de su etiqueta de nodo hijo. . Los árboles hash permiten una verificación eficaz y segura del contenido de grandes estructuras de datos. El árbol hash es una generalización de la lista hash y la cadena hash. Para probar que un nodo hoja es parte de un árbol hash binario dado, es necesario calcular el número de hashes que es proporcional al logaritmo del número de nodos hoja del árbol. Esto es lo opuesto a la lista hash. , y el número de la lista hash es el mismo que el del propio nodo hoja y es directamente proporcional al número.
Árbol Merkle
Este es un ejemplo de un árbol hash binario. Hash 0-0 y 0-1 son los valores hash de los bloques de datos L1 y L2, respectivamente, y el hash 0 es la concatenación de los hash 0-0 y 0-1.

(2). Block y blockchain

En la cadena de bloques hay muchos bloques , estos bloques son enlaces encriptados, cada bloque contiene un encabezado de bloque e información de transacción (generalmente representación de árbol de Merkel ), contenida en la información del encabezado en secuencia Hash, marca de tiempo. Según el diseño, la cadena de bloques puede resistir la modificación de sus datos. Esto se debe a que una vez registrados, los datos de un bloque determinado no se pueden cambiar de forma retroactiva sin cambiar todos los bloques posteriores.
Estructura de la cadena de bloques de Bitcoin
Lógicamente hablando, se puede considerar que la cadena de bloques consta de 5 capas:
1. Infraestructura (hardware)
2. Red (descubrimiento de nodos, difusión y verificación de información)
3. Consenso (prueba de trabajo, certificado de participación)
4. Datos (Bloques , transacciones)
5. Las aplicaciones (dApps)
no se pueden cambiar de forma retroactiva porque los datos de un bloque determinado no necesitan cambiar todos los bloques posteriores. En respuesta a esto
Blockchain
, la formación de blockchain. La cadena principal (negra) consiste en la serie más larga de bloques desde el bloque de fundación (verde) hasta el bloque actual. Hay bloques aislados (violetas) fuera de la cadena principal.

Permita que los participantes verifiquen y revisen las transacciones de forma independiente y relativamente económica. Utilice redes peer-to-peer y servidores de marca de tiempo distribuidos para administrar de forma autónoma las bases de datos de blockchain. Certifican que tienen un interés propio colectivo a través de una colaboración a gran escala. Este diseño promueve un flujo de trabajo sólido en el que la incertidumbre de los participantes sobre la seguridad de los datos es insignificante. El uso de blockchain elimina la reproducibilidad infinita de los activos digitales. Confirmó que cada unidad de valor se transfirió solo una vez, resolviendo así el antiguo problema del doble gasto. Blockchain se ha descrito como un protocolo de intercambio de valor. Blockchain puede mantener la propiedad porque cuando se configura correctamente para detallar el acuerdo de intercambio, puede proporcionar un registro de ofertas y aceptaciones obligatorias.

Un ejemplo simple: se inició una transacción entre las cuatro personas en ABCD. Entre ellos, A transfirió 100 bitcoins a B. Porque este es un método contable descentralizado. Por lo tanto, cada una de estas cuatro personas registrará esta transacción en su propio libro mayor y registrará la transferencia de 100 bitcoins de A a B. Esta es una pieza de información de la transacción que se registrará en el bloque.Cada bloque tiene un tamaño de 1 MB y puede almacenar alrededor de 4k piezas de información. En este bloque, ¿por qué usaría A como estándar para notificar a otros? ¿A quién usaremos en el comercio normal? ¿Y por qué deberíamos llevar cuentas? ¿Es bueno para nosotros? Todos estos son problemas encontrados en el diseño.
Ejemplo

3. Razones para usar blockchain para la contabilidad

Como se dice que no hay beneficio, Satoshi Nakamoto mencionó el esquema de incentivos en su artículo sobre el diseño de blockchain. La persona que se quede con el libro obtendrá dos tipos de beneficios: el primero es la recompensa de la tarifa de manejo y el segundo es la recompensa del bloque empaquetado (recompensa del sistema). El inicio de cada transacción le cobrará al usuario una pequeña tarifa, y estas tarifas serán recompensadas a los usuarios que reserven el paquete. En la segunda recompensa, el sistema recompensa a la persona que reservó el paquete. En el artículo de Nakamoto, donde escribió este sistema cada diez minutos para generar un bloque, cada bloque generará una cierta cantidad de recompensa Bitcoin. Desde 2008, han sido 50 bitcoins, que se reducirán a la mitad cada cuatro años. Por analogía, el número de bitcoins obtenidos disminuirá. Podemos calcular que hay aproximadamente 21 millones de Bitcoins en el mundo basados ​​en este algoritmo , por lo que Bitcoin será cada vez más difícil de extraer con el tiempo .

4. Quién es el llamado "centro" en cada bloque

(1). Obtenga el poder de empacar a través del mecanismo de prueba de carga de trabajo

Satoshi Nakamoto también escribió en su artículo que cada usuario o nodo competirá por el poder de la contabilidad a través de un mecanismo de prueba de trabajo. El primer usuario que se puede calcular para cada bloque es el productor del siguiente bloque. La única forma de seleccionar usuarios a través de la prueba de trabajo es permitir que los usuarios resuelvan problemas "matemáticos". Este problema matemático se basa en el algoritmo SHA256 , por lo que la única forma es probar uno por uno. Quien primero obtenga la respuesta a esta pregunta será elegible para empaquetar. Esto también se conoce como la llamada minería .

(2) Algoritmo .SHA256

El algoritmo Secure Hash (SHA) es una serie de funciones de hash criptográficas emitidas por el Instituto Nacional de Estándares y Tecnología como el Estándar Federal de Procesamiento de Información de EE. UU. SHA son las siglas de Secure Hash Algorithm. SHA-1 y SHA-2 son dos versiones diferentes de este algoritmo. Se diferencian en la estructura (la forma en que se crea el hash resultante a partir de los datos originales) y la longitud de bits de la firma. SHA-2 se considera el sucesor de SHA-1 porque es una mejora general. En primer lugar, la gente considera que la duración del puesto es una diferencia importante. SHA-1 es un hash de 160 bits. SHA-2 es en realidad una serie "hash" y tiene varias longitudes, la más popular es de 256 bits (SHA256) y la salida final es un número binario de 256 bits . El siguiente es el pseudocódigo del algoritmo SHA256:

Initialize hash values:
(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Initialize array of round constants:
(first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311):
k[0..63] :=
   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

Pre-processing (Padding):
begin with the original message of length L bits
append a single '1' bit
append K '0' bits, where K is the minimum number >= 0 such that L + 1 + K + 64 is a multiple of 512
append L as a 64-bit big-endian integer, making the total post-processed length a multiple of 512 bits
such that the bits in the message are L 1 00..<K 0's>..00 <L as 64 bit integer> = k*512 total bits

Process the message in successive 512-bit chunks:
break message into 512-bit chunks
for each chunk
    create a 64-entry message schedule array w[0..63] of 32-bit words
    (The initial values in w[0..63] don't matter, so many implementations zero them here)
    copy chunk into first 16 words w[0..15] of the message schedule array

    Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array:
    for i from 16 to 63
        s0 := (w[i-15] rightrotate  7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift  3)
        s1 := (w[i- 2] rightrotate 17) xor (w[i- 2] rightrotate 19) xor (w[i- 2] rightshift 10)
        w[i] := w[i-16] + s0 + w[i-7] + s1

    Initialize working variables to current hash value:
    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7

    Compression function main loop:
    for i from 0 to 63
        S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
        ch := (e and f) xor ((not e) and g)
        temp1 := h + S1 + ch + k[i] + w[i]
        S0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
        maj := (a and b) xor (a and c) xor (b and c)
        temp2 := S0 + maj
 
        h := g
        g := f
        f := e
        e := d + temp1
        d := c
        c := b
        b := a
        a := temp1 + temp2

    Add the compressed chunk to the current hash value:
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h

Produce the final hash value (big-endian):
digest := hash := h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

(3) Código de algoritmo central SHA256 formado por lenguaje C ++

#pragma once
 
#ifndef SHA256_H
#define SHA256_H
#include <string>
 
class SHA256
{
    
    
protected:
	typedef unsigned char uint8;
	typedef unsigned int uint32;
	typedef unsigned long long uint64;
 
	const static uint32 sha256_k[];
	static const unsigned int SHA224_256_BLOCK_SIZE = (512 / 8);
public:
	void init();
	void update(const unsigned char* message, unsigned int len);
	void final(unsigned char* digest);
	static const unsigned int DIGEST_SIZE = (256 / 8);
 
protected:
	void transform(const unsigned char* message, unsigned int block_nb);
	unsigned int m_tot_len;
	unsigned int m_len;
	unsigned char m_block[2 * SHA224_256_BLOCK_SIZE];
	uint32 m_h[8];
};
 
std::string sha256(std::string input);
 
#define SHA2_SHFR(x, n)    (x >> n)
#define SHA2_ROTR(x, n)   ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define SHA2_ROTL(x, n)   ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define SHA2_CH(x, y, z)  ((x & y) ^ (~x & z))
#define SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA256_F1(x) (SHA2_ROTR(x,  2) ^ SHA2_ROTR(x, 13) ^ SHA2_ROTR(x, 22))
#define SHA256_F2(x) (SHA2_ROTR(x,  6) ^ SHA2_ROTR(x, 11) ^ SHA2_ROTR(x, 25))
#define SHA256_F3(x) (SHA2_ROTR(x,  7) ^ SHA2_ROTR(x, 18) ^ SHA2_SHFR(x,  3))
#define SHA256_F4(x) (SHA2_ROTR(x, 17) ^ SHA2_ROTR(x, 19) ^ SHA2_SHFR(x, 10))
#define SHA2_UNPACK32(x, str)                 \
{                                             \
    *((str) + 3) = (uint8) ((x)      );       \
    *((str) + 2) = (uint8) ((x) >>  8);       \
    *((str) + 1) = (uint8) ((x) >> 16);       \
    *((str) + 0) = (uint8) ((x) >> 24);       \
}
#define SHA2_PACK32(str, x)                   \
{                                             \
    *(x) =   ((uint32) *((str) + 3)      )    \
           | ((uint32) *((str) + 2) <<  8)    \
           | ((uint32) *((str) + 1) << 16)    \
           | ((uint32) *((str) + 0) << 24);   \
}
#endif

5. Seguridad de Blockchain y Bitcoin

¿Son seguros blockchain y Bitcoin? ¿Cómo evitan la falsificación, la manipulación y el doble pago ? La tecnología de autenticación de identidad puede ser reconocimiento facial, firma, huella digital, etc. en la vida. Pero una vez que se digitalizan, se pueden falsificar mediante copia , por lo que Bitcoin utiliza un método de firma electrónica . La tecnología de firma electrónica utiliza principalmente cifrado asimétrico . Primero, Bitcoin generará un número aleatorio . Esta tecnología generará una clave privada (solo el usuario conoce) a través de un número aleatorio y la encriptará con una clave privada, y luego generará una clave pública (disponible públicamente) a través de la clave privada , que se puede descifrar mediante la clave pública Se generará una dirección pública y los usuarios podrán realizar transacciones anónimas a través de la dirección . El algoritmo típico es RSA y Bitcoin utiliza un algoritmo de cifrado de curva elíptica.

Proceso de conversión

1、首先使用随机数发生器生成一个私钥,它是一个256位的二进制数。私钥是不能公开的,相当于银行卡的密码。

2、私钥经过SECP256K1算法生成公钥,SECP256K1是一种椭圆曲线加密算法,功能和RSA算法类似,通过一个已知的私钥,生成一个公钥,但是通过公钥不能反推出私钥。

3、同SHA256算法一样,RIPEMD160也是一种HASH算法,由公钥可以得到公钥的哈希值,而通过哈希值无法推出公钥。

4、将一个字节的版本号连接到公钥哈希头部,然后对其进行两次SHA256运算,将结果的前4字节作为公钥哈希的校验值,连接在其尾部。

5、将上一步的结果使用BASE58进行编码,就得到了钱包地址(相当于银行账户)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

(1). Resolver registros de transacciones falsificados

Comparar autenticación
La figura muestra el evento que A entrega bitcoins B1. Luego de obtener el resumen mediante la operación hash, el resumen se cifra con la clave privada para obtener la contraseña. Debido a la singularidad de la clave privada, el resumen es único. A través de la transmisión, los mensajes entregados por A son: A se transfiere a B 1 bitcoin, la clave pública de A y la contraseña de A.
Por supuesto, podemos asumir que el mensaje de que A transfirió 1 Bitcoin a B es falso, y el resumen 1 se obtiene en base a esta operación hash. Y usar la clave pública de A para descifrar la contraseña y obtener Digest 2. En este momento, Digest 1 y Digest 2. Obviamente, "A le da a B 1 bitcoin" es un mensaje falsificado.

(2). Evitar la manipulación de los registros de transacciones.

Para evitar la ocurrencia de eventos de manipulación, la cadena de bloques protegerá toda la cadena de bloques de acuerdo con el principio de la cadena más larga :

Cuando la cadena de bloques se bifurca, es decir, más de una persona desenterró el siguiente bloque casi al mismo tiempo, y la dirección de la cadena se ha bifurcado. En términos generales, se utiliza el principio de cadena más larga para la selección. Suponga que el grupo de usuarios A elige ir a la cadena para continuar con la extracción, y el grupo de usuarios B elige salirse de la cadena para continuar con la extracción. Si el grupo A excava primero la siguiente mina y agrega un nuevo bloque a la cadena, el grupo B continuará extrayendo después de pasar al nuevo bloque. Normalmente, la cadena descendente se descarta.

Es decir, donde hay una rama en la cadena de bloques, comparará las cadenas superior e inferior que excavan primero el segundo bloque (cuya cadena se convierte primero en la rama larga), mantienen la cadena larga y abandonan la cadena corta. .
Por lo tanto, podemos seguir el principio de la cadena más larga. Si alguien quiere alterar la información de un bloque en la cadena de bloques, debe liderar una rama en ese bloque y crear una nueva cadena para que la nueva cadena exceda la longitud de la cadena original. . Es decir, la potencia de cálculo de la máquina minera controlada por él solo excede la potencia de cálculo de las máquinas mineras restantes en el mundo (más rápido que cualquier otra persona). La probabilidad de que se dé cuenta es muy pequeña. Por ejemplo, una persona controla el 90% de las máquinas mineras del mundo para manipular los registros de transacciones de una cadena. ¿Por qué no usa tantas máquinas mineras para minar en serio?

(3). Evitar transacciones de doble pago

Cuando ocurre un evento de doble pago, por ejemplo, A tiene solo 100 bitcoins, pero al mismo tiempo transmite el mensaje "A to B 100 bitcoins" (registrado como mensaje b) y "A to C
100 bitcoins" (registrado como mensaje c ), El Grupo D recibe el mensaje b primero y no confirmará el mensaje c. De manera similar, si el grupo E recibe el mensaje c primero, no confirmará el mensaje b. En este momento, depende de cuál de los grupos D y E puede calcular el problema matemático primero, el que excava la mina primero puede escribir el mensaje confirmado en el nuevo bloque, mientras que el otro mensaje no es válido.

Pago doble
Declaración de derechos de autor
Este artículo es el contenido original de J0hn, excepto el contenido al que se hace referencia a continuación , y el derecho de interpretación final pertenece al autor original. Si hay alguna infracción, comuníquese para eliminarla. Sin mi autorización, ¡no lo reimprima en privado!

6. Materiales de referencia

[1]. BMoney http://www.weidai.com/bmoney.txt
[2]. Wikipedia https://en.wikipedia.org/wiki/Bitcoin
[3]. Wikipedia https://en.wikipedia.org/wiki/SHA-2
[4]. Wikipedia https://en.wikipedia.org/wiki/Blockchain
[5]. Youtube https://www.youtube.com/watch?v=g_fSistU3MQ&t=11s
[6]. BitcoinOrg https://bitcoin.org/bitcoin.pdf

Supongo que te gusta

Origin blog.csdn.net/sjhjohn/article/details/114994837
Recomendado
Clasificación