Почему реализация майнера по умолчанию использует pay-to-pubkey?

Глядя на исходный код v0.9.3 в miner.cpp:

CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey)
{
    CPubKey pubkey;
    if (!reservekey.GetReservedKey(pubkey))
        return NULL;

    CScript scriptPubKey = CScript() << pubkey << OP_CHECKSIG;
    return CreateNewBlock(scriptPubKey);
}

По умолчанию scriptPubKeyиспользуется pay-to-pubkey? Нужно ли его сохранять для совместимости? Я просто удивлен, что он не использует хеш-плату за публичный ключ.

Читая код, я согласен с вашей оценкой. Вероятно, не нужно оставаться таким для совместимости, но я понятия не имею, почему они сделали это именно так.
Я думаю, что P2PK был единственным, что использовалось в начале, так что я понимаю, почему это началось именно так, мне просто интересно, почему его никогда не меняли...
Невозможно создать P2PK только из биткойн-адреса, поэтому P2PKH должен был существовать с самого начала.
Я не говорю, что этого нельзя было сделать, просто никто не использовал P2PKH до более позднего времени.
@NickODell напоминает, что изначально Биткойн использовал IP-транзакции , а не адреса. Мне нужно проверить, чтобы быть абсолютно уверенным, но я не думаю, что Биткойн 0.1 включал P2PKH.

Ответы (1)

Плата за PubKey (P2PK) и оплата за PubKey-Hash (P2PKH) были представлены в оригинальной версии Биткойн 0.1. P2PK использовался по умолчанию для майнинга и платежей, полученных по протоколу интерактивных платежей IP-to-IP ; P2PKH предназначался для использования в неинтерактивных платежах, но транзакции P2PKH занимают больше места в блокчейне, чем P2PK.

Это экономия места, почему Накамото решил использовать P2PK для майнинга и интерактивных платежей, даже когда у него был P2PKH, или у него была какая-то другая причина для использования других типов транзакций? Думаю, только он знает.

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

Type   Output                Input             Total Bytes
       ScriptPubKey          ScriptSig

       push ....... 1        push  ... 1
       <key> ...... 33       <sig> ... ~72
P2PK   checksig ... 1
       --------------        -------------
       Total ...... 35       Total ... ~73     ~108

       dup ........ 1        push .... 1
       hash160 .... 1        <sig> ... ~72
       push ....... 1        push .... 1
P2PKH  <hash> ..... 20       <key> ... 33
       equal ...... 1
       checksig ... 1
       --------------        --------------
       Total ...... 25       Total ... ~107   ~132

Числа выше предполагают, что вы используете сжатый открытый ключ , который широко используется сегодня, но не был реализован до Bitcoin Core 0.6.0 . Если вы хотите рассмотреть более старые «несжатые» открытые ключи, добавьте 32 байта к <key>размерам байтов. Кроме того, мы игнорируем все постоянные факторы при создании вывода или ввода и просто учитываем количество байтов в скрипте.

Я не знаю о каких-либо проблемах совместимости — многие майнеры и майнинговые пулы используют свое собственное программное обеспечение для оплаты на адреса P2PKH, как вы можете видеть из монетных баз в последних блоках.

Возможно ли, что это устаревшая информация? На прошлой неделе я пил кофе с Питером, и он рассчитал PREVOUT + SCRIPTSIG = 36 + (1 + 1 + 33 + 1 + (71 or 72)) = 143 or 144ввод P2PKH.
Числа здесь 1) не включают prevout и 2) предполагают несжатый pubkey.
@Murch Я обновил ответ, чтобы использовать сжатые открытые ключи, упомянуть несжатые открытые ключи и указать, что не учитывается. Я считаю, что все расчеты были (и остаются) правильными; однако некоторая историческая информация была неверной (как я узнал с момента первого написания этого ответа), поэтому я исправил это. Кроме того, я рад, что вы с Питером смогли вместе выпить кофе. :-)