Se observamos as tendencias dos anos anteriores, escoitamos falar de blockchain todo o tempo, pero non hai moito sobre os detalles específicos.
Todos sabemos que as criptomoedas como Bitcoin, Ethereum, Dogecoin, Matic e outras dependen da tecnoloxía blockchain. Blockchain liderou os eventos significativos que revolucionaron numerosas industrias en 2021 e allanaron o camiño para novos logros.
Blockchain é un medio de almacenar datos dun xeito difícil ou imposible de editar, piratear ou estafar. É un rexistro dixital de transaccións que se duplican e se espallan por toda a rede de sistemas informáticos da cadea de bloques.
É a tecnoloxía de base de datos innovadora que alimenta practicamente todas as criptomoedas. A cadea de bloques fai que sexa incriblemente difícil piratear ou enganar o sistema ao espallar copias idénticas dunha base de datos por toda a rede.
Aínda que Bitcoin é agora o uso máis destacado da cadea de bloques, a tecnoloxía pode servir para unha variedade moi ampla de aplicacións.
As criptomoedas e as cadeas de bloques foron cada vez máis populares nos últimos anos, e espérase que esta tendencia continúe.
Neste tutorial faremos unha cadea de bloques sinxela con JavaScript. Ofrecerache unha comprensión básica de como funciona unha cadea de bloques.
Chamémoslle MelodyCoin e entramos directamente á acción!
Creando Un Bloque
Para comezar, crearemos un novo ficheiro JavaScript no que colocaremos todo o noso código.
Chamémoslle main.js e comecemos cunha descrición de como deberían verse unha cadea de bloques e os bloques.
Crea unha clase Block e dálle unha función Object() { [código nativo] } para comezar.
Debes dar unha data e o hash do bloque anterior ao crear un novo bloque:
Aquí están as definicións de cada propiedade:
- A marca de tempo indica cando se fixo o bloque. Podes usar o formato que elixas (neste caso, unha marca de tempo de UNIX).
- Calquera forma de datos que desexe conectar a este bloque pódese incluír no parámetro de datos. Se queres crear unha criptomoeda, podes gardar aquí os datos das transaccións, como o remitente/receptor e a cantidade de diñeiro movida.
- O previousHash é unha cadea que contén o hash do bloque anterior. Isto é o que xerará a cadea de bloques, que será fundamental para proporcionar a integridade da nosa cadea de bloques máis tarde.
Creando hash
Cada bloque enlaza co bloque anterior (polo tanto, a propiedade previousHash). É dicir, cada bloque require un hash. Un hash é semellante a unha pegada dixital. É distinto para cada bloque.
O hash dun bloque pódese calcular pasando todo o seu contido a través dunha función hash.
Entón, imos comezar implementando unha función que calcula o hash do bloque actual.
Entón, baixo a clase Block, definimos a función calculateHash:
Non obstante, o hash SHA256 non é compatible con JavaScript e debe obterse dunha biblioteca externa.
Crypto-js é un paquete fantástico que inclúe implementacións seguras de varios algoritmos hash.
Despois podemos importalo ao noso código main.js.
Agora que temos a nosa función calculateHash(), utilízala na función do noso bloque:
Despois de describir como é un bloque, podemos definir como debe ser unha cadea de bloques. Entón, imos crear unha nova clase.
Neste escenario, a cadea de bloques é un obxecto moi sinxelo que ten unha cadea de propiedade. Esta é unha matriz que contén todos os bloques da cadea.
Antes de poder engadir bloques, primeiro debemos crear o que se coñece como "bloque de xénese". Este é o primeiro bloque da cadea, e é único porque non pode apuntar a un bloque anterior (é o primeiro!).
Entón, para construír o bloque xénese, engadirei unha función á nosa clase chamada createGenesisBlock (). De volta na función Object() { [código nativo] } da nosa clase Blockchain.
Agora podemos incluír o bloque de xénese sempre que construímos unha nova instancia de Blockchain:
Métodos Blockchain
Agora, imos engadir métodos á nosa clase Blockchain que nos permitirán facer cousas como engadir novos bloques e buscar o bloque máis recente.
A función getLatestBlock é a máis básica. Simplemente devolve o membro final da matriz da cadea:
A técnica addBlock é un pouco máis complicada.
Antes de poder engadir un novo bloque á nosa cadea, primeiro debemos establecer adecuadamente o campo Hash anterior dese bloque.
Debe establecerse co hash do bloque engadido máis recentemente á nosa cadea. Tamén necesitamos calcular o hash do novo bloque:
Probas
A ver como saíu o noso MelodyCoin.
Crea unha instancia de blockchain para facelo. Engadimos un par de bloques máis:
Fixemos dous novos bloques alí. Botamos un ollo ao aspecto actual da nosa cadea de bloques.
MelodyCoin estará encadenado e formateado con catro espazos:
Verifique a integridade da cadea de bloques
As cadeas de bloques son fantásticas porque unha vez que se engade un bloque, non se pode modificar sen invalidar o resto da cadea.
Non obstante, non hai ningún método para comprobar a integridade da nosa cadea de bloques con esta implementación.
Imos introducir unha función isChainValid na nosa cadea de bloques. Se a cadea é lexítima, devolverá verdadeira; se non, devolverá false:
Proba de integridade
Agora podemos poñer a proba a integridade da nosa cadea de bloques. Se o executamos agora, confirmará que a nosa cadea é xenuína.
Imos agora tentar manipular a nosa cadea de bloques. Modifiquemos o bloque 2 e sobrescribamos o seu contido (supoñamos que transferimos 100 moedas en lugar de catro).
Cando executamos isto, podemos ver que o software recoñece o noso esforzo por manipular a cadea.
Non obstante, podes crer que hai outro método para entrometerme nisto. Modifiquei o contido do bloque pero non recalculei o hash. Entón podes tentar ser intelixente e recalcular o hash dese mesmo bloque.
Iso é todo o que había na nosa pequena configuración de cadea de bloques! Permítenos engadir novos bloques e detectar a manipulación de datos dentro da cadea.
Hai dous problemas coa nosa pequena cadea de bloques que debemos abordar:
- Os ordenadores modernos son extremadamente rápidos e poden engadir miles de bloques á nosa cadea en segundos. Obviamente, non queremos que ninguén envíe spam á nosa cadea de bloques.
- A nosa cadea de bloques aínda é vulnerable á manipulación. Podes actualizar o contido dun bloque e, a continuación, simplemente recalcular os hash (e os hash anteriores) para todos os bloques seguintes. Aínda que te metas con el, acabarás cunha cadea lexítima.
Para resolver estas preocupacións, as cadeas de bloques usan unha técnica coñecida como "proba de traballo". Debes demostrar que utilizou unha cantidade significativa de recursos computacionais para crear un bloque usando este enfoque. Isto tamén se chama minería.
A proba de traballo require que o hash dun bloque comece cunha cantidade específica de ceros. Pero como podes saber se o teu hash cumpre esta regra?
O contido dun bloque determina o seu hash. Así sempre obtemos o mesmo hash, sempre que non modifiquemos o contido.
Cada bloque debería ter un valor nonce engadido como solución. Estes son esencialmente algúns datos aleatorios que podemos actualizar ata que o hash do noso bloque comece con ceros suficientes. Como non podes alterar a saída dunha función hash, tes que probar moitas combinacións diferentes e esperar o mellor.
Introduce a minería en The Blockchain
Comecemos por incluír un nonce na nosa clase Block. O nonce é o único valor dentro do noso bloque que podemos modificar para afectar o hash do bloque.
Non podemos modificar a marca de tempo nin os datos.
A continuación, imos escribir unha función mineBlock() que fará a minería real dun bloque. Esta función enviarase a dificultade necesaria como parámetro e seguirá executándose ata que o hash do noso bloque comece con ceros suficientes.
Acabo de facer un bucle while básico que se executaría ata que o noso hash comezase con ceros suficientes. Usamos a dificultade para determinar cantos ceros son necesarios. Cunha dificultade de 5, o noso hash debe comezar con 5 ceros.
Cando o noso hash non contén ceros suficientes, aumentamos o nonce por un e recalculamos o hash. E se atopamos un hash que se corresponde coa dificultade, rexistrámolo na consola.
Hai unha cousa máis que temos que facer. Realmente non temos en conta a variable nonce no noso método calculateHash, así que aquí está:
Clase Blockchain
Poñamos a proba este novo enfoque na nosa clase de blockchain e vexamos como vai.
Para comezar, definirei a dificultade da nosa cadea de bloques na función Object(). Definímolo aquí xa que podemos usalo nalgún lugar máis tarde.
A función addBlock debe modificarse de forma que extrae o bloque antes de engadilo á nosa cadea.
Usa a cadea de bloques
Agora, utilicemos a nosa nova cadea de bloques co algoritmo de proba de traballo. Aquí, engade un par de instrucións console.log.
Cando executamos este código, podemos observar que o proceso de minería xa non é especialmente rápido.
O algoritmo leva algún tempo xerar bloques con hash que comezan con tres ceros (según se configura pola dificultade).
Entón, ese foi o final da nosa configuración básica de blockchain.
Podemos regular a rapidez con que se engaden novos bloques á nosa cadea de bloques grazas ao mecanismo de proba de traballo.
É a característica de seguridade máis importante das cadeas de bloques. E agora que entendes como funciona, comeza a crear o teu propio!
Deixe unha resposta