Pay-to-Script Hash

Origem: Wikipédia, a enciclopédia livre.

O Pay-to-Script-Hash (P2SH) foi introduzido em 2012 como um novo e poderoso tipo de transação bitcoin que simplifica muito o uso de scripts de transação complexos[1]. De acordo com Gavin Andresen, autor do Bitcoin Improvement Proposal 16 (BIP-16), o objetivo da P2SH é: "Mover a responsabilidade de fornecer as condições para resgatar uma transação do remetente dos fundos para o destinatário"[2].

P2SH é a extensão da ideia de multisignature, mas reduzindo a carga sobre a infra-estrutura do Bitcoin em termos de armazenamento requerido e mas também reduzindo a complexidade do código. Uma transação comum 2-de-3 multisignature pode levar até cinco vezes mais espaço do que um pagamento simples para endereçar ou pagar para uma transação de chave pública[3].

Usando P2SH, pode-se enviar bitcoins para um endereço que é protegido de várias maneiras incomuns sem saber nada sobre os detalhes de como a segurança é configurada. Os bitcoins são enviados para um endereço P2SH de aproximadamente 34 caracteres. O destinatário pode precisar das assinaturas de várias pessoas para gastar esses bitcoins, ou uma senha pode ser necessária ou os requisitos podem ser completamente exclusivos[4].

Transação Bitcoin[editar | editar código-fonte]

A transferência de bitcoins na rede bitcoin se dá através de transações entre o endereço remetente e o destinatário. Em geral, esses endereços pertencem a pessoas diferentes, mas é possível que um usuário crie um endereço destinatário para si, fazendo uma auto-transferência de bitcoins.

Transações são a parte mais importante do sistema bitcoin. Todo o resto é desenhado para garantir que as transações possam ser criadas, propagadas na rede, validadas, e finalmente adicionadas ao livro-razão de transações (a blockchain). Transações são estruturas de dados que codificam a transferência de valor entre participantes do sistema bitcoin. Cada transação é uma entrada pública na blockchain do bitcoin, o livro-razão de dupla entrada global[5].

UTXO[editar | editar código-fonte]

UTXO (unspent transaction output)ou saída de transação não utilizada, é o segmento de saída de uma transação, especificamente as partes value e scriptPubKey. E enquanto essa saída de transação permanecer não gasta, ou seja, não for utilizada como a Entrada de uma transação subsequente, ela será um UTXO. Toda transação que é gravada no blockchain modifica o conjunto UTXO[6].

Script Bitcoin[editar | editar código-fonte]

A linguagem de script de transação de bitcoin, chamada Script, é uma linguagem de execução baseada em pilha de notação reversa semelhante a Forth. Quando uma transação é validada, o script de desbloqueio em cada entrada é executado ao lado do script de bloqueio correspondente para ver se ele satisfaz a condição de gasto.

Script é uma linguagem muito simples que foi projetado para ser limitado em escopo e executável em uma variedade de hardware, talvez tão simples quanto um dispositivo incorporado. Requer processamento mínimo e não pode fazer muitas das coisas sofisticadas que as linguagens de programação modernas podem fazer. Para seu uso na validação de dinheiro programável, esse é um recurso de segurança deliberado[1].

Script de Bloqueio[editar | editar código-fonte]

Um script de bloqueio é uma condição de gasto colocada em uma saída: especifica as condições que devem ser atendidas para gastar a saída no futuro. O script de bloqueio também é chamado de scriptPubKey, porque geralmente contém uma chave pública ou endereço de bitcoin (hash de chave pública)[1].

Script de Desbloqueio[editar | editar código-fonte]

Um script de desbloqueio é um script que satisfaz as condições colocadas em uma saída por um script de bloqueio e permite que a saída seja gasta. Desbloquear scripts faz parte de todas as entradas de transações. Na maioria das vezes, eles contêm uma assinatura digital produzida pela carteira do usuário a partir de sua chave privada. Script de desbloqueio também é conhecido por scriptSig, porque pode conter uma assinatura digital[1].

Script Simples[editar | editar código-fonte]

Embora a maioria dos scripts de bloqueio se refira a um hash de chave pública (essencialmente, um endereço de bitcoin), exigindo, portanto, que a prova de propriedade gaste os fundos, o script não precisa ser tão complexo. Qualquer combinação de scripts de bloqueio e desbloqueio que resulte em um valor VERDADEIRO é válida. A aritmética simples que usamos como exemplo da linguagem de script também é um script de bloqueio válido que pode ser usado para bloquear uma saída de transação[1].

Pay-to-Public-Key-Hash (P2PKH)[editar | editar código-fonte]

A grande maioria das transações processadas na rede bitcoin gasta as saídas bloqueadas com um script Pay-to-Public-Key-Hash (P2PKH). Essas saídas contêm um script de bloqueio que bloqueia a saída para um hash de chave pública, mais comumente conhecido como um endereço de bitcoin. Uma saída bloqueada por um script P2PKH pode ser desbloqueada apresentando uma chave pública e uma assinatura digital criada pela chave privada correspondente[1].

