Uma introdução ao Script Bitcoin

Bitcoin é uma criptomoeda revolucionária que tem a capacidade de transformar a maneira como realizamos transações financeiras. Uma das características mais interessantes do Bitcoin é a sua natureza programável. Isso significa que os usuários têm uma grande flexibilidade ao definir as condições de como os fundos podem ser gastos.Ao discutir o Bitcoin, é comum mencionar as carteiras e as moedas. No entanto, podemos também pensar nas carteiras como chaves e nas moedas como cheques. A blockchain, por sua vez, pode ser comparada a uma série de cofres trancados. Cada cofre possui uma pequena fenda, permitindo que qualquer pessoa deposite cheques ou verifique o valor armazenado dentro. No entanto, somente o detentor da chave poderá acessar o interior do cofre.

Neste artigo, vamos nos aprofundar na linguagem de programação do Bitcoin chamada Script. O Script é interpretado pelos nós da rede Bitcoin e é responsável pelo mecanismo de bloqueio/desbloqueio mencionado anteriormente.

Como funciona o Bitcoin?

Para entender o funcionamento do Bitcoin, podemos usar a analogia dos cofres e das chaves. Cada transação possui uma chave (scriptSig) e uma fechadura (scriptPubKey). Você usa a sua chave para abrir o cofre que contém o cheque que deseja enviar e, em seguida, adiciona um novo cheque a um novo cofre com uma fechadura diferente. Para gastar do novo cofre, você precisa de outra chave.

Simples, não é mesmo? No entanto, também é possível ter variações nos tipos de fechaduras do sistema. Alguns cofres podem exigir múltiplas chaves, enquanto outros podem exigir a comprovação de um segredo. Existem diversas condições que podem ser definidas.

A nossa chave é o que chamamos de scriptSig. A fechadura é o scriptPubKey. Se olharmos mais de perto esses componentes, veremos que eles são compostos por dados e blocos de código. Quando combinados, eles criam um pequeno programa.

Quando você realiza uma transação, está transmitindo essa combinação para a rede. Cada nó que recebe essa transação verifica o programa, que informa se a transação é válida. Caso contrário, ela será descartada e você não poderá gastar os fundos bloqueados.

As moedas que você possui são chamadas de UTXOs (unspent transaction outputs), ou seja, saídas de transações não gastas. Esses fundos podem ser utilizados por qualquer pessoa que possua a chave que se encaixa na fechadura. Mais especificamente, a chave é a scriptSig e a fechadura é a scriptPubKey.

Se os UTXOs estiverem em sua carteira, provavelmente eles terão uma condição que diz que apenas a pessoa que puder comprovar a propriedade dessa chave pública poderá desbloquear esses fundos. Para desbloqueá-los, você precisa fornecer uma scriptSig que inclua uma assinatura digital usando a chave privada que corresponde à chave pública especificada na scriptPubKey. Tudo isso ficará mais claro em breve.

Compreendendo a pilha do Bitcoin

O Script é conhecido como uma linguagem baseada em pilha. Isso significa que, ao ler um conjunto de instruções, as colocamos em uma coluna vertical, como se fosse uma pilha. A lista A, B, C, por exemplo, resultaria em uma pilha com A na parte inferior e C na parte superior. Quando as instruções nos dizem para fazer algo, operamos em um ou mais elementos começando pelo topo da pilha.

Os elementos A, B e C sendo adicionados e "eliminados" da pilha.

Os elementos A, B e C sendo adicionados e “eliminados” da pilha.

Podemos distinguir entre os dados (como assinaturas, hashes e chaves públicas) e as instruções (ou opcodes). As instruções removem dados e fazem algo com eles. Aqui está um exemplo muito simples de como um script poderia ser:

<xyz>

<md5 hasher>

<d16fb36f0911f878998c136191af705e>

<check if equal>

Em vermelho, temos os dados, e em azul, temos os opcodes. Lemos da esquerda para a direita, então primeiro colocamos a string <xyz> na pilha. Em seguida, vem o opcode <md5 hasher>. Esse opcode não existe no Bitcoin, mas vamos supor que ele remova o elemento do topo da pilha (<xyz>) e faça um hash usando o algoritmo MD5. Em seguida, a saída é adicionada de volta à pilha. A saída aqui é d16fb36f0911f878998c136191af705e.

