Anjhc on Nostr: # Construção Manual de Transações Bitcoin Vou explicar detalhadamente como montar ...
# 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.
Published at
2025-03-12 18:18:57Event JSON
{
"id": "6a521e6cc642a7282193b387d5fa5b4baeddedae59f41fbb86eae5e66bd4a4cb",
"pubkey": "4abc8f17e30e49e8b960ea8211cfcc6448cc908b741e7f9819f066f272470848",
"created_at": 1741803537,
"kind": 1,
"tags": [
[
"e",
"5649bb2ee44ed222b97ce0967325a97827e7e1f99253dfcd7c49434e00576359",
"",
"root"
],
[
"e",
"dfe16d20cede36935bacef7865fc2d8097b8f750b33306c221db2801bf1bfd74",
"wss://nos.lol/",
"reply",
"55472e9c01f37a35f6032b9b78dade386e6e4c57d80fd1d0646abb39280e5e27"
],
[
"p",
"55472e9c01f37a35f6032b9b78dade386e6e4c57d80fd1d0646abb39280e5e27"
],
[
"p",
"4abc8f17e30e49e8b960ea8211cfcc6448cc908b741e7f9819f066f272470848"
]
],
"content": "# Construção Manual de Transações Bitcoin\n\nVou explicar detalhadamente como montar transações Bitcoin manualmente, abordando diferentes tipos de transações e fornecendo exemplos com valores hexadecimais.\n\n## Estrutura Básica de uma Transação\n\nUma transação Bitcoin é composta por:\n\n1. **Version** (4 bytes)\n2. **Marker \u0026 Flag** (opcional, apenas para transações SegWit)\n3. **Input Count** (1-9 bytes, VarInt)\n4. **Inputs** (estrutura variável)\n5. **Output Count** (1-9 bytes, VarInt)\n6. **Outputs** (estrutura variável)\n7. **Witnesses** (opcional, apenas para transações SegWit)\n8. **Locktime** (4 bytes)\n\n## Exemplo de Transação Legada (P2PKH)\n\nVamos construir uma transação passo a passo:\n\n```\nVersion: 01000000 (versão 1)\nInput Count: 01 (1 input)\nInput:\n - Txid: 7967a5185e907a25225574544c31f7b059c1a191d65b53dcc1554d339c4f9efc\n - Vout: 01000000 (índice 1)\n - ScriptSig length: 6a (106 bytes)\n - ScriptSig: 47304402206a2eb16b7b92051d0fa38c133e67684ed064effada1d7f925c842da401d4f22702201f196b10e6e4b4a9fff948e5c5d71ec5da53e90529c8dbd122bff2b1d21dc8a90121039b7bcd0824b9a9164f7ba098408e63e5b7e3cf90835cceb19868f54f8961a825\n - Sequence: ffffffff (finalized)\nOutput Count: 01 (1 output)\nOutput:\n - Value: 00e1f50500000000 (1 BTC = 100,000,000 satoshis)\n - ScriptPubKey length: 19 (25 bytes)\n - ScriptPubKey: 76a9144ab4ee161c7a0d8d768439ab1a7647d37f2ffe3988ac (P2PKH para endereço 1BCyxfGTrkkqmHGg63z7kXvt2TCr4m8AoP)\nLocktime: 00000000 (sem locktime)\n```\n\n## Evolução dos Tipos de Transação Bitcoin\n\n### 1. P2PKH (Pay to Public Key Hash) - Original\n\nFormato do ScriptPubKey:\n```\nOP_DUP OP_HASH160 \u003cpubKeyHash\u003e OP_EQUALVERIFY OP_CHECKSIG\n```\n\nExemplo: `76a9144ab4ee161c7a0d8d768439ab1a7647d37f2ffe3988ac`\n\n### 2. P2SH (Pay to Script Hash) - BIP16, 2012\n\nFormato do ScriptPubKey:\n```\nOP_HASH160 \u003cscriptHash\u003e OP_EQUAL\n```\n\nExemplo: `a914f4c03f9e0a7667acbf893bcc99e9c5a3e6f7f6d087`\n\n### 3. P2WPKH (Pay to Witness Public Key Hash) - BIP141, 2017\n\nFormato do ScriptPubKey:\n```\nOP_0 \u003c20-byte-key-hash\u003e\n```\n\nExemplo: `0014751e76e8199196d454941c45d1b3a323f1433bd6`\n\n### 4. P2WSH (Pay to Witness Script Hash) - BIP141, 2017\n\nFormato do ScriptPubKey:\n```\nOP_0 \u003c32-byte-script-hash\u003e\n```\n\nExemplo: `00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262`\n\n### 5. P2TR (Pay to Taproot) - BIP341, 2021\n\nFormato do ScriptPubKey:\n```\nOP_1 \u003c32-byte-schnorr-pubkey\u003e\n```\n\nExemplo: `5120a37c3903c8d0db6512e2b40b0dfbfc9213f4b673aeb58d1679364295b2c4e28`\n\n## Montando uma Transação P2WPKH\n\nVamos construir uma transação SegWit P2WPKH passo a passo:\n\n```\nVersion: 01000000 (versão 1)\n\nMarker: 00 (indica transação SegWit)\nFlag: 01 (obrigatório com o marker)\n\nInput Count: 01 (1 input)\nInput:\n - Txid: 2d4a13bdfedcda173c35e61586ea21030bd1da2b010f00163c9417ee7384abd4\n - Vout: 01000000 (índice 1)\n - ScriptSig length: 00 (vazio para SegWit)\n - ScriptSig: (vazio)\n - Sequence: ffffffff\n\nOutput Count: 02 (2 outputs)\nOutput 1:\n - Value: 00ca9a3b00000000 (10 BTC)\n - ScriptPubKey length: 16 (22 bytes)\n - ScriptPubKey: 0014d85c2b71d0060b09c9886aeb815e50991dda124d (P2WPKH)\n\nOutput 2:\n - Value: 009435770000000 (1.5 BTC - troco)\n - ScriptPubKey length: 16 (22 bytes)\n - ScriptPubKey: 00146a59ac0e8f553f292dfe5e9f3aaa1da93499c15e (P2WPKH - endereço de troco)\n\nWitness count: 01 (para 1 input)\nWitness items for input 0:\n - Item count: 02 (assinatura + chave pública)\n - Item 1 length: 47 (71 bytes)\n - Item 1: 3044022074ef696e55a0cc2f4d80fe833095b2a59c5bb9417ee5a3ba905994d228e6f33c02204ab291e35f37d3ed5ddf024170615f1e1d8d6118e3d6c5ecce33b01d72316fb901 (assinatura)\n - Item 2 length: 21 (33 bytes)\n - Item 2: 0283ef77a9821f95f8fd1b93bed127b398989ee19bd598d77859a5962e4fa0f047 (chave pública)\n\nLocktime: 00000000 (sem locktime)\n```\n\n## Processo de Assinatura\n\nO processo de assinatura varia conforme o tipo de transação. Vamos explicar para o P2WPKH:\n\n1. **Criar o preimage da transação**:\n - Version: 01000000\n - Hash de outputs anteriores: d4ab8473ee17943c16000f012bdad10b0321ea8615e6353c17dadcfedd3ba1d4\n - Hash de sequências anteriores: ffffffff\n - Txid do input: 2d4a13bdfedcda173c35e61586ea21030bd1da2b010f00163c9417ee7384abd4\n - Vout: 01000000\n - Script do output sendo gasto: 1976a914d85c2b71d0060b09c9886aeb815e50991dda124d88ac\n - Valor do input: e8030000000000000 (1000 satoshis)\n - Sequence: ffffffff\n - Hash de outputs: (hash de todos os outputs)\n - Locktime: 00000000\n - SigHash: 01000000 (SIGHASH_ALL)\n\n2. **Calcular o hash SHA256 duplo do preimage**\n\n3. **Assinar o hash com a chave privada**\n\n4. **Construir a testemunha (witness) com a assinatura e a chave pública**\n\n## Diferenças na Construção de Diferentes Tipos de Transação\n\n1. **P2PKH**: \n - ScriptSig contém `\u003csig\u003e \u003cpubKey\u003e`\n - Sem campo witness\n\n2. **P2SH**: \n - ScriptSig contém `\u003credeem script\u003e ... \u003carg1\u003e \u003carg2\u003e`\n - Sem campo witness\n\n3. **P2WPKH**:\n - ScriptSig vazio\n - Witness contém `\u003csig\u003e \u003cpubKey\u003e`\n - Usa marker (00) e flag (01)\n\n4. **P2WSH**: \n - ScriptSig vazio\n - Witness contém `\u003carg1\u003e \u003carg2\u003e ... \u003cwitnessScript\u003e`\n - Usa marker (00) e flag (01)\n\n5. **P2TR (Taproot)**:\n - ScriptSig vazio\n - Para gasto via chave: witness contém `\u003cschnorr_signature\u003e`\n - Para gasto via script: witness contém `\u003ccontrolBlock\u003e \u003cscript\u003e \u003cinput1\u003e ... \u003cinputN\u003e`\n - Usa marker (00) e flag (01)\n\n## Exemplo de Transação P2WSH\n\n```\nVersion: 01000000\n\nMarker: 00\nFlag: 01\n\nInput Count: 01\nInput:\n - Txid: 36d0db3a3c4193981b8575e8d457942c8b44974a3e7b89ab73683c2f2293d931\n - Vout: 01000000\n - ScriptSig length: 00\n - ScriptSig: (vazio)\n - Sequence: ffffffff\n\nOutput Count: 01\nOutput:\n - Value: 00e1f50500000000 (1 BTC)\n - ScriptPubKey length: 22 (34 bytes)\n - ScriptPubKey: 0020a7a9f41e9e1281dd2f366c5251f760b50c88e30d55afa812846a0bec1a25478c\n\nWitness:\n - Item count: 03\n - Item 1 length: 47 (assinatura 1)\n - Item 1: 3044022071c2b42eee10a7bf1f9d9734c51172bc37aeb23f836de2470278b595afc29e1602200dcdbf8d31d5cdbcf0da2634c8793594ddd18ab3db4737135ee3c58aafb0d82101\n - Item 2 length: 47 (assinatura 2)\n - Item 2: 304402202d4ade342a961ea429bdc3b88fb7affa38b15c2bd6b4b08e8660f8b990d7a0c30220289e0c391130f8b12ed744b6c0a3ace52da7af49e95fbc5f1ed9bcd8ffc6175f01\n - Item 3 length: 69 (witnessScript)\n - Item 3: 522102f82d2fb56b1a2f69d8ad3d0f1bc692227e06cddb3add3214dcb738b4c8edfc1b21037e4e5ce7b760ffa98cd65577fcc755a9aa22860d11a69bc6bbf0ba33d9fec3452ae (script 2-de-2 multisig)\n\nLocktime: 00000000\n```\n\n## Exemplo de Transação P2TR (Taproot)\n\n```\nVersion: 01000000\n\nMarker: 00\nFlag: 01\n\nInput Count: 01\nInput:\n - Txid: f34b1d2914b73fed3b8a8087056a7c96c95294f896ea0643a1994e378637d764\n - Vout: 00000000\n - ScriptSig length: 00\n - ScriptSig: (vazio)\n - Sequence: ffffffff\n\nOutput Count: 01\nOutput:\n - Value: 0010a5d4e8000000 (2.5 BTC)\n - ScriptPubKey length: 22 (34 bytes)\n - ScriptPubKey: 5120a37c3903c8d0db6512e2b40b0dfbfc9213f4b673aeb58d1679364295b2c4e28\n\nWitness:\n - Item count: 01\n - Item 1 length: 41 (65 bytes - assinatura Schnorr)\n - Item 1: 4140a23c2ffc4bc73ba0b92174b59eba9129319ed4beb66a843f81f9a88310e9eef973fc6ce7c45cd08551102639313d01bbbb92e6e1bfc6d060b9c622cad97e9de\n\nLocktime: 00000000\n```\n\nPara 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.",
"sig": "0e76d6f20e249d87c05f751fe421dd4c4bea05e9ee691c9c0169bdda6fa94fcfe90ecc440f99094825780a81f65cba30511a1055fc4c4d4a6b946dbd658001b6"
}