Multi-assinatura[editar | editar código-fonte]

Os scripts de múltiplas assinaturas definem uma condição em que N chaves públicas são registradas no script e pelo menos M delas devem fornecer assinaturas para desbloquear os fundos. Isso também é conhecido como um esquema M-de-N, onde N é o número total de chaves e M é o limite de assinaturas requerido para validação. Por exemplo, uma assinatura múltipla 2-de-3 é aquela em que três chaves públicas são listadas como possíveis assinantes e pelo menos duas delas devem ser usadas para criar assinaturas para uma transação válida para gastar os fundos.

Os scripts padrão de multi-segurança são limitados a no máximo 3 chaves públicas listadas, o que significa que você pode fazer de 1 a 1 a 3 de 3 múltiplas assinaturas ou qualquer combinação dentro desse intervalo[1].

Descrição[editar | editar código-fonte]

O P2SH foi desenvolvido para resolver essas dificuldades práticas e tornar o uso de scripts complexos tão fácil quanto um pagamento para um endereço de bitcoin. Com pagamentos P2SH, o script de bloqueio complexo é substituído por sua impressão digital, um hash criptográfico[1].

Quando uma transação que tenta gastar o UTXO é apresentada posteriormente, ele deve conter o script que corresponde ao hash, além do script de desbloqueio.

Em termos simples, P2SH significa "pagar por um script que corresponda a este hash, um script que será apresentado mais tarde quando esta saída for gasta"[3].

Em transações P2SH, o script de bloqueio que é substituído por um hash é chamado de script de resgate porque é apresentado ao sistema no momento do resgate, e não como um script de bloqueio.

Esse hash deriva de um script de resgate, que funciona de maneira semelhante ao PubKey Script, pois também contém condições que devem ser satisfeitas antes que a saída possa ser gasta. Quando uma transação que tenta gastar o UTXO é iniciada posteriormente, a entrada deve conter o Script PubKey (que contém o hash do script de resgate) e o script de desbloqueio. Em transações P2SH, o script que contém as condições para gastar a saída, que é o script de resgate, não é apresentado no script de bloqueio. Em vez disso, apenas o hash (o hash do script de resgate) é incluído no script de bloqueio, o próprio script de resgate é apresentado como parte do script de desbloqueio quando a saída é gasta. Isso tem o efeito de, como Andresen observou no BIP 16, mover a responsabilidade pelo fornecimento das condições para resgatar uma transação do remetente dos fundos para o destinatário[2].

Um script complexo sem P2SH mostra o script sem o P2SH e um script complexo com P2SH mostra o mesmo script codificado com o P2SH[7].

Com P2SH o script complexo que detalha as condições para gastar a saída (script de resgate) não é apresentado no script de bloqueio. Em vez disso, apenas um hash dele está no script de bloqueio e o próprio script de resgate é apresentado posteriormente, como parte do script de desbloqueio quando a saída é gasta. Isso transfere o ônus das taxas e da complexidade do remetente para o destinatário (remetente) da transação.

O hash do script de resgate tem as mesmas propriedades que um hash de pubkey - portanto, ele pode ser transformado no formato de endereço padrão do Bitcoin com apenas uma pequena alteração para diferenciá-lo de um endereço padrão. Isso torna a coleta de um endereço no estilo P2SH são simples em termos de coletar um endereço no estilo P2PKH. O hash também ofusca quaisquer chaves públicas no script de resgate, portanto, os scripts P2SH são tão seguros quanto os hashes P2PKH, por exemplo.

Custos[editar | editar código-fonte]

O remetente pode financiar qualquer script de resgate arbitrário sem saber quais são as condições de gasto associadas ao script. Este é um resultado apropriado, porque o remetente da transação não se importa com o modo como os fundos enviados serão gastos no futuro. Este é um problema para o destinatário, que se preocupa com as condições para gastos adicionais.

A Taxa de transação é reduzida para o remetente dos fundos. As taxas de transação são diretamente proporcionais ao tamanho de uma transação, e um hash criptográfico de tamanho fixo permite que o remetente envie fundos para qualquer script de resgate arbitrário sem se preocupar em pagar taxas mais altas. É da responsabilidade do destinatário determinar o tamanho da transação de gastos e quanto ela custará, pois eles precisam incluir o script de resgate para gastar fundos. Em outras palavras, o ônus da construção do roteiro e da taxa de transação de um longo roteiro é transferido para o destinatário.

Multi-assinatura[editar | editar código-fonte]

Uma implementação comum da função P2SH é o script de endereço de assinatura múltipla. Esse script exige que uma transação possua mais de uma assinatura digital para comprovar a propriedade e, por extensão, gastar fundos.

Endereços[editar | editar código-fonte]