Que coincidência! Nosso próximo elemento a adicionar é <d16fb36f0911f878998c136191af705e>, então agora nossa pilha tem dois elementos idênticos. Por fim, <check if equal> remove dois elementos do topo e verifica se são iguais. Se forem, adiciona <1> à pilha. Caso contrário, adiciona <0>.

Chegamos ao final da nossa lista de instruções. Nosso script poderia ter falhado de duas maneiras: se o elemento restante fosse zero ou se um dos operadores causasse uma falha quando algumas condições não fossem atendidas. Não tínhamos nenhum operador desse tipo nesse exemplo e acabamos com um elemento não nulo (<1>), então nosso script era válido. Essas regras também se aplicam a transações reais do Bitcoin.

Isso foi apenas um programa fictício. Vamos ver alguns exemplos reais agora.

Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) é incrivelmente simples. Ele envolve bloquear fundos em uma chave pública específica. Se você deseja receber fundos dessa maneira, basta fornecer ao remetente a sua chave pública, em vez de um endereço Bitcoin.

A primeira transação entre Satoshi Nakamoto e Hal Finney em 2009 foi uma transação P2PK. A estrutura foi amplamente utilizada nos primeiros dias do Bitcoin, mas hoje em dia o Pay-to-Pubkey-Hash (P2PKH) substituiu em grande parte o P2PK.

O scriptPubKey para uma transação P2PK segue o formato <chave pública> OP_CHECKSIG>. Simples assim. Você pode ter adivinhado que o OP_CHECKSIG verifica uma assinatura em relação à chave pública fornecida. Portanto, nossa scriptSig será uma simples <assinatura>. Lembre-se, a scriptSig é a chave para a fechadura.

Uma introdução ao Script Bitcoin

Não fica muito mais simples do que isso. Uma assinatura é adicionada à pilha, seguida por uma chave pública. O OP_CHECKSIG os retira e verifica a assinatura em relação à chave pública. Se corresponderem, adiciona um <1> à pilha. Caso contrário, adiciona um <0>.

Por razões que explicaremos na próxima seção, o P2PK não é mais usado na prática.

Pay-to-Pubkey-Hash (P2PKH)

O Pay-to-Pubkey-Hash (P2PKH) é atualmente o tipo de transação mais comum. A menos que você esteja usando um software antigo, sua carteira provavelmente faz esse tipo de transação por padrão.

O scriptPubKey em um P2PKH é o seguinte:

OP_DUP OP_HASH160 <hash da chave pública> OP_EQUALVERIFY OP_CHECKSIG

Antes de apresentarmos o scriptSig, vamos descrever o que os novos opcodes fazem:

OP_DUP

O OP_DUP retira o primeiro elemento e o duplica. Em seguida, ele adiciona ambos de volta à pilha. Geralmente, isso é feito para que possamos realizar uma operação na cópia sem afetar o original.

OP_HASH160

Este opcode retira o primeiro elemento e o faz passar por dois processos de hash. A primeira etapa usa o algoritmo SHA-256 para fazer o hash. O resultado do SHA-256 é então utilizado como entrada para o algoritmo RIPEMD-160. O resultado final é adicionado de volta à pilha.

OP_EQUALVERIFY

OP_EQUALVERIFY combina dois outros operadores – OP_EQUAL e OP_VERIFY. OP_EQUAL retira dois elementos e verifica se são idênticos. Se forem, adiciona um <1> à pilha. Caso contrário, adiciona um <0>. OP_VERIFY retira o elemento do topo e verifica se ele é verdadeiro (ou seja, diferente de zero). Se não for, a transação falha. Em conjunto, OP_EQUALVERIFY faz com que a transação falhe se os dois elementos do topo não corresponderem.

Desta vez, a scriptSig se parece com isso: <assinatura> <chave pública>

Você precisa fornecer uma assinatura e a chave pública correspondente para desbloquear as saídas P2PKH.

Uma introdução ao Script Bitcoin

Você pode ver o que está acontecendo no GIF acima. Não é muito diferente de um script P2PK. Estamos apenas adicionando uma etapa extra para verificar se a chave pública corresponde ao hash no script.

