P2PK
Pay To Public Key — travando uma saída a uma chave pública
O P2PK (Pay To Public Key) é um padrão de script que trava uma saída a uma chave pública.
É uma versão mais simples do script de travamento P2PKH, mais comumente usado.
Script legado. Este é um padrão de script legado e é raramente usado.
Uso
Como o P2PK funciona?
ScriptPubKey (trava)
Para criar uma trava P2PK, você só precisa colocar uma chave pública e um opcode OP_CHECKSIG no ScriptPubKey:
ASM
OP_PUSHBYTES_65
049464205950188c29d377eebca6535e0f3699ce4069ecd77ffebfbd0bcf95e3c134cb7d2742d800a12df41413a09ef87a80516353a2f0a280547bb5512dc03da8
OP_CHECKSIG Hex
41049464205950188c29d377eebca6535e0f3699ce4069ecd77ffebfbd0bcf95e3c134cb7d2742d800a12df41413a09ef87a80516353a2f0a280547bb5512dc03da8ac Transação: 1db6251a9afce7025a2061a19e63c700dffc3bec368bd1883decfac353357a9d (Saída 1)
Este exemplo contém uma chave pública não comprimida de 65 bytes.
A chave pública pode ser uma chave pública não comprimida (65 bytes) ou uma chave pública comprimida (33 bytes). Você pode usar qualquer uma dentro de um P2PK.
ScriptSig (destrava)
Para destravar um P2PK, você só precisa fornecer uma assinatura válida no ScriptSig:
ASM
OP_PUSHBYTES_72
3045022100c219a522e65ca8500ebe05a70d5a49d840ccc15f2afa4ee9df783f06b2a322310220489a46c37feb33f52c586da25c70113b8eea41216440eb84771cb67a67fdb68c01 Hex
483045022100c219a522e65ca8500ebe05a70d5a49d840ccc15f2afa4ee9df783f06b2a322310220489a46c37feb33f52c586da25c70113b8eea41216440eb84771cb67a67fdb68c01 Transação: e827a366ad4fc9a305e0901fe1eefc7e9fb8d70655a079877cf1ead0c3618ec0 (Entrada 0)
Execução
Quando o script roda, tanto a assinatura quanto a chave pública são empurradas para a pilha, e então o opcode OP_CHECKSIG verifica a assinatura contra a chave pública e empurra um OP_1 para a pilha se a assinatura for válida.
Se a assinatura não for válida, um OP_0 é empurrado para a pilha e o script é inválido.
Exemplos
Onde você encontra scripts P2PK?
Apesar de ser o script mais simples para travar bitcoins à chave pública de alguém, o P2PK não é tão usado quanto o script P2PKH, similar (porém um pouco mais complexo).
Aqui estão alguns exemplos de transações que usam P2PK:
- ScriptPubKey: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b (saída 0)
ScriptSig: — - A transação coinbase do bloco gênese. Esta saída não foi gasta.
- ScriptPubKey: f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 (saída 0)
ScriptSig: ea44e97271691990157559d0bdd9959e02790c34db6c006d779e82fa5aee708e (entrada 0) - A primeira transação de bitcoin de todas, do Satoshi para o Hal Finney. O Satoshi de fato usou P2PK para ambas as saídas na primeira transação, mesmo com o P2PKH disponível. Isso provavelmente foi porque o Hal estava mais do que confortável usando criptografia de chave pública diretamente, e o Satoshi não quis se incomodar com a camada extra de complexidade que vem com o P2PKH.
- ScriptPubKey: 3db8816c460f674e47f0e5799656721a249acdd53cd43a530c83384577485947 (saída 0)
ScriptSig: cda1f7d88232ff7e4fc1fcbf8a66b2cc3b8e19b5bc0ad22618453b8b75156740 (entrada 0) - Esta transação contém um P2PK travado a uma chave pública comprimida de 33 bytes (ao contrário de uma chave pública não comprimida de 65 bytes nos exemplos acima).
Transações Coinbase
Você encontrará P2PK com mais frequência em transações coinbase nos blocos mais antigos da blockchain.
Isso porque o minerador original do Bitcoin Core enviava a recompensa de bloco para um P2PK ao construir um bloco candidato:
É bem raro encontrar scripts de travamento P2PK sendo usados por aí hoje em dia.
Por que o Satoshi usou P2PK no minerador do Bitcoin Core?
Não tenho certeza. O Satoshi nunca deu uma razão para essa escolha.
Eu acho que o P2PKH foi usado como uma forma conveniente de os humanos fazerem transações, pois permitia usar endereços em vez de passar adiante a sua chave pública (que é mais longa). Já os mineradores não precisam da conveniência dos endereços, então o P2PK era uma escolha mais simples.
Por que não usamos P2PK com mais frequência?
O Satoshi projetou o P2PKH para que possamos enviar uns aos outros endereços mais curtos, em vez de chaves públicas completas.
Por conveniência, as carteiras de Bitcoin então passaram a oferecer apenas a capacidade de enviar bitcoins para endereços (que se convertem em scripts P2PKH), então a única forma de usar P2PK é construir um manualmente em uma transação bruta.
Endereço
O P2PK tem um endereço?
Um P2PK não tem um endereço oficial. Porém, você às vezes encontrará exploradores de blockchain exibindo endereços para scripts de travamento P2PK, mesmo que tecnicamente eles não tenham um.
Por exemplo, este é o ScriptPubKey da saída da transação gênese, que usa um script de travamento P2PK:
ASM
OP_PUSHBYTES_65
04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
OP_CHECKSIG Hex
4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac Transação: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b (Saída 0)
Este script de travamento P2PK não tem um endereço oficial, mas alguns exploradores de blockchain vão mostrar que ele tem o endereço 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa:
Esse, na verdade, é o endereço que ele teria se fosse um P2PKH em vez de um P2PK.
Então, quando você vê um endereço para um P2PK, o explorador de blockchain tomou a iniciativa de aplicar o HASH160 à chave pública dentro do P2PK e, então, convertê-lo em um endereço base58 para mostrar a você qual teria sido o endereço daquela saída se ela fosse, na verdade, um script de travamento P2PKH.
HASH160
Endereço (Base58)
Então, embora P2PK e P2PKH sejam similares, e ambos travem moedas para a mesma pessoa se ambos contiverem a mesma chave pública, não é tecnicamente correto dizer que um script de travamento P2PK tem um endereço.
O único benefício de encontrar os "endereços" dos P2PKs é se você estivesse fazendo alguma forma de análise de blockchain e quisesse ver se moedas foram travadas à mesma chave pública via um P2PK ou um P2PKH, e quisesse usar um endereço como parâmetro de busca.