Las Runas No Tienen una Especificación Formal
ord
es la implementación de referencia de las Runas y constituye la especificación normativa del protocolo de Runas.
Nada de lo que leas aquí o en cualquier otro lugar, aparte del código de ord
, constituye una especificación oficial. Esta descripción en prosa del protocolo de Runas se proporciona como una guía sobre el comportamiento de ord
, y siempre se debe consultar el código de ord
para confirmar la exactitud de cualquier descripción en prosa.
Si, debido a un error o bug en ord
, este documento se desvía del comportamiento real de ord
y resulta poco práctico modificar el comportamiento de ord
, este documento se actualizará para reflejar el comportamiento real de ord
.
Los usuarios que vayan a utilizar implementaciones alternativas lo hacen bajo su propio riesgo. Se recomienda encarecidamente a los servicios que deseen integrar Runas que utilicen ord
para realizar transacciones de Runas y para determinar el estado de las runas, los minteos y los saldos.
Piedras Rúnicas (Runestones)
Los mensajes del protocolo de Runas se denominan "runestones".
El protocolo de Runas se activa en el bloque 840,000, y las runestones en bloques anteriores se ignoran.
En términos abstractos, los runestones contienen los siguientes campos:
#![allow(unused)] fn main() { struct Runestone { edicts: Vec<Edict>, etching: Option<Etching>, mint: Option<RuneId>, pointer: Option<u32>, } }
Las Runas se crean mediante grabados (etchings):
#![allow(unused)] fn main() { struct Etching { divisibility: Option<u8>, premine: Option<u128>, rune: Option<Rune>, spacers: Option<u32>, symbol: Option<char>, terms: Option<Terms>, } }
Los cuales pueden tener estos términos de minteo:
#![allow(unused)] fn main() { struct Terms { amount: Option<u128>, cap: Option<u128>, height: (Option<u64>, Option<u64>), offset: (Option<u64>, Option<u64>), } }
Las runas se transfieren por medio de edictos (edict):
#![allow(unused)] fn main() { struct Edict { id: RuneId, amount: u128, output: u32, } }
Los IDs de las runas están codificados con la altura del bloque y el índice de transacción de la transacción en la cual la runa fue grabada:
#![allow(unused)] fn main() { struct RuneId { block: u64, tx: u32, } }
Los ID de las Runas son representados textualmente como BLOCK:TX
.
Los nombres de las runas se codifican como enteros modificados en base 26:
#![allow(unused)] fn main() { struct Rune(u128); }
Descifrado
Las piedras rúnicas se descifran basándose en las las transacciones con los siguientes pasos:
-
Encuentra la primera salida de transacción cuyo script pubkey comience con
OP_RETURN OP_13
. -
Concatenar todos los siguientes pushes de datos en un búfer.
-
Decodificar del búfer la secuencia de enteros de 128 bits LEB128.
-
Analizar y convertir la secuencia de enteros en un mensaje sin tipo (untyped).
-
Analizar y convertir el mensaje sin tipo (untyped) en una piedra rúnica.
El descifrado puede producir una piedra rúnica mal formada, denominada cenotafio.
Localizando la Salida de la Piedra Rúnica
Se examinan las salidas para identificar el primer script pubkey que comienza con OP_RETURN OP_13
. Si el descifrado no tiene éxito, no se tomarán en cuenta las salidas coincidentes siguientes.
Creación del Búfer
El búfer se ensambla concatenando los pushes de datos que vienen después de OP_13
, en el script pubkey correspondiente.
Los pushes de datos abarcan los opcodes del 0 al 78, el 78 incluido. Si se encuentra un opcode distinto, es decir, cualquier opcode igual o superior al 79, la piedra rúnica descifrada resultará ser un cenotafio sin grabado, minteo ni edictos.
Decodificación la Secuencia de Enteros
Del búfer se extrae y decodifica una secuencia de enteros de 128 bits como varints LEB128.
Los varints LEB128 se codifican como una serie de bytes, cada uno con el bit más significativo establecido, excepto el último.
La piedra rúnica decodificada será un cenotafio sin grabado, minteo ni edictos si un varint LEB128 contiene más de 18 bytes, desborda (overflow) un u128, o está truncado. Esto significaría que se alcanza el final del búfer de carga útil antes de encontrar un byte con el bit de continuación que no se ha establecido.
Análisis y Conversión del Mensaje
La secuencia de enteros se analiza y se convierte en un mensaje sin tipo (untyped):
#![allow(unused)] fn main() { struct Message { fields: Map<u128, Vec<u128>>, edicts: Vec<Edict>, } }
Los enteros se interpretan como una secuencia de pares de etiqueta/valor (tag/value), en donde las etiquetas duplicadas añaden su valor al valor del campo.
Si se encuentra una etiqueta con valor cero, todos los enteros siguientes se interpretan como una serie de edictos de cuatro enteros, cada uno compuesto por la altura de bloque de ID de la runa, un índice de transacción de ID de la runa, la cantidad y salida.
#![allow(unused)] fn main() { struct Edict { id: RuneId, amount: u128, output: u32, } }
Las alturas de bloque de ID de runa y los índices de transacción en los edictos son en codificación delta.
La decodificación del edicto de ID de runa comienza con una altura de bloque base y un índice de transacción inicial de cero. Al decodificar cada ID de runa, se añade primero el delta de la altura del bloque codificado a la altura del bloque base. Si el delta de la altura del bloque es cero, el siguiente entero es un delta del índice de transacción. Si el delta de la altura del bloque es mayor a cero, el siguiente entero es un índice de transacción absoluto.
Esto significa que los edictos deben ordenarse primero por ID de runa antes de ser codificados en una piedra rúnica.
Por ejemplo, para codificar los siguientes edictos:
bloque | TX | cantidad | salida |
---|---|---|---|
10 | 5 | 5 | 1 |
50 | 1 | 25 | 4 |
10 | 7 | 1 | 8 |
10 | 5 | 10 | 3 |
Primero se ordenan por altura de bloque e índice de transacción:
bloque | TX | cantidad | salida |
---|---|---|---|
10 | 5 | 5 | 1 |
10 | 5 | 10 | 3 |
10 | 7 | 1 | 8 |
50 | 1 | 25 | 4 |
Y luego el delta codificado como:
delta del bloque | delta de TX | cantidad | salida |
---|---|---|---|
10 | 5 | 5 | 1 |
0 | 0 | 10 | 3 |
0 | 2 | 1 | 8 |
40 | 1 | 25 | 4 |
La piedra rúnica decodificada es un cenotafio si la salida de un edicto supera el número de salidas de la transacción, si se encuentra un ID de runa de edicto con bloque cero y un índice de transacción distinto de cero, o si un campo está truncado lo cual significa que una etiqueta se encuentra sin valor.
Cabe señalar que si se produce un cenotafio en este caso, el cenotafio no estará vacío, lo que significa que tiene los campos y edictos, que pueden incluir un grabado y un minteo.
Análisis y Conversión de la Piedra Rúnica (Runestone)
La piedra rúnica:
#![allow(unused)] fn main() { struct Runestone { edicts: Vec<Edict>, etching: Option<Etching>, mint: Option<RuneId>, pointer: Option<u32>, } }
Se analiza a partir del mensaje sin firmar utilizando las siguientes etiquetas:
#![allow(unused)] fn main() { enum Tag { Body = 0, Flags = 2, Rune = 4, Premine = 6, Cap = 8, Amount = 10, HeightStart = 12, HeightEnd = 14, OffsetStart = 16, OffsetEnd = 18, Mint = 20, Pointer = 22, Cenotaph = 126, Divisibility = 1, Spacers = 3, Symbol = 5, Nop = 127, } }
Ten en cuenta que las etiquetas se agrupan por paridad, es decir, si son pares o impares. Las etiquetas impares que no son reconocidas se ignoran. Las etiquetas pares que no son reconocidas producen un cenotafio.
All unused tags are reserved for use by the protocol, may be assigned at any time, and should not be used.
Cuerpo (Body)
La etiqueta Body
indica el final de los campos de la piedra rúnica, causando que todos los enteros posteriores se interpreten como edictos.
Banderas (Flag)
El campo Flag
contiene un mapa de bits de banderas, cuya posición es 1 << FLAG_VALUE
:
#![allow(unused)] fn main() { enum Flag { Etching = 0, Terms = 1, Turbo = 2, Cenotaph = 127, } }
La bandera Etching
indica que esta transacción contiene un grabado.
La bandera Terms
indica que el grabado de esta transacción tiene términos de minteo abiertos.
La bandera Turbo
indica que el grabado de esta transacción opta por futuros cambios en el protocolo. Estos cambios pueden aumentar los costos de validación para clientes ligeros o ser altamente degenerados.
La bandera Cenotaph
no es reconocida.
Si después de eliminar las banderas reconocidas, el valor del campo de banderas es distinto de cero, la piedra rúnica se considera un cenotafio.
Runa
El campo Rune
especifica el nombre de la runa que se está grabando. Si la bandera Etching
está activa pero el campo Rune
se omite, se asigna un nombre de runa reservado.
Premina
El campo Premine
especifica la cantidad de runas preminadas.
Tope
El campo Cap
especifica el número de minteos permitidos.
Cantidad
El campo Amount
especifica la cantidad de runas que recibe cada transacción de minteo.
HeightStart y HeightEnd
Los campos HeightStart
y HeightEnd
especifican las alturas de bloque absolutas de inicio y fin del minteo. El minteo comienza en el bloque con altura HeightStart
y finaliza en el bloque con altura HeightEnd
.
OffsetStart y OffsetEnd
Los campos OffsetStart
y OffsetEnd
especifican las alturas de bloque de inicio y fin del minteo, relativas al bloque en el que se extrae el grabado. El minteo comienza en el bloque con altura OffsetStart + ETCHING_HEIGHT
y termina en el bloque con altura OffsetEnd
+ ETCHING_HEIGHT
.
Minteo
El campo Mint
especifica el ID de la runa que se minteara en dicha transacción.
Puntero
The Pointer
field contains the index of the output to which runes unallocated by edicts should be transferred. If the Pointer
field is absent, unallocated runes are transferred to the first non-OP_RETURN
output. If the pointer is greater than the number of outputs, the runestone is a cenotaph.
Cenotafio
El campo Cenotaph
no es reconocido.
Divisibilidad
El campo Divisibility
, elevado a la potencia de diez, determina el número de subunidades en una unidad de runas.
Por ejemplo, aca se observa la cantidad 1234
de diferentes runas con divisibilidad de 0 a 3:
Divisibilidad | Aparece |
---|---|
0 | 1234 |
1 | 123.4 |
2 | 12.34 |
3 | 1.234 |
Separadores
El campo Spacers
es un mapa de bits de separadores •
que deben mostrarse entre las letras del nombre de una runa.
El campo N del mapa de bits, comenzando desde el menos significativo, determina si debe mostrarse un separador entre los caracteres N y N+1, comenzando desde la izquierda del nombre de la runa.
Por ejemplo, el nombre de la runa AAAA
representado con diferentes separadores:
Separadores | Aparece |
---|---|
0b1 | A•AAA |
0b11 | A•A•AA |
0b10 | AA•AA |
0b111 | A•A•A•A |
Los separadores al final del nombre son ignorados.
Símbolo
El campo Symbol
representa el punto de código Unicode del símbolo de la runa, el cual debe aparecer después de las cantidades de esa runa. Si una runa no tiene un símbolo específico, se debe utilizar el carácter de moneda genérico ¤
.
Por ejemplo, si el Symbol
es #
y la divisibilidad es 2, la cantidad de 1234
unidades debe aparecer como 12.34 #
.
Nop
El campo Nop
no es reconocido.
Cenotafios
Los cenotafios tienen los siguientes efectos:
-
Todas las runas ingresadas a una transacción que contiene un cenotafio se queman.
-
Si la piedra rúnica que produjo el cenotafio contenía un grabado, la runa grabada tiene un suministro de cero y no se puede mintear.
-
Si la piedra rúnica que produjo el cenotafio es un minteo, esta se contabiliza contra el límite de minteos y las runas minteadas se queman.
Los cenotafios pueden generarse si una piedra rúnica contiene una etiqueta par no reconocida, una bandera no reconocida, un edicto con un número de salida mayor al número de entradas, un ID de runa con bloque cero y un índice de transacción distinto a cero, un varint malformado, una instrucción que no es push de datos en el script pubkey de la salida de la piedra rúnica, una etiqueta sin valor posterior o enteros al final que no formen parte de un edicto.
Ejecución de la Piedra Rúnica
Las piedras rúnicas se ejecutan en el orden en que sus transacciones se incluyan en los bloques.
Grabados
Una piedra rúnica puede contener este grabado:
#![allow(unused)] fn main() { struct Etching { divisibility: Option<u8>, premine: Option<u128>, rune: Option<Rune>, spacers: Option<u32>, symbol: Option<char>, terms: Option<Terms>, } }
rune
es el nombre de la runa que sera grabada, codificada como un entero modificado de base-26.
Los nombres de runas consisten en las letras de la A a la Z, con la siguiente codificación:
Nombre | Codificación |
---|---|
A | 0 |
B | 1 |
… | … |
Y | 24 |
Z | 25 |
AA | 26 |
AB | 27 |
… | … |
AY | 50 |
AZ | 51 |
BA | 52 |
Y así sucesivamente.
Los nombres de runas AAAAAAAAAAAAAAAAAAAAAAAAAAA
y superiores están reservados.
Si rune
se omite, se asigna un nombre de runa reservado de la siguiente manera:
#![allow(unused)] fn main() { fn reserve(block: u64, tx: u32) -> Rune { Rune( 6402364363415443603228541259936211926 + (u128::from(block) << 32 | u128::from(tx)) ) } }
6402364363415443603228541259936211926
corresponde al nombre de runa AAAAAAAAAAAAAAAAAAAAAAAAAAA
.
Si rune
está presente, debe desbloquearse a partir del bloque en el que aparece el grabado.
Inicialmente, todos los nombres de runas de trece caracteres o más, hasta el primer nombre de runa reservado, están desbloqueados.
Las runas comienzan a desbloquearse en el bloque 840,000, el bloque en el que se activa el protocolo de runas.
A partir de entonces, cada período de 17,500 bloques, se desbloquea continuamente la siguiente longitud más corta de nombres de runas. Entre el bloque 840,000 y el 857,500, se desbloquean los nombres de runas de doce caracteres, entre el bloque 857,500 y el 875,000 se desbloquean los nombres de runas de once caracteres, y así sucesivamente, hasta que los nombres de runas de un solo carácter se desbloqueen entre el bloque 1,032,500 y el bloque 1,050,000. Consulte la base de código ord
para el calendario preciso de desbloqueo.
Para evitar el front running de un grabado que ha sido transmitido pero no minado, si se está grabando un nombre de runa no reservado, la transacción de grabado debe contener un compromiso válido con el nombre que se está grabando.
Un compromiso consiste en un push de datos del nombre de la runa, codificado como un entero little-endian con los bytes de cero al final eliminados, presente en el testigo de entrada tapscript donde la salida que se gasta tiene al menos seis confirmaciones.
Si no hay un compromiso válido, se ignora el grabado.
Minteo
Una piedra rúnica puede mintear una runa incluyendo el ID de la runa en el campo Mint
.
Si el minteo está abierto, la cantidad minteada se añade a las runas no asignadas en las entradas de la transacción. Estas runas pueden ser transferidas usando edictos, y de lo contrario, se transferirán a la primera salida que no sea OP_RETURN
, o a la salida designada por el campo Pointer
.
Los minteos pueden realizarse en cualquier transacción despues del grabado, incluso en el mismo bloque.
Transferencia
Las runas se transfieren por medio de edictos (edict):
#![allow(unused)] fn main() { struct Edict { id: RuneId, amount: u128, output: u32, } }
Una piedra rúnica puede contener cualquier número de edictos, los cuales se procesan en secuencia.
Antes de procesar los edictos, las runas de entrada, así como las runas minteadas o preminadas, si las hay, no están asignadas.
Cada edicto reduce el saldo que no ha sido asignado de la runa id
e incrementa el saldo asignado a las salidas de transacción de la runa id
.
Si un edicto asignara más runas de las que no están asignadas, amount
se reduce al número de runas que no estan asignadas. En otras palabras, el edicto asigna todas las unidades restantes que no han sido asignadas de la runa id
.
Dado que el ID de una runa grabada no se conoce antes de que se incluya en un bloque, se usa el ID 0:0
para referirse a la runa que se está grabando en esta transacción, si la hay.
Un edicto con con el valor amount
igual a cero asigna todas las unidades restantes de la runa id
.
Un edicto con output
igual al número de salidas de la transacción asigna amount
de runas a cada salida que no sea OP_RETURN en orden.
Un edicto con el valor de amount
igual a cero y output
igual al número de salidas de la transacción distribuye todas las unidades no asignadas de la runa id
entre cada salida que no sea OP_RETURN
. Si la cantidad de runas no asignadas no se puede dividir equitativamente entre las salidas que no son OP_RETURN
, se asigna una runa adicional a las primeras R
salidas que no son OP_RETURN
, donde R
es el residuo que queda después de dividir el balance de unidades no asignadas de la runa id
por el número de salidas que no son OP_RETURN
.
La piedra rúnica se convierte en un cenotafio si algún edicto en una piedra rúnica tiene un ID de runa con block
igual a cero y tx
mayor que cero, o output
mayor que el número de salidas de la transacción.
Se debe tener en cuenta que los edictos en los cenotafios no se procesan, y todas las runas de entrada se queman.