Armando una Blockchain (7)

Published on Author lopezLeave a comment

Anterior Post
Siguiente Post

En mi proyecto personal de blockchain:

https://github.com/ajlopez/BlockchainSharp

quiero tener la capacidad de ejecutar código, lo que se llama codechain, o smart contracts. He adoptado las ideas de la máquina virtual de Ethereum (ver el Yellow Paper de Ethereum). Algunas clases:

Un DataWord representa un número usando 32 bytes. He implementado la aritmética de esos números usando internamente como base a System.Numerics.BigInteger. Puedo crear DataWord desde enteros y arreglos de bytes.

El Stack es una pila de DataWords, manipulada por la máquina virtual en Machine. Hay una enumeración de los bytecodes implementados, llamada justamente Bytecodes, que se ejecutan en la Machine. Un programa consiste en una serie de bytecodes, contenidos en un arreglo de butes. El método Machine.Execute es donde esos bytecodes son recorridos y ejecutados, modificando una pila, y próximamente, el Storage del contrato, y la Memory asociada en el momento de ejecución. Fragmento del código:

public void Execute(byte[] bytecodes)
{
    int pc = 0;
    int pl = bytecodes.Length;

    while (pc < pl)
    {
        byte bytecode = bytecodes[pc++];

        switch (bytecode)
        {
            case (byte)Bytecodes.Stop:
                return;
            case (byte)Bytecodes.Add:
                this.stack.Push(this.stack.Pop().Add(this.stack.Pop()));
                break;
            case (byte)Bytecodes.Multiply:
                this.stack.Push(this.stack.Pop().Multiply(this.stack.Pop()));
                break;
            case (byte)Bytecodes.Subtract:
                this.stack.Push(this.stack.Pop().Subtract(this.stack.Pop()));
                break;
                
            // more operations
        }
    }
}

El Storage estará asociada a la cuenta del contrato en ejecución. Cada contrato es una cuenta, como otras, con una dirección, balance, código inmutable, y almacenamiento. La Memory es transitoria, y solo se aloca para la ejecución de un contrato, y no persiste más allá de la ejecución. En cambio, el Storage sí vive más allá de cada ejecución, y es parte del estado del mundo que cada nodo de la red debe mantener por cuenta..

Tengo también un simple compilador de bytecodes, y un compilado de comandos por línea, para facilitar la creación de programas, y todo escrito usando el flujo de trabajo de TDD (Test-Driven Development).

Próximos posts: descripción del Storage, Memory, compiladores, ejecución de bloques y transacciones, y almacenamiento persistente.

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 *