Transacciones Offchain en Ethereum/RSK (1)

Published on Author lopez

Siguiente Post

En Ethereum/RSK, un contrato inteligente tiene un ciclo de vida como:

Un contrato es una cuenta, tiene dirección pública y un balance como cualquier otra cuenta. Pero, además, tiene código asociado y almacenamiento. Las transacciones que recibe pueden tener valor a transferir y datos para invocar código. Y cada transacción tiene un costo, y se graba y publica en la blockchain.

En esta serie de post, quiero describir una posible implementación para soporte de transacciones “offchain”, que no vayan directas a la blockchain, sino que puedan estar en un lugar alternativo, manteniendo estado, sin usar el costo de la blockchain. Solo en algunos momentos el resultado DE VARIAS transacciones se publica en la blockchain. La idea es que un contrato puede estar en otros estados, además del estado normal:

Cuando un contrato está en el estado “offchain”, se ejecuta en un UNICO nodo designado, su nodo de ejecución, y no en toda la red. Las transacciones que recibe son ejecutadas solamente por ESE NODO, y no son agregadas a la blockchain. De esta manera, se pueden ejecutar muchas transacciones contra ese contrato con un costo mucho menor. Solamente cuando el contrato decide pasar de nuevo a modo normal, se emite un “commit” que genera una transacción “onchain”, que cuando se mina y ejecuta, actualiza de en un solo paso el estado de almaceniemto público del contrato en la blockchain. La llamo la transacción delta.

El cambio de estado de normal a “offchain” es disparada por código de contrato, con una nueva instrucción (que se implementa como un nuevo opcode de la máquina virtual Ethereum), para cambiar al estado “offchain”. Las transacciones “onchain” que se reciban de ahí en mas, no se procesan por el contrato. Solo se procesan las transacciones “offline” (podría alternativamente procesar TODAS las que vengan, desde el estado “offchain”, pero me parece más claro al principio, que los usuarios que envíen transacciones ESPECIFICAMENTE las marquen como “onchain” o como “offchain”). Entonces, todas las transacciones “onchain” se rechazan, y ningún minero las agrega a un bloque, mientras el contrato público esté marcado como “offchain” en la blockchain. Las transacciones “offchain” se reconocen con algún dato adicional, por ejemplo, podrían implementarse con campo “nonce” en –1, pero eso es un detalle de implementación a discutir.

De nuevo, el código de contrato es el que decide CUANDO pasar de “offchain” a normal, haciendo un “commit” o un “rollback” al estado público previo. Si decide hacer “commit”, cambia a un estado temporario de congelamiento, hasta que una transacción delta emitida en ese momento, sea minada e incorporada a la blockchain pública. Esta transacción delta tiene como misión actualizar el estado público del contrato para reflejar el estado privado que en nodo ejecutor tiene en ese momento del contrato. De esta manera, en vez de ocupar cientos o miles de transacciones, un contrato usa la blockchain cada tanto, sólo para actualizar el estado público usando este tipo de transacciones delta.

En los próximos posts describiré la transacción delta con más detalle, y discutiré los casos de TRANSFERENCIA de valor (no solo cambio de estado interno) en las transacciones “offchain”. Ahora que el código principal de RSK es público, puede que escriba alguna implementación liviana de estas ideas, como referencia concreta. Como dice Linus, “talk is easy, show me the code” 😉

Nos leemos!

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