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