Segwit: хранение произвольных данных в свидетеле?

Скажем, я хочу закодировать текст версии Библии короля Якова в цепочку блоков, по одному фрагменту за раз (замените это любой безумной идеей о потреблении большого количества блочного пространства). 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.

Как это устарело после принятия SegWit?

Ответы (1)

Ваша транзакция хоть и не недействительна, но нестандартна. Поскольку он нестандартен, он не будет распространяться и будет отклонен как нестандартный. Однако это не означает, что его нельзя включить в блок; он может. Требуется только, чтобы на майнере и на всех узлах между вами и этим майнером было запущено какое-то программное обеспечение, которое принимает и передает нестандартные транзакции. Однако на самом деле это делают не многие узлы, поэтому вам может быть трудно получить хорошее распространение вашей транзакции.

Нестандартный для узла segwit или не-segwit узел? Если узлы segwit считают такую ​​транзакцию нестандартной, то где это указано в документации?
SegWit устроен таким образом, что каждая трата SegWit нестандартна для узлов, не использующих SegWit.
@PieterWuille, конечно. Но как узел segwit, который понимает только программы-свидетели V0, отреагирует на мою атаку?
Будущие свидетельские версии не являются стандартными в соответствии с политикой Bitcoin Core именно по той причине, на которую вы указываете. Это универсально: все существующие конструкции, предназначенные для расширения в будущем, рассматриваются как нестандартные (например, коды операций OP_NOPx).
Стандартность @RichApodaca для выходных данных определяется этой функцией здесь: github.com/bitcoin/bitcoin/blob/master/src/policy/… . Вызванная функция решателя завершится в этом блоке if: github.com/bitcoin/bitcoin/blob/master/src/script/… . Из этого кода видно, что любой вывод свидетеля, отличный от v0, вернет false в решателе, что затем приведет к тому, что IsStandard также вернет false, указывая на то, что выходные данные свидетеля, отличные от v0, нестандартны. То же самое происходит здесь для входных данных github.com/bitcoin/bitcoin/blob/master/src/policy/…
Спасибо @PieterWuille. Похоже, что я упустил то, что все обновляемое поведение неявно помечается как нестандартное, поэтому нет необходимости документировать это в BIP SegWit.