Armando una Blockchain (14)

Anterior Post
Siguiente Post

Despues de un tiempo de descanso, estoy de vuelta, trabajando en mis proyectos personales de blockchain:

https://github.com/ajlopez/SimpleBlockchain
https://github.com/ajlopez/BlockchainSharp

Hoy quiero presentar mis primeros tests para modelar un minero. Un minero debe minar bloques, agregando transacciones, armando un bloque hijo del mejor bloque de la blockchain. Hay varios casos a resolver: las transacciones deben ser válidas, deben ser minadas una sola vez, etc…. Pero siguiendo el flujo de trabajo de TDD (Test-Driven Development), puedo ir agregando funcionalidad guiado por esos tests. El primero:

exports['mine empty block'] = function (test) {
    var txs = transactions.txs();
    var miner = miners.miner(txs);
    
    var states = tries.states();
    var genesis = blocks.block();
    
    var result = miner.mine(genesis, states);
    
    test.ok(result);
    test.ok(result.hash);
    test.ok(result.transactions);
    test.ok(Array.isArray(result.transactions));
    test.equal(result.transactions.length, 0);
    test.ok(result.parentHash);
    test.equal(result.parentHash, genesis.hash);
};

Despues de implementar el código que hace pasar a este test, escribí un segundo test algo más completo:

exports['mine block with transaction'] = function (test) {
    var from = utils.hash();
    var to = utils.hash();
    var value = 1000;

    var states = tries.states().put(from, { balance: 3000 });
    var tx = transactions.transfer(from, to, value);
    
    var txs = transactions.txs();
    txs.add(tx);

    var miner = miners.miner(txs);
    
    var genesis = blocks.block();
    
    var result = miner.mine(genesis, states);
    
    test.ok(result);
    test.ok(result.hash);
    test.ok(result.transactions);
    test.ok(Array.isArray(result.transactions));
    test.equal(result.transactions.length, 1);
    
    test.equal(result.transactions[0].from, from);
    test.equal(result.transactions[0].to, to);
    test.equal(result.transactions[0].value, 1000);
    
    test.ok(result.parentHash);
    test.equal(result.parentHash, genesis.hash);
};

Todavía es un test algo débil. Por ejemplo, no obliga a la validación de las transacciones en el proceso de minado, y no está claro todavía que pasa con la transacción que fue incluida en el nuevo bloque. Pero todo esto puede irse agregando en tests, describiendo la conducta esperada, y luego implementando.

La parte interesante de este flujo de trabajo es que la implementación va creciendo, siguiendo el camino más simple, siguiendo lo esperado por los tests.

Nos leemos!

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

This entry was posted in Bitcoin, Blockchain, Ethereum, JavaScript, NodeJs, Proyectos Open Source. Bookmark the permalink.

Leave a Reply

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