Tamanho (Size)
As três formas de medir o tamanho de uma transação
Você pode medir o tamanho de uma transação de bitcoin de 3 formas:
- Bytes (b) – O tamanho da transação no disco.
- Unidades de Peso (wu) – Para encaixar transações em um bloco.
- Bytes Virtuais (vB) – Para comparar taxas por byte entre transações.
Bytes é a unidade mais direta. É usada para medir qualquer quantidade de dados em um computador.
Unidades de Peso e Bytes Virtuais são medidas exclusivas do bitcoin. Ambas também medem o tamanho de uma transação em termos de bytes, mas dão um desconto a algumas partes dos dados da transação e são usadas ao calcular quantas transações cabem em um bloco.
Separador de Transação
1. Bytes (b)
Esta é a forma natural de medir o tamanho de uma transação. É o tamanho real da transação em termos de quantos bytes de espaço ela ocupa.
Os bytes são usados ao medir o tamanho de uma transação quando ela está sendo enviada pela rede, ou quanto espaço ela ocupa no disco (ex.: quando armazenada nos arquivos da blockchain).
Medir o tamanho de uma transação em bytes era mais importante quando o limite de tamanho do bloco também era medido em bytes (1.000.000 bytes, ou 1 megabyte). Porém, o limite de tamanho do bloco agora é baseado em peso.
Exemplo
Transação: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a
01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000 Tamanho: 226 bytes
Há 226 bytes nesta transação.
Você pode conferir isso você mesmo, porque cada 2 caracteres hexadecimais representam 1 byte.
Tamanhos típicos de transação
O tamanho de uma transação em bytes depende principalmente de quantas entradas e saídas há na transação. Aqui estão os tamanhos médios para transações típicas (com scripts de travamento P2PKH padrão nas saídas):
- Entradas: 1, Saídas: 1 = 191 ou 192 bytes
- Entradas: 1, Saídas: 2 = 225 ou 226 bytes (mais comum)
- Entradas: 2, Saídas: 1 = 338 ou 339 bytes
- Entradas: 2, Saídas: 2 = 373 ou 374 bytes (muito comum)
Quanto mais entradas e saídas há em uma transação, maior ela fica.
Não há limite para o tamanho de uma transação em termos de bytes, a não ser pelo fato de que ela precisa caber dentro de um bloco.
2. Unidades de Peso (wu)
Toda transação tem uma medida de peso. Essa medida foi introduzida na atualização segregated witness. O peso de uma transação é calculado multiplicando o tamanho (em bytes) de diferentes partes da transação por 4 ou por 1:
| Campo | Multiplicador |
|---|---|
| version | ×4 |
| marker | ×1 |
| flag | ×1 |
| input | ×4 |
| output | ×4 |
| witness | ×1 |
| locktime | ×4 |
Isso, portanto, dá um desconto aos dados de testemunha.
Exemplo
Transação: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a
01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000 Tamanho: 226 bytes
Peso: 574 unidades de peso (116 × 4 + 110 × 1)
Há 226 bytes nesta transação. Desses, 116 bytes são dados não-testemunha, então são multiplicados por 4; e 110 bytes são dados de testemunha, então são multiplicados por 1. Some os dois e você obtém 574 unidades de peso.
Limite do Bloco (4.000.000 unidades de peso)
A medida de peso é importante porque os blocos podem conter até 4.000.000 unidades de peso de dados de transação.
Então, quando os mineradores preenchem seus blocos candidatos com transações, eles usam o peso da transação para determinar quantas transações conseguem encaixar no bloco.
Usar bytes para os tamanhos de transação e para o limite do bloco era mais simples. Mas essa nova medida de peso introduz justiça ao custo de gastar saídas.
Por que os dados de testemunha pesam menos?
Porque isso ajuda a trazer mais equilíbrio entre o custo de criar uma saída e o custo de gastar uma saída (em termos de taxas de transação).
A quantidade de dados necessária para destravar uma saída (ou seja, os dados de assinatura) é injustamente maior do que a quantidade necessária para colocar uma trava na saída em primeiro lugar. Então a nova medida de peso aproxima mais o "tamanho" de entradas e saídas em uma transação.
3. Bytes Virtuais (vBytes, vB)
O tamanho virtual de uma transação é o mesmo que o seu peso dividido por 4.
Ou, dito de outra forma, em vez de multiplicar algumas partes de uma transação por 4 para criar um desconto para os dados de testemunha, você desconta os dados de testemunha diretamente, multiplicando-os por 0,25:
| Campo | Multiplicador |
|---|---|
| version | ×1 |
| marker | ×0,25 |
| flag | ×0,25 |
| input | ×1 |
| output | ×1 |
| witness | ×0,25 |
| locktime | ×1 |
Então o "peso" e o "tamanho virtual" fornecem a mesma medida, apenas com unidades diferentes. Mas usar bytes virtuais facilita comparar o feerate de transações segwit novas com o feerate de transações legadas (que antes usavam sats-por-byte).
Uma transação legada terá o mesmo tamanho em bytes e em vbytes.
Um bloco pode conter 1.000.000 de bytes virtuais.
Exemplo
Transação: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a
01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000 Tamanho: 226 bytes
vSize: 143,50 bytes virtuais (116 × 1 + 110 × 0,25)
Há 226 bytes nesta transação. Desses, 116 bytes são dados não-testemunha, então são multiplicados por 1; e 110 bytes são dados de testemunha, então são multiplicados por 0,25. Some os dois e você obtém 143,50 bytes virtuais.
Como você pode ver, os cálculos de peso e de vsize funcionam da mesma forma.
Por que usamos bytes virtuais?
Então, por que temos tanto o peso quanto os vbytes? Por que não calcular o peso de uma transação multiplicando algumas partes por 0,25 e usar só isso?
Em outras palavras, por que ter duas medidas que fazem a mesma coisa?
Porque o tamanho virtual é fracionário quando computado com precisão. O peso é um inteiro. Só usamos inteiros no código de consenso.
Veja, trabalhar com números fracionários em computadores muitas vezes pode levar a erros de arredondamento, e é por isso que, no Bitcoin, preferimos trabalhar com números inteiros ao realizar cálculos criticamente importantes. A aritmética de inteiros sempre retorna resultados consistentes e confiáveis, enquanto a de ponto flutuante não.
Então, em resumo:
- Unidades de Peso — Usadas internamente ao calcular quantas transações cabem em um bloco.
- Bytes Virtuais — Usados por humanos ao comparar os diferentes feerates das transações.
Recursos
- BIP 141 (cálculos de tamanho de transação)
- Há diferença entre bytes e bytes virtuais (vbytes)?
- Obrigado ao luke-jr por me explicar no IRC como multiplicar os dados não-testemunha por 4 ajuda a criar um equilíbrio entre os custos de criar e gastar UTXOs.