Alguém aí conhece alguma documentação sobre como as transações Bitcoin são montadas de acordo com cada tipo(P2SH, P2PKH, P2SH, P2PKH..)?

Tô melhorando uma biblioteca em typescript para lidar automaticamente com isso e puta merda, não tem documentação boa, tudo é na base de ficar testando e errando até acertar, que desgraça.

E não, não quero utilizar uma biblioteca já existente, o meu problema é que todas as Lins typescript ou javascript utilizam módulos nativos nodejs que não existem em frameworks como React Native, e fazer pollyfill não funciona e nem é correto para módulos de criptografia, então tô implementando uma do zero sem dependências problemáticas pra rodar em qualquer tipo de projeto. Mas tá osso, todas as documentações que encontro não descrevem com detalhes o processo de montagem e assinatura de transações, daí tem que ficar testando até acertar, na moral, alguém me indica uma documentação boa ou me dá um tiro.

Assim que finalizar vou escrever uma documentação com todos os detalhes, para que outros não sofram tanto, não desejo nem pro meu pior inimigo isso aqui kkk

Reply to this note

Please Login to reply.

Discussion

AI não está ajudando?

Tentei utilizar o chatgpt, mas é uma completa desgraça. Você pede simplesmente pra ele explicar como montar uma transação manualmente, com todos os detalhes. Daí ele da um passo a passo faltando um monte de etapa como adicionar a versão, coloca o loctime no início da transação etc. Daí ele explica como assinar a transações apenas fazendo um hash do input fazendo Index+scriptSig+sequence e pronto, faz o hash256 disso e assina, oque é completamente errado. Daí falo que tá errado e ele repete a mesma coisa falando que corrigiu esses detalhes na explicação dele, quando não repete a mesma coisa ele simplesmente esquece de adicionar version ou os dados de segwit flag etc..

E isso aí só estou falando da explicação, não é nem do código, porque não pedi pra ele gerar o código. Então pedi pra ele gerar o código pra ver se era diferente da explicação, ou correto. E é uma merda maior ainda.

É uma completa desgraça, só atrapalha tudo kkk

Então quero nem saber de IA pra isso, me stressou usar essa desgraça hoje cedo kkk

IA mal serve para completar textos quando estiver fazendo coisas corriqueiras.

Na maioria dos casos só atrapalha, nada supera o bom e velho modo de aprender, isso é, olhando o código dos outros e lendo livros.

É isso mesmo, só serve pra fazer coisas de tutorial de curso no máximo. Qualquer coisa mais complexa vira uma desgraça que só atrapalha.

Mesmo utilizar sem gerar código só explicar as coisas como o resumo de uma documentação ainda é uma desgraça que inventa coisas, um trilhão de vezes melhor buscar a documentação oficial das coisas.

Agora pra coisas extremamente triviais e muito difundidas como "como operação bitwise funciona?", ou "gere um código de exemplo para inverter uma strind em C", pra isso é útil, e olhe lá.

Me passa os prompts que estou com acesso a um claude pago aqui

Tá, última tentativa com ia e volto para documentações e tentativa e erro.

Pra ver se esse cloude pode ser melhor, coloque o promp abaixo e me responda com a resposta, se for uma resposta coerente aí te chamo no chat pra passar os detalhes.:

"Gere uma explicação detalhada de como montar transações Bitcoin manualmente. Considere que estou montando manualmente a cadeia de bytes que resultará em uma transação válida. Tenho os utxos de entrada, endereços de saída e demais dados para a transação. Detalhe também a diferença entre os tipos de transação em ordem cronológica P2WPKH, P2WSH, P2WPKH, P2WSH e demais tipo. Estou montando uma transação e a partir das sua explicação deve ser possível lidar com todos os tipos de transação descritos de forma automática.

A sua explicação deve conter exemplo práticos com valores fictícios por exemplo:

Version 01000000 +

Inputs count 02+

Txid 1 - 89ff7baf02...

Seguindo até a transação montada por completo inclusive para o processo de assinatura."

# Construção Manual de Transações Bitcoin

Vou explicar detalhadamente como montar transações Bitcoin manualmente, abordando diferentes tipos de transações e fornecendo exemplos com valores hexadecimais.

## Estrutura Básica de uma Transação

Uma transação Bitcoin é composta por:

1. **Version** (4 bytes)

2. **Marker & Flag** (opcional, apenas para transações SegWit)

3. **Input Count** (1-9 bytes, VarInt)

4. **Inputs** (estrutura variável)

5. **Output Count** (1-9 bytes, VarInt)

6. **Outputs** (estrutura variável)

7. **Witnesses** (opcional, apenas para transações SegWit)

8. **Locktime** (4 bytes)

## Exemplo de Transação Legada (P2PKH)

Vamos construir uma transação passo a passo:

```

Version: 01000000 (versão 1)

Input Count: 01 (1 input)

Input:

- Txid: 7967a5185e907a25225574544c31f7b059c1a191d65b53dcc1554d339c4f9efc

- Vout: 01000000 (índice 1)

- ScriptSig length: 6a (106 bytes)

- ScriptSig: 47304402206a2eb16b7b92051d0fa38c133e67684ed064effada1d7f925c842da401d4f22702201f196b10e6e4b4a9fff948e5c5d71ec5da53e90529c8dbd122bff2b1d21dc8a90121039b7bcd0824b9a9164f7ba098408e63e5b7e3cf90835cceb19868f54f8961a825

- Sequence: ffffffff (finalized)

Output Count: 01 (1 output)

Output:

- Value: 00e1f50500000000 (1 BTC = 100,000,000 satoshis)

- ScriptPubKey length: 19 (25 bytes)

- ScriptPubKey: 76a9144ab4ee161c7a0d8d768439ab1a7647d37f2ffe3988ac (P2PKH para endereço 1BCyxfGTrkkqmHGg63z7kXvt2TCr4m8AoP)

Locktime: 00000000 (sem locktime)

```

