Armando una Blockchain (8)

Published on Author lopezLeave a comment

Anterior Post
Siguiente Post

En el anterior post, describí parte de la virtual machine que estoy incorporando a mi proyecto personal de blockchain, escrito en C#, usando el flujo de trabajo de TDD:

https://github.com/ajlopez/SimpleBlockchain

Agregué un simple compilador de bytecodes, para simplificar algunos tests. Esta clase no es necesaria en producción, pero aún así quedó en el proyecto core:

public class BytecodeCompiler
{
    private IList<byte> bytes = new List<byte>();

    public void Stop()
    {
        this.Compile(Bytecodes.Stop);
    }

    public void Add()
    {
        this.Compile(Bytecodes.Add);
    }

    public void Subtract()
    {
        this.Compile(Bytecodes.Subtract);
    }
    
    // more methods
    
    public byte[] ToBytes()
    {
        return this.bytes.ToArray();
    }
}

Lo que hace es coleccionar una serie de bytecodes, con argumentos opcionales. Y tiene un método que devuelve esa serie como un arreglo de bytes. Un simple test mostrando su uso:

[TestMethod]
public void LessThan()
{
    BytecodeCompiler compiler = new BytecodeCompiler();

    compiler.Push(2);
    compiler.Push(2);
    compiler.LessThan();
    compiler.Push(0);
    compiler.Push(1);
    compiler.LessThan();
    compiler.Push(1);
    compiler.Push(0);
    compiler.LessThan();

    Machine machine = new Machine();

    machine.Execute(compiler.ToBytes());

    var stack = machine.Stack;

    Assert.IsNotNull(stack);
    Assert.AreEqual(3, stack.Size);
    Assert.AreEqual(DataWord.Zero, stack.ElementAt(2));
    Assert.AreEqual(DataWord.Zero, stack.ElementAt(1));
    Assert.AreEqual(DataWord.One, stack.ElementAt(0));
}

También escribí un simple compilador de líneas, llamado SimpleCompiler. Lo puedo usar así en mis tests:

[TestMethod]
public void IsZeroUsingSimpleCompiler()
{
    string program = "push 2\n" +
        "iszero\n" +
        "push 0\n" +
        "iszero";

    SimpleCompiler compiler = new SimpleCompiler(program);

    Machine machine = new Machine();

    machine.Execute(compiler.Compile());

    var stack = machine.Stack;

    Assert.IsNotNull(stack);
    Assert.AreEqual(2, stack.Size);
    Assert.AreEqual(DataWord.Zero, stack.ElementAt(1));
    Assert.AreEqual(DataWord.One, stack.ElementAt(0));
}

Estas son clases auxiliares, pero me simplificaron la escritura de algunos tests. Es parte de mi estrategia, el que la escritura de tests sea facilitada con el tiempo. Al principio escribo tests que involucran mayor trabajo, pero luego, en algún momento, ya apoyado en esos tests de base, los próximos se pueden escribir con más confianza usando estas clases auxiliares.

En el próximo post, una sorpresa: nuevo proyecto de blockchain, pero esta vez en mi querido NodeJS y JavaScript.

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 *