Outra parte importante do recurso P2SH é a capacidade de codificar um hash de script como um endereço, conforme definido no BIP-13.

Os endereços P2SH são codificações Base58Check do hash de 20 bytes de um script, assim como os endereços bitcoin são codificações Base58Check do hash de 20 bytes de uma chave pública. Os endereços P2SH usam o prefixo de versão "5", que resulta em endereços codificados em Base58Check que começam com "3"[1].

O prefixo 3 dá a eles uma sugestão de que esse é um tipo especial de endereço, um correspondendo a um script em vez de uma chave pública, mas, do contrário, funciona exatamente da mesma maneira que um pagamento para um endereço bitcoin.

Os endereços P2SH ocultam toda a complexidade, para que a pessoa que faz o pagamento não veja o script.

Vantagens[editar | editar código-fonte]

  • O recurso P2SH oferece os seguintes benefícios em comparação ao uso direto de scripts complexos em saídas de bloqueio:
  • Scripts complexos são substituídos por impressões digitais mais curtas na saída da transação, tornando a transação menor
  • Os scripts podem ser codificados como um endereço, portanto, o remetente e a carteira do remetente não precisam de engenharia complexa para implementar o P2SH.
  • O P2SH transfere o fardo da construção do script para o destinatário, não para o remetente.
  • P2SH desloca a carga no armazenamento de dados para o script longo da saída (que além de ser armazenada no blockchain está no conjunto UTXO) para a entrada (armazenada apenas no blockchain)
  • O P2SH transfere a carga no armazenamento de dados para o script longo do tempo presente (pagamento) para um tempo futuro (quando é gasto).
  • O P2SH transfere o custo da taxa de transação de um script longo do remetente para o destinatário, que deve incluir o script de resgate longo para gastá-lo.

História[editar | editar código-fonte]

A primeira janela de ativação falhou e outra foi configurada para estar ativa em 1 de abril de 2012, na v0.6.0rc2[8]. Usuários executando v0.6.0rc1 que não atualizaram para o atraso, ativaram cedo e ficaram presos no bloco 170.060 quando uma transação inválida de acordo com seus nós foi extraída. Técnicas posteriores de ativação de garfo mole, como BIP 34 e BIP 9, refletem sobre o histórico de blocos para determinar a ativação (também da sinalização do minerador), a fim de evitar esse problema.

Depois disso, os problemas de ativação foram causados ​​pelos 45% restantes de mineradores que produziram blocos inválidos por vários meses[9]. Mais tarde, técnicas de ativação de garfo mole elevaram o limiar de aplicação de sinalização de 55% para 95%, a fim de atenuar esse problema.

Gavin Andresen[editar | editar código-fonte]

Gavin Andresen é um desenvolvedor de software muito conhecido por seu envolvimento com o bitcoin[10]. Foi declarado por Satoshi Nakamoto como o desenvolvedor líder da implementação de referência para software cliente bitcoin depois que Satoshi Nakamoto anunciou sua saída. Em 2012, fundou a Bitcoin Foundation para apoiar e fomentar o desenvolvimento da moeda bitcoin e, em 2014, deixou seu papel de desenvolvedor de software para se concentrar em seu trabalho com a Fundação.

Referências[editar | editar código-fonte]

  1. a b c d e f g h i Mastering Bitcoin 2nd Edition: Programming the Open Blockchain - bitcoinbook/bitcoinbook, Mastering Bitcoin, 9 de dezembro de 2018, consultado em 9 de dezembro de 2018 
  2. a b Asolo, Bisade (18 de agosto de 2018). «P2SH (Pay To Script Hash) Explained». Mycryptopedia (em inglês). Consultado em 9 de dezembro de 2018 
  3. a b «Bitcoin Transactions – Pay-to-Script-Hash?». CryptoCompare. Consultado em 9 de dezembro de 2018 
  4. «Pay to script hash - Bitcoin Wiki». en.bitcoin.it. Consultado em 9 de dezembro de 2018 
  5. «Transações · Bitcoin para Programadores». btcparaprogramadores.marcoagner.org. Consultado em 10 de dezembro de 2018 
  6. «Part 1: Transaction Basics». CryptoTokens (em inglês). 24 de maio de 2017. Consultado em 10 de dezembro de 2018 
  7. Asolo, Bisade (18 de agosto de 2018). «P2SH (Pay To Script Hash) Explained». Mycryptopedia (em inglês). Consultado em 10 de dezembro de 2018 
  8. «Move BIP16 switchover time to April 1 · bitcoin/bitcoin@46aa2a6». GitHub (em inglês). Consultado em 9 de dezembro de 2018 
  9. «A complete history of Bitcoin's consensus forks – BitMEX Blog» (em inglês). Consultado em 9 de dezembro de 2018 
  10. Simonite, Tom. «Meet Gavin Andresen, the most powerful person in the world of Bitcoin». MIT Technology Review (em inglês). Consultado em 10 de dezembro de 2018