Скажем, я хочу закодировать текст версии Библии короля Якова в цепочку блоков, по одному фрагменту за раз (замените это любой безумной идеей о потреблении большого количества блочного пространства). OP_RETURN нецелесообразен, потому что я могу работать только с 80-байтовыми чанками.
Я заметил, что SegWit позволяет хранить гораздо больше данных — до 3 МБ/блок — в данных-свидетелях.
Ясно, что я не могу использовать программу-свидетель V0, потому что мои данные свидетеля должны иметь вид
<signature> <pubkey>
Тем не менее, я считаю, что могу использовать программу-свидетель V1. Скрипты этой версии не будут поддерживаться сразу после развертывания SegWit, но я заметил это в BIP-141 :
Если байт версии имеет значение от 1 до 16, дальнейшая интерпретация программы-свидетеля или стека-свидетеля не происходит, и для стека-свидетеля нет ограничений по размеру. Эти версии зарезервированы для будущих расширений.
Итак, вот мой план. Я собираюсь создать выходной скрипт вида:
<0x01> <0x0000>
Это программа-свидетель V1. Согласно BIP-141, программа-свидетель не подлежит интерпретации, и последующий стек-свидетель не имеет ограничений по размеру.
Затем я собираюсь использовать этот вывод с вводом свидетельской транзакции. Свидетель моей транзакции кодирует тысячу байтов текста.
Когда я опубликую эту расходную транзакцию, она будет распространяться узлами. Они не могут отклонить его как недействительный, потому что это нарушит прямую совместимость, когда будут введены сценарии V1. BIP-141 ничего не говорит о том, следует ли ретранслировать такие транзакции (как и BIP-144), поэтому я предполагаю, что они будут.
Пока я плачу достаточно высокую комиссию, моя транзакция в конечном итоге должна быть добыта. Я даже получаю скидку 75% по сравнению с использованием OP_RETURN, потому что мой текст закодирован в свидетеле.
И протокол ничего не сделает, чтобы остановить меня. Или есть?
Редактировать: для простоты предположим, что SegWit широко используется и что большинство узлов понимают программы-свидетели V0. Очевидно, что узлы, не поддерживающие SegWit, не будут передавать транзакцию-свидетель, поскольку она будет считаться нестандартной. Меня интересует поведение узлов SegWit.
Ваша транзакция хоть и не недействительна, но нестандартна. Поскольку он нестандартен, он не будет распространяться и будет отклонен как нестандартный. Однако это не означает, что его нельзя включить в блок; он может. Требуется только, чтобы на майнере и на всех узлах между вами и этим майнером было запущено какое-то программное обеспечение, которое принимает и передает нестандартные транзакции. Однако на самом деле это делают не многие узлы, поэтому вам может быть трудно получить хорошее распространение вашей транзакции.
CSᵠ