## Evolução dos Tipos de Transação Bitcoin

### 1. P2PKH (Pay to Public Key Hash) - Original

Formato do ScriptPubKey:

```

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

```

Exemplo: `76a9144ab4ee161c7a0d8d768439ab1a7647d37f2ffe3988ac`

### 2. P2SH (Pay to Script Hash) - BIP16, 2012

Formato do ScriptPubKey:

```

OP_HASH160 OP_EQUAL

```

Exemplo: `a914f4c03f9e0a7667acbf893bcc99e9c5a3e6f7f6d087`

### 3. P2WPKH (Pay to Witness Public Key Hash) - BIP141, 2017

Formato do ScriptPubKey:

```

OP_0 <20-byte-key-hash>

```

Exemplo: `0014751e76e8199196d454941c45d1b3a323f1433bd6`

### 4. P2WSH (Pay to Witness Script Hash) - BIP141, 2017

Formato do ScriptPubKey:

```

OP_0 <32-byte-script-hash>

```

Exemplo: `00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262`

### 5. P2TR (Pay to Taproot) - BIP341, 2021

Formato do ScriptPubKey:

```

OP_1 <32-byte-schnorr-pubkey>

```

Exemplo: `5120a37c3903c8d0db6512e2b40b0dfbfc9213f4b673aeb58d1679364295b2c4e28`

## Montando uma Transação P2WPKH

Vamos construir uma transação SegWit P2WPKH passo a passo:

```

Version: 01000000 (versão 1)

Marker: 00 (indica transação SegWit)

Flag: 01 (obrigatório com o marker)

Input Count: 01 (1 input)

Input:

- Txid: 2d4a13bdfedcda173c35e61586ea21030bd1da2b010f00163c9417ee7384abd4

- Vout: 01000000 (índice 1)

- ScriptSig length: 00 (vazio para SegWit)

- ScriptSig: (vazio)

- Sequence: ffffffff

Output Count: 02 (2 outputs)

Output 1:

- Value: 00ca9a3b00000000 (10 BTC)

- ScriptPubKey length: 16 (22 bytes)

- ScriptPubKey: 0014d85c2b71d0060b09c9886aeb815e50991dda124d (P2WPKH)

Output 2:

- Value: 009435770000000 (1.5 BTC - troco)

- ScriptPubKey length: 16 (22 bytes)

- ScriptPubKey: 00146a59ac0e8f553f292dfe5e9f3aaa1da93499c15e (P2WPKH - endereço de troco)

Witness count: 01 (para 1 input)

Witness items for input 0:

- Item count: 02 (assinatura + chave pública)

- Item 1 length: 47 (71 bytes)

- Item 1: 3044022074ef696e55a0cc2f4d80fe833095b2a59c5bb9417ee5a3ba905994d228e6f33c02204ab291e35f37d3ed5ddf024170615f1e1d8d6118e3d6c5ecce33b01d72316fb901 (assinatura)

- Item 2 length: 21 (33 bytes)

- Item 2: 0283ef77a9821f95f8fd1b93bed127b398989ee19bd598d77859a5962e4fa0f047 (chave pública)

Locktime: 00000000 (sem locktime)

```

## Processo de Assinatura

O processo de assinatura varia conforme o tipo de transação. Vamos explicar para o P2WPKH:

1. **Criar o preimage da transação**:

- Version: 01000000

- Hash de outputs anteriores: d4ab8473ee17943c16000f012bdad10b0321ea8615e6353c17dadcfedd3ba1d4

- Hash de sequências anteriores: ffffffff

- Txid do input: 2d4a13bdfedcda173c35e61586ea21030bd1da2b010f00163c9417ee7384abd4

- Vout: 01000000

- Script do output sendo gasto: 1976a914d85c2b71d0060b09c9886aeb815e50991dda124d88ac

- Valor do input: e8030000000000000 (1000 satoshis)

- Sequence: ffffffff

- Hash de outputs: (hash de todos os outputs)

- Locktime: 00000000

- SigHash: 01000000 (SIGHASH_ALL)

2. **Calcular o hash SHA256 duplo do preimage**

3. **Assinar o hash com a chave privada**

4. **Construir a testemunha (witness) com a assinatura e a chave pública**

## Diferenças na Construção de Diferentes Tipos de Transação

1. **P2PKH**:

- ScriptSig contém ` `

- Sem campo witness

2. **P2SH**:

- ScriptSig contém ` ... `

- Sem campo witness

3. **P2WPKH**:

- ScriptSig vazio

- Witness contém ` `

- Usa marker (00) e flag (01)

4. **P2WSH**:

- ScriptSig vazio

- Witness contém ` ... `

- Usa marker (00) e flag (01)

5. **P2TR (Taproot)**:

- ScriptSig vazio

- Para gasto via chave: witness contém ``

- Para gasto via script: witness contém `