Fundamentos técnicos de blockchain - 3. Tipos de cuentas y transacciones

in #blockchain7 years ago

El funcionamiento a alto nivel de las diferentes blockchains es muy similar aunque existen ciertas diferencias. Es imposible describir en un sólo artículo todas las blockchains y sus tipos de cuentas y estructura de transacciones. Es por ello que nos centraremos en Ethereum para este artículo por claridad.

Tipos de cuentas

Los usuarios pueden interactuar con las cadenas de bloques a través de cuentas. En el caso de Ethereum tenemos dos tipos de cuentas:

  • Cuentas externas (externally owned accounts o EOAs): controladas por una clave privada. Este es el tipo de cuentas - controladas por personas.
  • Cuentas de contrato (contract accounts): controladas por el código en su contrato.

Ambas cuentas tienen un balance en ethers pero las cuentas de contrato además incluyen un programa informático (smart contract o contrato inteligente). En Ethereum las cuentas además incluyen un campo nonce que indica el número de transacciones emitidas desde dicha cuenta.

Nota: actualmente hay una propuesta de desarrollo siendo revisada para implementar una mayor abstracción en la Máquina Virtual de Ethereum (EVM) y tener un solo tipo de cuenta en el futuro, la cuenta de contrato, y que de esta forma los usuarios sean capaces de definir su propio modelo de seguridad.

Transacciones

Las transacciones son una parte fundamental dentro de una cadena de bloques. Todo lo que rodea a la cadena de bloques está diseñado para asegurar que las transacciones puedan ser creadas, propagadas por la red, validadas y añadidas al registro o cadena de bloques.

Ciclo de vida de una transacción

El ciclo de vida de una transacción comienza con la creación de la transacción, que es luego firmada con una o más firmas indicando la autorización a gastar fondos o ejecutar cierto código en el contrato al que va dirigido. La transacción es entonces transmitida a la red, donde cada nodo participante en la red valida y propaga la transacción a los nodos a los que está conectado y así sucesivamente hasta que alcanza al resto de nodos en la red. Finalmente la transacción es procesada por un nodo minero o validador e incluida en un bloque de transacciones que es registrada en la cadena de bloques.

Estructura de una transacción

El término transacción se usa en Ethereum para hacer referencia a un paquete de datos firmados que almacena un mensaje enviado desde una cuenta externa. Las transacciones contienen la siguiente información:

  • El receptor del mensaje
  • La firma digital que identifica al emisor
  • La cantidad de fondos en ether que se transfieren desde la cuenta del emisor a la del receptor
  • Un campo opcional de datos
  • Un valor STARTGAS que indica el máximo número de pasos computacionales que se permite ejecutar a la transacción
  • Un valor GAS PRICE, que representa el valor máximo que se desea pagar en forma de comisión por cada paso computacional

Los tres primeros campos son estándar y pueden encontrarse en cualquier cadena de blockchain con monedas digitales.

El campo de datos (PAYLOAD) de una transacción en Ethereum se usa para indicar a la EVM que ejecuta la transacción si debe transferir fondos, crear un nuevo contrato, ejecutar un contrato existente o realizar algún tipo de cálculo.

Ethereum introdujo el concepto de gas y por ello las transacciones incluyen los campos STARTGAS y GASPRICE. El concepto de gas en Ethereum se asemeja a la gasolina necesaria en un coche para funcionar, es una forma de pagar por tiempo de uso y recursos. El gas fue introducido con una doble finalidad:

  • Pagar a los mineros por validar transacciones
  • Evitar que la ejecución de una transacción bloquee el sistema. Ésto se debe al hecho de que el lenguaje de programación en el que se programan los contratos de Ethereum es Turing completo y podría darse el caso de que un contrato se ejecutará indefinidamente, con un bucle infinito por ejemplo, bloqueando la red
  • Evitar que malos actores intenten saturar la red enviando una inmensa cantidad de transacciones haciendo que paguen por el uso del sistema

El concepto de gas no es necesario en la cadena de bloques de Bitcoin ya que el lenguaje de scripting que incluye Bitcoin no es Turing completo al no incluir bucles o saltos.

Las redes de Bitcoin y Ethereum son redes públicas y podemos ver los bloques y transacciones con sus campos prácticamente en tiempo real a través de exploradores como:

Bitcoin: https://blockchain.info/

Ethereum: https://etherscan.io/

Mensajes entre contratos

Ethereum además permite la comunicación entre contratos mediante mensajes. Un mensaje es un conjunto de instrucciones enviadas a un contrato desde otro contrato. Un mensaje no constituye una transacción y es enviado cuando un contrato está siendo ejecutado por la EVM.

El Gas en Ethereum

Como se dijo anteriormente, las transacciones requieren de gas para ser ejecutadas en la red de Ethereum. Este gas se paga como comisión en forma de ether (la moneda de ehtereum) por el uso de la red. Las transacciones necesitan proveer gas suficiente para cubrir toda la computación y almacenaje requerida por la transacción. En el siguiente enlace se muestra una tabla con el coste en gas de algunas de las instrucciones disponibles en la EVM:

https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit#gid=0

Si durante la ejecución de la transacción se requiere más gas de la cantidad máxima indicada la ejecución será abortada y el contrato quedará en el mismo estado que estaba previo a la ejecución de dicha transacción. Es decir, las instrucciones enviadas con una transacción se ejecutan de forma atómica.

Además de la cantidad de gas máxima, el usuario debe indicar el precio que está dispuesto a pagar por cada unidad de gas. El precio indicado es importante porque hará que un minero esté dispuesto a procesar nuestra transacción antes o después de otras transacciones dependiendo del precio que estemos dispuestos a pagar.

Función de transición de estado

El siguiente diagrama representa el cambio de estado al procesar una transición en Ethereum:
ethertransition.png

La función de cambio de estado APPLY(S,TX) -> S' puede ser definida de la siguiente forma:

  1. Comprobar si la transacción está bien definida, la firma es válida, y el nonce concuerda con el nonce de la cuenta del emisor. Si no, se devuelve un error.
  2. Calcular la comisión de la transacción como STARTGAS * GASPRICE, y determinar la dirección del emisor a partir de la firma. Restar la comisión del balance de cuenta del emisor e incrementar el nonce del emisor. Devolver un error si no hay fondos suficientes que gastar.
  3. Inicializar GAS = STARTGAS, y descontar una cierta cantidad de gas por byte para pagar por los bytes de la transacción.
  4. Transferir el valor indicado en la transacción de la cuenta del emisor a la cuenta del receptor. Si la cuenta receptora no existe, crearla. Si la cuenta receptora es un contrato, ejecutar el código del contrato hasta su terminación o hasta que la ejecución se quede sin gas.
  5. Si el valor de la transferencia falló debido a que el emisor no tenía suficientes fondos o la cantidad de gas necesaria sobrepasó el limite indicado, revertir los cambios sobre el estado excepto el pago de comisiones, y añadir las comisiones a la cuenta del minero.
  6. Sino, devolver el gas no gastado al emisor y enviar las comisiones pagadas por el gas consumido al minero.

Con esto es suficiente por ahora. Si deseas conocer más detalles sobre la arquitectura de Ethereum y el ciclo de vida de una transacción puedes consultar el whitepaper de Ethereum o revisar el código de github.

Sort:  

Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://aprendeblockchain.wordpress.com/fundamentos-tecnicos-de-blockchain/cuentas-y-transacciones/