Consenso y bloques
La cadena de Velum produce bloques por turnos entre los nodos completos activos, con un objetivo de 2 segundos por hueco. El ritmo real se mide: el explorador y la portada muestran la media reciente. Cada época (1.800 bloques, una hora30 bloques, unos 60 segundos) los nodos descubren el VEL de esa época con su trabajo comprobado.
Turnos
El tiempo se divide en huecos de 2 s (el objetivo) desde el génesis (slot = floor((ts − génesis) / 2000)). Para cada hueco, todos los nodos calculan el mismo orden de turno:
activos = nodos completos registrados con señal de vida en los últimos 15 bloques
orden = activos ordenados por sha256(hash_bloque_anterior | slot | dirección)
- El primero del orden (rango 0) propone el bloque al empezar el hueco.
- Los suplentes esperan medio segundo por puesto (rango × 500 ms) antes de poder proponer.
- Un bloque firmado antes de su turno se rechaza.
El orden cambia con cada bloque (depende del hash anterior), así que nadie sabe con antelación cuándo le toca a quién.
Señales de vida
Cada nodo firma periódicamente una señal de vida (presence: nodo, altura, hora). Las señales entran en los bloques y definen quién está activo. También cuentan para la disponibilidad, uno de los requisitos de nivel.
La cadena no se para
Si los nodos activos se apagan a la vez, cada hueco vacío adelanta un puesto a todos los demás. En pocos huecos, cualquier nodo registrado puede seguir produciendo. Los nodos ligeros nunca producen bloques: los bloques que firmen se rechazan.
Épocas
En el último bloque de cada época:
- Se suma lo que hay por descubrir: emisión de la época, el 80 % de las comisiones guardadas y el 0,1 % que devuelve la Reserva de la Red.
- 15 % lo descubren quienes produjeron y validaron bloques, a partes iguales por bloque.
- 85 % lo descubren quienes abrieron puentes: entregas comprobadas × multiplicador de nivel.
- Se liberan las bolsas de tokens (
pool.fund) que sigan activas. - Se publican la dificultad (trabajo verificado / VEL emitidos) y el precio del oráculo.
- Caducan las órdenes del mercado con
ttlvencido.
El trabajo de cada nodo no entra recibo a recibo: cada nodo publica una reclamación agregada (work.claim) con la raíz de Merkle de sus recibos, y la época siguiente comprueba 16 recibos al azar (work.prove). Ver Monta un nodo.
Ver Moneda VEL para la emisión y Monta un nodo para los niveles.
Elección de cadena y reorganizaciones
Cuando dos bloques compiten por la misma altura, gana la regla:
mejor = la cadena más alta; a igual altura, el bloque con el hash menor
Un nodo que ve una rama mejor cambia a ella (reorganización). Por el diseño de turnos, las reorganizaciones son cortas: normalmente de uno o dos bloques, cuando dos suplentes proponen casi a la vez. El indexador del explorador guarda los estados recientes para seguirlas y marca los bloques descartados como «rama descartada».
Finalidad {#finalidad}
En {{chain}} la finalidad es probabilística: cuantos más bloques tenga encima, más difícil es que un bloque se descarte.
| Uso | Confirmaciones recomendadas | Tiempo aproximado |
|---|---|---|
| Mensajes, pagos pequeños entre personas | 1 | Un bloque |
| Comercios y pasarelas de pago | 6 | Unos segundos |
| Exchanges, importes normales | 30 | ≈ 1 min con el ritmo objetivo |
| Exchanges, importes grandes | Una época | ≈ 1 h en la red principal |
La finalidad inmediata con firmas de 2/3 de los validadores está en la hoja de ruta de la red principal.
Estructura de un bloque
BlockHeader = { chain, height, prev, ts, slot, proposer, txRoot, receiptRoot, presenceRoot, stateRoot }
Block = { header, hash, sig, txs[], receipts[], presence[], rewards[], tokenRewards?[] }
hash = sha256(JSON canónico de header)
sig = ed25519 del proponente sobre hash
Las raíces son árboles de Merkle (SHA-256) de las transacciones, los recibos y las señales de vida. stateRoot es la huella del estado completo tras aplicar el bloque: dos nodos honrados llegan siempre al mismo.