Una transacción por cuenta y bloque, y los lotes
A partir de la versión 0.5.8 se aplica a cada bloque una regla de validez sencilla: puede llevar como máximo una transacción de cada cuenta. Para hacer muchas cosas a la vez, una cuenta usa un lote, una transacción que lleva varias acciones de un mismo tipo. Juntas, las dos reglas mantienen exactas las comprobaciones que hacen los nodos antes de un bloque, sin dejar de permitir que una cuenta con mucha actividad pague a muchas personas dentro de un solo bloque.
La regla
La cuenta aquí es la dirección firmante. Un bloque que lleva dos transacciones de la misma dirección es inválido en todos los nodos, así que un productor honesto nunca construye uno. Los productores toman primero la transacción admisible más antigua de cada cuenta y dejan la siguiente para un bloque posterior, 15 segundos más tarde.
Una cuenta puede seguir enviando varias transacciones seguidas. El conjunto de espera de un nodo admite hasta 50 transacciones pendientes por remitente (una política local de cada nodo), y los productores las incluyen de una en una por bloque, la más antigua primero.
De la definición se siguen dos detalles:
- cada miembro de un grupo de cuentas tiene su propio hueco, porque cada miembro firma con su propia dirección, aunque los miembros compartan un solo saldo;
- cuando se ejecuta la transacción interna de una cuenta multifirma, cuenta para la cuenta multifirma.
Por qué ayuda
Un nodo comprueba una transacción contra el estado confirmado dos veces: cuando la admite en su conjunto de espera y cuando monta un bloque. Con una transacción por cuenta, ninguna otra transacción de la misma cuenta puede cambiar ese estado dentro del bloque. Por tanto, la comprobación sigue siendo exacta para todo lo que solo controla el remitente, como su propio saldo y sus propios objetos.
Entre cuentas distintas, gana la primera transacción que se aplica. Si dos cuentas intentan aceptar la misma oferta de intercambio, la primera se la queda, y la segunda ha quedado sin sentido: es una operación nula pagada que paga su comisión y no hace nada más (véase transacciones). Los productores honestos dejan fuera esas transacciones. No hay ninguna regla aparte por objeto.
Lotes
Un lote es una transacción que lleva varias acciones de un mismo tipo. Existen tres tipos:
- pagos en ZBC, hasta 25 en un lote;
- transferencias de tokens, hasta 32, de cualquier token, con la comisión pagada en ZBC;
- pruebas de almacenamiento, hasta 1000, un lote por nodo y época de almacenamiento (véase almacenamiento descentralizado).
Un lote es todo o nada. Cada acción se comprueba de antemano, así que o bien se realizan todos los pagos que contiene o no se realiza ninguno, y todo el lote se firma una sola vez.
Lo que cuesta un lote
Varias acciones pagan como varias transacciones. La comisión mínima de un lote es la suma de las comisiones mínimas que pagarían sus acciones como transacciones separadas: una comisión base por cada acción más el cargo por bytes de cada acción (véase comisiones), con el mensaje del lote cobrado una sola vez. Tres pagos sin mensaje cuestan lo mismo en un lote que en tres transacciones sueltas. Un lote de pruebas de almacenamiento no paga nada: cada prueba de almacenamiento es un deber sin comisión, así que la suma es cero.
Lo que ahorra un lote es sobre todo trabajo para la red, no comisiones: una sola firma que verificar y un solo hueco en el bloque en lugar de tres. Y es la forma de que una cuenta pague a muchos destinatarios en el mismo bloque.