Segwit: ¿Almacenamiento de datos arbitrarios en testigo?

Digamos que quiero codificar el texto de la versión King James de la Biblia en la cadena de bloques, una pieza a la vez (reemplace esto con cualquier idea loca para consumir grandes cantidades de espacio de bloque). OP_RETURN no es práctico porque solo puedo trabajar con fragmentos de 80 bytes.

Me doy cuenta de que SegWit permite almacenar muchos más datos, hasta 3 MB/bloque, en datos testigo.

Claramente, no puedo usar un programa testigo V0 porque mis datos de testigo deben tomar la forma

<signature> <pubkey>

Sin embargo, creo que puedo usar un programa testigo V1. Los scripts con esa versión no serán compatibles inmediatamente después de la implementación de SegWit, pero observo esto en BIP-141 :

Si el byte de la versión es del 1 al 16, no se produce ninguna interpretación adicional del programa testigo o la pila testigo, y no hay restricción de tamaño para la pila testigo. Estas versiones están reservadas para futuras ampliaciones.

Así que aquí está mi plan. Voy a crear un script de salida de la forma:

<0x01> <0x0000>

Este es un programa testigo V1. De acuerdo con BIP-141, el programa testigo no debe interpretarse y la siguiente pila testigo no tendrá restricciones de tamaño.

Luego voy a gastar esa salida con una entrada de transacción testigo. El testigo de mi transacción codifica mil bytes de texto.

Cuando publique esta transacción de gasto, se propagará por nodos. No pueden rechazarlo como inválido porque eso rompería la compatibilidad hacia adelante cuando se introduzcan los scripts V1. BIP-141 no dice nada sobre si tales transacciones deben o no ser retransmitidas (ni BIP-144), por lo que supongo que lo serán.

Siempre que pague una tarifa lo suficientemente alta, mi transacción eventualmente será minada. Incluso obtengo un 75% de descuento sobre el uso de OP_RETURN porque mi texto está codificado en el testigo.

Y no hay nada que el protocolo haga para detenerme. ¿O hay?

Editar: para simplificar las cosas, suponga que SegWit se ha implementado ampliamente y que la mayoría de los nodos entienden los programas testigo V0. Claramente, los nodos que no sean SegWit no transmitirán una transacción testigo porque se considerará no estándar. Estoy interesado en el comportamiento de los nodos SegWit.

¿Cómo envejeció después de la adopción de SegWit?

Respuestas (1)

Su transacción, aunque no es inválida, no es estándar. Dado que no es estándar, no se propagará y se rechazará por no ser estándar. Sin embargo, esto no significa que no se pueda incluir en un bloque; puede. Solo requiere que el minero y todos los nodos entre usted y ese minero estén ejecutando algún software que acepte y transmita transacciones no estándar. Sin embargo, no muchos nodos realmente lo hacen, por lo que es posible que tenga dificultades para obtener una buena propagación de su transacción.

¿No estándar para un nodo segwit o un nodo no segwit? Si los nodos segwit consideran que dicha transacción no es estándar, ¿dónde se indica en la documentación?
Segwit está construido de tal manera que cada gasto de SegWit no es estándar para los nodos que no son segwit.
@PieterWuille, por supuesto. Pero, ¿cómo respondería a mi ataque un nodo segwit que solo comprende programas testigo V0?
Las futuras versiones testigo no son estándar por política en Bitcoin Core precisamente por la razón que señala. Esto es genérico: todas las construcciones que existen que están destinadas a una futura extensibilidad se tratan como no estándar (por ejemplo, también los códigos de operación OP_NOPx).
El estándar de @RichApodaca para las salidas se define mediante esta función aquí: github.com/bitcoin/bitcoin/blob/master/src/policy/… . La función de resolución a la que se llama terminará en este bloque if: github.com/bitcoin/bitcoin/blob/master/src/script/… . A partir de ese código, puede ver que cualquier salida de testigo que no sea v0 devolverá falso en el solucionador, lo que luego hará que IsStandard también devuelva falso, lo que indica que las salidas de testigo que no sean v0 no son estándar. Lo mismo sucede aquí para las entradas github.com/bitcoin/bitcoin/blob/master/src/policy/…
Gracias @PieterWuille. Parece que lo que me faltaba es que todo el comportamiento actualizable está marcado implícitamente como no estándar, por lo que no es necesario documentar esto en los BIP de SegWit.