Есть несколько ограничений на структуру транзакции coinbase (вознаграждения) в блоке.
vin.size() == 1
( источник )vin[0].prevout.IsNull()
( источник )vin[0].scriptSig.size() <= 100
( источник )vin[0].scriptSig.size() >= 2
( источник )Я не вижу смысла ни в одном из них. #1 и #2 включают BIP34 , но они не обязательны для достижения того же результата. Ограничения по размеру на самом деле ничего не ограничивают, если майнер хочет создать большой блок, он может просто много-много выходов в своей базе монет или много-много транзакций в свой блок.
Почему транзакция coinbase не является просто транзакцией, которая:
В частности, coinbase может иметь дополнительные нулевые входы и тратить предыдущие выходы.
Я знаю, что для Биткойна, вероятно, уже слишком поздно что-то менять. Является ли это случаем чрезмерного проектирования или существуют соображения безопасности для любого из этих ограничений на базе монет? Ослабление ограничения № 2, в частности, заставляет меня задуматься из-за электронного письма списка рассылки разработчиков биткойнов, в котором говорилось, что разрешение coinbase тратить prevouts позволит безопасно платить майнеру за майнинг реорганизации цепочки определенным образом.
Правильный ответ: спросите Сатоши.
Мои предполагаемые ответы на вопросы, которые вы задали:
Почему только один вход? Вы не можете предсказать, когда конкретная транзакция coinbase превратится в успешный блок, и вы не можете потратить результат транзакции coinbase на 100 блоков. Это означает, что использование обычной транзакции намного лучше любых обычных расходов. Если нет нормального случая для добавления входных данных в базу монет, возможно, Сатоши решил, что лучше запретить входные данные, чтобы предотвратить необдуманные атаки.
Зачем ссылаться на нулевой минус ? Использование того же базового формата, что и в обычной транзакции, вероятно, позволяло повторно использовать код. Если бы он оптимизировал базу монет, мы бы сэкономили 36 байт умножить на 338 692 блока (на данный момент), или около 12 МБ. Не так уж и важно.
Зачем ограничивать размер базы монет до 100 байт? Мы знаем, что Сатоши использовал coinbase, чтобы поместить сообщение в блок 0. Возможно, ограничение в 100 байт было его попыткой помешать кому-либо еще использовать тот же механизм для добавления слишком длинных сообщений. Вероятно, это было довольно разумно: с самых ранних дней до сегодняшнего дня многие майнеры добавляют сообщения во все свои базы монет — мы можем только представить, насколько раздражающими и расточительными были бы эти сообщения, если бы они не были ограничены 100 байтами.
Зачем указывать минимальный размер базы монет как 2 байта? Это весьма спекулятивно, но, возможно, Сатоши предвидел легкое дублирование баз монет, описанное в BIP30, и хотел, чтобы люди использовали что-то вроде оригинального экстранонса , чтобы предотвратить случайные коллизии TXID.
#1
Что ж, когда Сатоши принял проектное решение, правила консенсуса не отклоняли блоки, в которых не учитывалась высота блока (это было сделано с BIP34 , поэтому атака, которую вы описываете, не сработала. Однако оплата конкретному майнеру за создание блок является антидецентрализованным --- если вы платите конкретному майнеру, вы, вероятно, не поощряете децентрализованный майнинг с использованием комиссии #2
за транзакцию.
Ник Оделл
#1 and #2 enable BIP34
Собственно, высота блока идет в скрипте Sig, а не в prevout.морсекодер