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.
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 😉
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
Obrigado de coração ❤️🚀
vai ver que está calculando 3sat/byte que é o que está configurado nesse exato momento
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.
Fica bem “econômico” desta forma 🙂