No entanto, há algo a ser observado. Em um script de bloqueio P2PKH, a chave pública não é visível – só podemos ver o seu hash. Se consultarmos um explorador de blockchain e verificarmos uma saída P2PKH que não foi gasta, não poderemos determinar a chave pública. Ela só será revelada quando o destinatário decidir transferir os fundos.

Isso tem algumas vantagens. A primeira é que o hash da chave pública é mais fácil de ser compartilhado do que a própria chave pública. Satoshi introduziu essa mudança em 2009 por esse motivo. O hash da chave pública é o que conhecemos como endereço Bitcoin hoje em dia.

A segunda vantagem é que os hashes das chaves públicas podem fornecer uma camada adicional de segurança contra computação quântica. Como a chave pública não é conhecida até que gastemos os fundos, é ainda mais difícil para outras pessoas calcular a chave privada. Elas teriam que reverter as duas etapas de hash (RIPEMD-160 e SHA-256) para obtê-la.

Pay-to-Script-Hash (P2SH)

O Pay-to-Script-Hash (P2SH) foi um desenvolvimento muito interessante para o Bitcoin. Ele permite que o remetente bloqueie fundos no hash de um script – eles não precisam saber o que o script realmente faz. Considere o seguinte hash SHA-256:

e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

Você não precisa saber o input desse hash para bloquear fundos nele. No entanto, quem gasta os fundos precisa fornecer o script usado para gerar o hash e satisfazer as condições desse script.

O hash acima foi gerado a partir do seguinte script: <multiplicar por 2> <4> <verificar se é igual>

Se você quiser gastar as moedas vinculadas a esse scriptPubKey, precisará fornecer não apenas esses comandos, mas também uma scriptSig que faça com que o script completo seja avaliado como verdadeiro. Neste exemplo, o elemento necessário é um <multiplicar por 2> para que o resultado seja <4>. Portanto, nossa scriptSig é apenas <2>.

Na prática, o scriptPubKey para uma saída P2SH é: OP_HASH160 <hash do redeemScript> OP_EQUAL

Não há novos operadores aqui, mas temos um novo elemento, <hash do redeemScript>. Como o nome sugere, é um hash do script que precisamos fornecer para resgatar os fundos (chamado de redeemScript). A scriptSig mudará dependendo do que estiver no redeemScript. Em geral, você encontrará alguma combinação de assinaturas e chaves públicas, seguidas pelo (obrigatório) redeemScript: <assinatura> <chave pública> <redeemScript>

Nossa avaliação difere um pouco da execução em pilha que vimos até agora. Ela ocorre em duas partes. A primeira verifica se você forneceu o hash correto.

Uma introdução ao Script Bitcoin

Observe que não fazemos nada com os elementos anteriores ao redeemScript. Eles não são usados nesse ponto. Chegamos ao final deste mini-programa e o elemento do topo é diferente de zero. Isso significa que é válido.

No entanto, ainda não terminamos. Os nós da rede reconhecem essa estrutura como P2SH, então eles têm os elementos da scriptSig esperando em outra pilha. É aí que a assinatura e a chave pública serão usadas.

Até agora, tratamos o redeemScript como um elemento. Mas agora ele será interpretado como instruções, que podem ser qualquer coisa. Vamos pegar o exemplo de um script de bloqueio P2PKH, para o qual devemos fornecer a <assinatura> e a <chave pública> que correspondem a um <hash da chave pública> dentro do <redeemScript>.

Uma introdução ao Script Bitcoin

Depois que o redeemScript é expandido, temos uma situação que se parece exatamente com uma transação P2PKH regular. A partir daí, você a executa como faria com uma transação normal.

Demonstramos aqui um script P2SH(P2PKH), mas é improvável que você encontre um desses na prática. Nada impede que você crie um, mas isso não oferece benefícios adicionais e acaba ocupando mais espaço em um bloco (e, portanto, custando mais).

O P2SH geralmente é útil para transações como multisig ou transações compatíveis com SegWit. Transações multisig podem ser muito grandes, pois podem exigir várias chaves. Antes da implementação do Pay-to-Script-Hash, o remetente teria que listar todas as chaves públicas possíveis em seu script de bloqueio.

Mas com o P2SH, não importa o quão complexas sejam as condições de gasto. O hash do redeemScript tem sempre um tamanho fixo. Os custos são repassados para o(s) usuário(s) que desejam desbloquear o script de bloqueio.

Transações SegWit (P2WPKH e P2WSH)

Para entender o formato da transação no SegWit, basta saber que não temos mais apenas uma scriptSig e uma scriptPubKey. Agora, também temos um novo campo chamado testemunha (witness). Os dados que costumávamos armazenar na scriptSig são movidos para a testemunha, e a scriptSig fica vazia.

Se você já se deparou com endereços que começam com ‘bc1’, esses são o que chamamos de nativos do SegWit (em oposição aos compatíveis com SegWit, que começam com ‘3’ porque são endereços P2SH).

Pay-to-Witness-Pubkey-Hash (P2WPKH)

Pay-to-Witness-Pubkey-Hash (P2WPKH) é a versão SegWit do P2PKH. Nossa testemunha se parece com isso: <assinatura> <chave pública>

Você notará que isso é o mesmo que a scriptSig de P2PKH. Aqui, a scriptSig está vazia. Enquanto isso, a scriptPubKey se parece com isso: <OP_0> <hash da chave pública>

Isso parece um pouco estranho, não é? Onde estão os opcodes que nos permitem comparar a assinatura, a chave pública e o hash da chave pública?

Não estamos mostrando operadores adicionais aqui, porque os nós que recebem a transação sabem o que fazer com base no comprimento do <hash da chave pública>. Eles calcularão o comprimento e entenderão que ele deve ser executado da mesma maneira que uma transação P2PKH convencional.

Os nós não atualizados não sabem como interpretar a transação dessa maneira, mas não importa. De acordo com as regras antigas, não há testemunha, então eles leem uma scriptSig vazia e alguns dados. Eles avaliam isso e marcam como válido – para eles, qualquer pessoa poderia gastar a saída. É por isso que o SegWit é considerado uma soft fork retrocompatível.

Pay-to-Witness-Script-Hash (P2WSH)

Pay-to-Witness-Script-Hash (P2WSH) é o novo P2SH. Se você chegou até aqui, provavelmente consegue imaginar como isso será, mas vamos explicar mesmo assim. Nossa testemunha é o que normalmente colocaríamos na scriptSig. Em uma P2WSH que envolve uma transação P2PKH, por exemplo, ela pode se parecer com isso: <assinatura 1> <chave pública>

Aqui está nossa scriptPubKey: <OP_0> <hash do script>

As mesmas regras se aplicam. Os nós SegWit leem o comprimento do hash do script e determinam que é uma saída P2WSH, que é avaliada de maneira semelhante a P2SH. Enquanto isso, os nós antigos apenas veem como uma saída onde qualquer pessoa pode gastar.

Considerações finais

Neste artigo, aprendemos um pouco sobre os fundamentos do Bitcoin. Vamos resumir rapidamente:

  • Tipo de ScriptDescrição
  • Pay-to-Pubkey (P2PK)
  • Bloqueia fundos em uma chave pública específica
  • Pay-to-Pubkey-Hash (P2PKH)
  • Bloqueia fundos em um hash de chave pública específico (ou seja, um endereço)
  • Pay-to-Script-Hash (P2SH)
  • Bloqueia fundos no hash de um script que o destinatário pode fornecer
  • Pay-to-Witness-Pubkey-Hash (P2WPKH)
  • A versão do SegWit do P2PK
  • Pay-to-Witness-Script-Hash (P2WSH)
  • A versão do SegWit do P2SH

Ao aprofundar nosso conhecimento sobre o Bitcoin, começamos a entender por que ele tem tanto potencial. As transações podem ser compostas por muitos componentes diferentes. Ao manipular esses blocos de construção, os usuários têm uma grande flexibilidade ao definir as condições de como e quando os fundos podem ser gastos.

Uma introdução ao Script Bitcoin
Uma introdução ao Script Bitcoin
Uma introdução ao Script Bitcoin
Registro Rápido

Plataforma única para seus traders. A estrutura é clara e transparente.

89%
Pontuação de Confiança

icon Teste Agora! icon Teste Agora!
Pontuação de Confiança

FBS

Exnova

PocketOption

Expertoption

Quotex

XM

Exnova