-

@ Anjhc
2025-03-12 18:18:57
# 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 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
```
Exemplo: `76a9144ab4ee161c7a0d8d768439ab1a7647d37f2ffe3988ac`
### 2. P2SH (Pay to Script Hash) - BIP16, 2012
Formato do ScriptPubKey:
```
OP_HASH160 <scriptHash> 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 `<sig> <pubKey>`
- Sem campo witness
2. **P2SH**:
- ScriptSig contém `<redeem script> ... <arg1> <arg2>`
- Sem campo witness
3. **P2WPKH**:
- ScriptSig vazio
- Witness contém `<sig> <pubKey>`
- Usa marker (00) e flag (01)
4. **P2WSH**:
- ScriptSig vazio
- Witness contém `<arg1> <arg2> ... <witnessScript>`
- Usa marker (00) e flag (01)
5. **P2TR (Taproot)**:
- ScriptSig vazio
- Para gasto via chave: witness contém `<schnorr_signature>`
- Para gasto via script: witness contém `<controlBlock> <script> <input1> ... <inputN>`
- Usa marker (00) e flag (01)
## Exemplo de Transação P2WSH
```
Version: 01000000
Marker: 00
Flag: 01
Input Count: 01
Input:
- Txid: 36d0db3a3c4193981b8575e8d457942c8b44974a3e7b89ab73683c2f2293d931
- Vout: 01000000
- ScriptSig length: 00
- ScriptSig: (vazio)
- Sequence: ffffffff
Output Count: 01
Output:
- Value: 00e1f50500000000 (1 BTC)
- ScriptPubKey length: 22 (34 bytes)
- ScriptPubKey: 0020a7a9f41e9e1281dd2f366c5251f760b50c88e30d55afa812846a0bec1a25478c
Witness:
- Item count: 03
- Item 1 length: 47 (assinatura 1)
- Item 1: 3044022071c2b42eee10a7bf1f9d9734c51172bc37aeb23f836de2470278b595afc29e1602200dcdbf8d31d5cdbcf0da2634c8793594ddd18ab3db4737135ee3c58aafb0d82101
- Item 2 length: 47 (assinatura 2)
- Item 2: 304402202d4ade342a961ea429bdc3b88fb7affa38b15c2bd6b4b08e8660f8b990d7a0c30220289e0c391130f8b12ed744b6c0a3ace52da7af49e95fbc5f1ed9bcd8ffc6175f01
- Item 3 length: 69 (witnessScript)
- Item 3: 522102f82d2fb56b1a2f69d8ad3d0f1bc692227e06cddb3add3214dcb738b4c8edfc1b21037e4e5ce7b760ffa98cd65577fcc755a9aa22860d11a69bc6bbf0ba33d9fec3452ae (script 2-de-2 multisig)
Locktime: 00000000
```
## Exemplo de Transação P2TR (Taproot)
```
Version: 01000000
Marker: 00
Flag: 01
Input Count: 01
Input:
- Txid: f34b1d2914b73fed3b8a8087056a7c96c95294f896ea0643a1994e378637d764
- Vout: 00000000
- ScriptSig length: 00
- ScriptSig: (vazio)
- Sequence: ffffffff
Output Count: 01
Output:
- Value: 0010a5d4e8000000 (2.5 BTC)
- ScriptPubKey length: 22 (34 bytes)
- ScriptPubKey: 5120a37c3903c8d0db6512e2b40b0dfbfc9213f4b673aeb58d1679364295b2c4e28
Witness:
- Item count: 01
- Item 1 length: 41 (65 bytes - assinatura Schnorr)
- Item 1: 4140a23c2ffc4bc73ba0b92174b59eba9129319ed4beb66a843f81f9a88310e9eef973fc6ce7c45cd08551102639313d01bbbb92e6e1bfc6d060b9c622cad97e9de
Locktime: 00000000
```
Para automatizar o processo de construção de transações para todos os tipos de endereços, é essencial identificar o tipo de endereço/script para cada input e output, e aplicar a estrutura correspondente conforme detalhado acima.