Author

Topic: Como calcular a fee: dica do @osoriojr (Original my) (Read 165 times)

legendary
Activity: 2296
Merit: 1170
Advertise Here - PM for more info!
Numa thread do facebook perguntaram como calcular a fee ideal para uma transação. O Edilson Osório Junior, Da Original My deu uma reposta tão completa que eu pedi se poderia replicar ela aqui para que fique guardada pra posteridade:


Cara, na OriginalMy eu faço da seguinte maneira após Segwit:

Cada input tem 181 bytes e cada output tem 34 bytes. E já considero 2 outputs: um para o OP_RETURN e outro para o troco... logo o num_outputs = 2.

Primeiro calculo os outputs:
transaction_size = ((num_outputs * output_size) + 10 + 33)
transaction_cost = transaction_size * fee_por_byte

(+10 e +33 são dois ajustes, em dois momentos, que fiz manualmente depois que entrou a segwit)(fee_por_byte é literalmente quantos satoshis você quer pagar por byte... dá pra pegar baseado bitcoinfees.earn)

Depois checo entrada por entrada disponível até encontrar saldo >= transaction_cost (que nesse momento só conhece as saídas)

A questão é que tem que ajustar o fee a cada novo input que entra, pois aumenta a transação em aproximadamente 181 bytes a cada input. Então, a cada loop com novo input válido, tem que recalcular.

transaction_size += input_size - total_inputs
transaction_cost = (fee_por_byte * transaction_size)

ao mesmo tempo que vou appendando essas entradas válidas numa matriz.

Quando o total das coins dos inputs (total_inputs_value) for maior que o transaction_cost reajustado a cada loop, anexo o output do script OP_RETURN e o output do troco (já provisionados lá no início)
O troco é calculado como total_inputs_value - transaction_cost

Gero a unsigned_tx com o array dos inputs, o array dos outputs, versão e lock_time
Assino
Envio a raw tx.

Tem dado certo. Em momentos de congestionamento, é só ajustar o fee_per_byte para o tempo que você deseja, que ele coloca a transação com o menor tamanho possível e a quantidade de fee correta para o tamanho da transação, para registrar naquele tempo.
Quote from: Matheus Grijó
Pqp até sentei para ler mais ficou algumas dúvidas!

1. Você pega via api o valor da fee no “bitcoinfee.earn”?

2. Esse aumento de 181 bytes é “achismo” certo? É um valor aproximado quero dizer.

3. Não saquei muito o conceito do troco 😞

Do mais vou copiar hehehe ❤️

Obrigado pela aula 😉
Quote from: Edilson Osório Junior
Matheus Grijó isso:
1) pego (correção, não está pegando... tá setado 3 sat/byte agora)
2) cara, descobri na unha, testando e testando e cheguei nesse valor. Antigamente tinha ele exato antes de segwit, depois de segwit, não encontrei e fui testando até encontrar o valor exato. Esse valor é estável.
3) ahhahah manda ver Smiley
Quote from: Matheus Grijó
Edilson Osório Junior beleza vou usar 181 então heheeh
Obrigado de coração ❤️🚀
Quote from: Edilson Osório Junior
Matheus Grijó se vc olhar essa tx: https://www.blockchain.com/.../40caed81e2401c630418ffb2d7...

vai ver que está calculando 3sat/byte que é o que está configurado nesse exato momento
Quote from: Edilson Osório Junior
Olha, antes de Segwit eu usava input com 143. achei essa ref: http://bitcoin.stackexchange.com/.../how-to-calculate...

Depois de segwit, tem que ajustar os outputs (2 no meu caso) + 33 e considerar cada input como 181. Se você tiver mais outputs, ou um só, o diff arredonda para 17 para cada output. eu uso 33 (sim, economizo 1 arbitrariamente no cálculo) para 2 outputs e o cálculo normalmente bate.

e depois, a cada loop encontrando um input válido, tem que recalcular a transaction_size e a transaction_cost.

basicamente é isso mesmo.
Quote from: Matheus Grijó
Edilson Osório Junior hmmmmmm agora fez sentido hehehe

Fica bem “econômico” desta forma 🙂
Jump to: