Armando una Blockchain (10)

Published on Author lopezLeave a comment

Anterior Post
Siguiente Post

Esta semana pasado, estuve agregando más lógica a mi proyecto personal de blockchain en JavaScript:

https://github.com/ajlopez/SimpleBlockchain

Como es habitual, usando el flujo de trabajo de TDD (Test-Driven Development). Un primer test creando una blockchain con un bloque genesis:

var blockchains = require('../lib/blockchains');
var blocks = require('../lib/blocks');

exports['create blockchain'] = function (test) {
    var genesis = blocks.block();
    var bc = blockchains.blockchain(genesis);
    
    test.ok(bc);
    test.equal(typeof bc, 'object');
    test.equal(bc.bestBlock(), genesis);
};

Luego, un test agregando un bloque:

exports['add block'] = function (test) {
    var genesis = blocks.block();
    var block = blocks.block(genesis);
    var bc = blockchains.blockchain(genesis);
    
    bc.add(block);
    
    test.equal(bc.bestBlock(), block);
};

El rechazo de un bloque que tiene la misma altura que la blockchain actual:

exports['add block same height'] = function (test) {
    var genesis = blocks.block();
    var block = blocks.block(genesis);
    var block2 = blocks.block(genesis);
    
    var bc = blockchains.blockchain(genesis);
    
    bc.add(block);
    bc.add(block2);
    
    test.equal(bc.bestBlock(), block);
};

Agregar un mejor bloque, y luego, el rechazo de un mejor bloque pero que no deciende del mejor bloque actual:

exports['add block with next height'] = function (test) {
    var genesis = blocks.block();
    var block = blocks.block(genesis);
    var block2 = blocks.block(block);
    
    var bc = blockchains.blockchain(genesis);
    
    bc.add(block);
    bc.add(block2);
    
    test.equal(bc.bestBlock(), block2);
};

exports['add block next height but another parent block'] = function (test) {
    var genesis = blocks.block();
    var block = blocks.block(genesis);
    var block2 = blocks.block(genesis);
    var block3 = blocks.block(block2);
    
    var bc = blockchains.blockchain(genesis);
    
    bc.add(block);
    bc.add(block3);
    
    test.equal(bc.bestBlock(), block);
};

Estos tests fueron escritos uno por uno, y cada test fue seguido de la implementación más simple que pudo hacer pasar el test. Esto es parte del espíritu de TDD: pasos de bebé. implementaciones simples, descripción explícita de la conducta esperada.

Próximos posts: implementando estados de cuentas, estados inmutables, comunicación entre nodos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *