Coin Selection é a escolha dos fundos com que uma carteira monta uma transação Bitcoin. O saldo não é um valor contínuo: reúne saídas separadas de transações anteriores que ainda não foram gastas, chamadas UTXO. A carteira precisa de selecionar fundos suficientes para o pagamento e a taxa. Geralmente faz isso automaticamente; a seleção manual chama-se Coin Control. A rede verifica a validade da transação resultante, mas não obriga todas as carteiras a seguir o mesmo método de seleção.
Anna quer pagar 60000 sat. A sua carteira prepara o pagamento: é uma aplicação ou um dispositivo que permite receber e enviar bitcoin. A abreviatura sat significa satoshi, a menor unidade em que se registam os valores das transações Bitcoin. Tem um UTXO de 100000 sat. Tal como acontece com uma nota, não pode simplesmente descontar uma parte: uma entrada da nova transação gasta essa saída inteira. A transação cria uma saída de 60000 sat para o comerciante e, com uma taxa de 1000 sat, outra de 39000 sat para Anna. Esta segunda saída é o troco, ou change. Não é um reembolso posterior do comerciante; nasce na própria transação de Anna. A taxa é a diferença entre a soma das entradas e a de todas as saídas. [1] [7]
A carteira pode financiar o mesmo pagamento com diferentes UTXO. Porém, mais entradas costumam significar mais dados e, portanto, uma taxa total maior para a mesma taxa por unidade de tamanho. O custo não é uma percentagem do valor enviado. Depende do tamanho virtual da transação, medido em vB, ou bytes virtuais, que consideram o peso diferente dos seus componentes. Imagine um UTXO de 10000 sat cuja entrada acrescenta cerca de 68 vB. A 10 sat/vB, essa entrada custa 680 sat e contribui com 9320 sat para o restante pagamento: o seu valor efetivo. As outras partes da transação continuam a ter custos; o tamanho real da entrada depende das condições de gasto escritas no script e dos dados da assinatura. Um script é um pequeno programa que descreve as condições de gasto. Num pagamento normal, a carteira usa uma chave privada, um valor numérico secreto, para criar uma assinatura digital: uma autorização de gasto que pode ser verificada. [2] [3] [7]
Anna pode ter recebido muitas pequenas quantias. Juntá-las numa saída maior, também sua, chama-se consolidação. Mais tarde poderá precisar de menos entradas, mas a operação custa uma taxa hoje e liga publicamente as saídas usadas. Por isso, juntar tudo automaticamente não é uma boa opção por defeito. Bitcoin Core também compara custos através da waste metric: uma pontuação que considera a diferença entre o custo das entradas agora e com uma taxa de longo prazo presumida, mais o custo de criar e gastar depois o troco, ou o excedente entregue como taxa. A taxa de longo prazo é uma hipótese de trabalho, não uma previsão. Esta pontuação mede custos, não privacidade. [2] [6]
Anna identificou um recebimento como salário e outro como presente. Gastá-los em conjunto dá a quem observa a blockchain uma pista de que estão relacionados. Isso não prova que todas as entradas pertencem à mesma pessoa: uma transação também pode ser construída por vários participantes. Coin Control permite escolher UTXO específicos, e os rótulos ajudam a recordar a origem. Um rótulo é uma nota na carteira, não uma mensagem gravada na blockchain. BIP 329 descreve a transferência destas notas e da informação sobre se a carteira considera uma saída disponível para gastar. Trata-se de uma configuração local da carteira, que não altera as regras da rede Bitcoin. O formato não seleciona os fundos. Exportar rótulos pode revelar relações sensíveis, e nem mesmo um pagamento sem troco garante anonimato. [4] [6]
Nem todo o saldo apresentado está necessariamente disponível de imediato. A carteira pode excluir algumas saídas de propósito; outras aguardam confirmação ou o cumprimento das condições de gasto. A seleção também tem de respeitar os limites de tamanho e peso da transação. Gastar um recebimento não confirmado faz o novo pagamento depender da transação anterior que o criou, chamada antecessora neste contexto. Confirmar toda a cadeia pode exigir uma taxa adicional. RPC, a interface através da qual os programas controlam Bitcoin Core 29.0, disponibiliza include_unsafe em walletcreatefundedpsbt. A opção permite incluir entradas não confirmadas arriscadas. Se a transação original for substituída de forma a eliminar a saída necessária, o pagamento dependente não poderá ser confirmado. A simples remoção temporária da transação original da memória de um nó não altera, por si só, a sua validade. [3] [5]
Como explora a carteira as possibilidades? Branch-and-bound, ou BnB, testa combinações de entradas e abandona ramos de pesquisa que não podem produzir um resultado adequado. Procura financiar o pagamento sem uma saída de troco separada. Não exige correspondência exata: o intervalo permitido admite um excedente até ao custo de criar e gastar posteriormente o troco. Esse excedente torna-se taxa; não fica escondido na carteira. Assim, um pagamento sem troco não é necessariamente o mais barato possível. A pesquisa tem um número limitado de tentativas e pode não encontrar uma solução existente nem a melhor de todas as combinações. [2]
Bitcoin Core 29.0 compara propostas de BnB, Knapsack e Single Random Draw (SRD), métodos diferentes para encontrar um conjunto adequado de entradas. Acrescenta CoinGrinder quando a taxa efetiva ultrapassa o triplo da taxa de longo prazo; esse método procura uma seleção de pouco peso e com troco. Compara as propostas através da waste metric explicada antes. Se o utilizador escolher descontar a taxa dos valores destinados aos destinatários, BnB é ignorado. Trata-se da descrição desta versão específica, não de um procedimento obrigatório para todas as carteiras nem de uma afirmação sobre a versão mais recente. [3]
Para um pagamento normal, não precisa de conhecer parâmetros de programação. Antes de assinar, porém, precisa de compreender o destinatário, o valor, a taxa total e o seu troco. Para utilizadores avançados, walletcreatefundedpsbt no Bitcoin Core 29.0 permite indicar entradas por txid, o identificador da transação original, e vout, o índice da sua saída. add_inputs controla se a carteira pode acrescentar outras entradas. Atenção às unidades: fee_rate usa sat/vB, enquanto feeRate usa BTC/kvB, ou seja, bitcoin por 1000 bytes virtuais. O resultado é um PSBT, um formato para passar uma transação preparada a quem a vai assinar. Criar um PSBT, por si só, não envia nada nem confirma um pagamento. Nem a seleção manual nem este formato garantem o destinatário correto ou a validade de entradas não confirmadas. [5]
Para ter uma visão mais completa, leia este verbete junto com UTXO, Coin Control, Change Address, Fee Rate, PSBT, Privacidade no Bitcoin. Também há referências a este verbete em Watch-only Wallet, Change Address, Inventing Bitcoin.