Author

Topic: [Experimento] CoinJoin (Read 290 times)

legendary
Activity: 2296
Merit: 1170
Advertise Here - PM for more info!
February 05, 2018, 03:47:54 PM
#19
(...)
Infelizmente a funcionalidade de escolher quais inputs utilizar não foi implementada na interface gráfica, então teria que ser feito na mão mesmo.
(...)

O core possuia essa opção sim, a menos que tenha sido retirado. Só que pra habilitar ela precisa ir nas configs, aba "wallet" e depois "enable coin control features". (ou talvez eu tenha entendido errado).

staff
Activity: 1286
Merit: 1085
February 04, 2018, 08:02:32 PM
#18
Olá Adriano, eu uso a Electrum, posso testar pra você sim, mas infelizmente nas próximas semanas não me encontro no Brasil e prefiro evitar fazer as movimentações via TeamViewer, tendo em vista que a Internet aqui é bem fraca e não é nada segura (WiFi aberto).

Quando chegar em casa te mando MP se possível.

Abraços

Valeu, não temos pressa.

Abraço
Adriano
staff
Activity: 1286
Merit: 1085
February 04, 2018, 08:01:39 PM
#17
O que acontece caso uma das transações não tiver saldo? Tentativa de gasto duplo, saldo ainda não chegou naquela carteira, etc..

Tranca todas as outras?

Então, o único motivo pelo qual eu estou pedindo que a transação inicial seja assinada é para comprovar a posse da chave privada. Assim evitamos que um player mal intencionado submeta uma transação fake apenas para atrapalhar o andamento do experimento.

No momento que a transação coinjoin for realizada, inputs já utilizados não serão aceitos, gastos duplos e inputs não confirmadas podem ser aceitos depois de uma análise (por exemplo, se a taxa paga na transação não confirmada garante a taxa mínima esperada quando se consideram as duas transações - quase um CPFP)

Isso não impede que a input seja gasta após o inicio do coinjoin (por exemplo se o coinjoin demorou muito e o participante desistiu), nesse caso, assim que seja detectado que a input foi gasta, uma nova transação será gerada sem aquela input e o processo reinicia, com um participante a menos). Se esse processo for automatizado, as chances disso acontecer são menores pois as assinaturas serão quase instantâneas, mas mesmo que aconteça, o impacto também é menor já que o processo é muito mais agil.
staff
Activity: 1286
Merit: 1085
February 04, 2018, 07:55:08 PM
#16

[...]

Oi Caneca, você usa o Core? Está usando a interface gráfica, certo?

Eu só uso o core via linha de comando, mas dá pra ver nos exemplos usando a testnet do primeiro post que é um trabalho bastante braçal (achar as transaction-ids e os vouts, criar na mão a raw transaction e depois assinar). Mais tarde vou rodar o core via interface gráfica e verificar o passo-a-passo, atualizo aqui com o que descobrir.

Abraço,
Adriano

Isso, estou utilizando com interface gráfica. Talvez pelo console seja possível fazer com linhas de comando?

No aguardo pelas suas instruções.


Opa, acabei demorando (bem) mais do que imaginava para conseguir verificar isso, mas vamos lá.

Infelizmente a funcionalidade de escolher quais inputs utilizar não foi implementada na interface gráfica, então teria que ser feito na mão mesmo. Para isso, é necessário acessar a Console através do menu Ajuda / Janela de Depuração / Console

http://imgur.com/BugtPe5l.png

Nessa janela, vamos usar basicamente dois comandos: createrawtransaction, signrawtransaction

O createrawtransaction tem a seguinte sintaxe (infelizmente é necessário preceder as aspas dentro dos parametros com \ e o resultado final fica meio confuso):

createrawtransaction "[{\"txid\":\"xxxxxxx\",\"vout\":0},{\"txid\":\"yyyyyyy\",\"vout\":99}]" "{\"address1\":9.99,\"address2\":9.99}"

a primeira parte são as inputs que você quer gastar, para cada uma é necessário o txid e o vout, você pode conseguir essas informações na aba Transações:

http://imgur.com/AzwK4l5l.png

Clique duas vezes na transação que você quer gastar, uma janela de detalhes vai se abrir:

http://imgur.com/G3EgrDBl.png

Na tela de detalhes, as informações que precisamos são "ID da transação" e "Index da saída"

No meu exemplo, estas são as transações e vouts que vou utilizar:

Code:
2e891ea060e77a11bea7f62df4c3f89412a7540fdf915e91da4fec9b12c222f0 0
256df869d41bf7105b4a85ef7c69c663d892bb336dfcecec1444fec2079d37ba 0
98e3356f269ac15b17a7358dc2ac6437ec44e378115d12663d181814388974d4 0
b22a24778d762f02f3407ee2775a3346a6f158e57955e9f0bfb7308892b9d821 0
8b987eff665a44f9d37150b63c02721bbee954a9010b522c5fc1627908a940ee 0
b63124e6ebfab39e62a784e2ada0a34b387af5e85816ad3eb0aa0cf1a7d2164b 0
7bff9ce61d8840bba673cf8af1dc98819279e9891b2ee01cde625cf7c0a82b57 0

A segunda parte são os endereços de saída e o valor a ser enviado. A diferença entre o valor das entradas e o valor das saídas é a taxa a ser paga aos mineradores.

No meu exemplo vou mandar para apenas um endereço:

Code:
mwF23UrLnCiRT3NmxtYy8ZqDiib636XXNm  1.28984300

Após formatados os valores de acordo com a sintaxe, ficou assim:

Code:
createrawtransaction "[{\"txid\":\"2e891ea060e77a11bea7f62df4c3f89412a7540fdf915e91da4fec9b12c222f0\",\"vout\":0},{\"txid\":\"256df869d41bf7105b4a85ef7c69c663d892bb336dfcecec1444fec2079d37ba\",\"vout\":0},{\"txid\":\"98e3356f269ac15b17a7358dc2ac6437ec44e378115d12663d181814388974d4\",\"vout\":0},{\"txid\":\"b22a24778d762f02f3407ee2775a3346a6f158e57955e9f0bfb7308892b9d821\",\"vout\":0},{\"txid\":\"8b987eff665a44f9d37150b63c02721bbee954a9010b522c5fc1627908a940ee\",\"vout\":0},{\"txid\":\"b63124e6ebfab39e62a784e2ada0a34b387af5e85816ad3eb0aa0cf1a7d2164b\",\"vout\":0},{\"txid\":\"7bff9ce61d8840bba673cf8af1dc98819279e9891b2ee01cde625cf7c0a82b57\",\"vout\":0}]" "{\"mwF23UrLnCiRT3NmxtYy8ZqDiib636XXNm\":1.28984300}"

http://imgur.com/Xc4al8Wl.png

O código hexadecimal retornado pelo comando é a transação (nesse momento não assinada). Para assiná-la, vamos passar esse código hexadecimal para o comando signrawtransaction:

Code:
signrawtransaction 0200000007f022c2129bec4fda915e91df0f54a71294f8c3f42df6a7be117ae760a01e892e0000000000ffffffffba379d07c2fe4414ececfc6d33bb92d863c6697cef854a5b10f71bd469f86d250000000000ffffffffd47489381418183d66125d1178e344ec3764acc28d35a7175bc19a266f35e3980000000000ffffffff21d8b9928830b7bff0e95579e558f1a646335a77e27e40f3022f768d77242ab20000000000ffffffffee40a9087962c15f2c520b01a954e9be1b72023cb65071d3f9445a66ff7e988b0000000000ffffffff4b16d2a7f10caab03ead1658e8f57a384ba3a0ade284a7629eb3faebe62431b60000000000ffffffff572ba8c0f75c62de1ce02e1b89e979928198dcf18acf73a6bb40881de69cff7b0000000000ffffffff013725b007000000001976a914ac7e7c878b5a6d177058c6b16dc9b3656c3d730888ac00000000

http://imgur.com/TTd9UFzl.png

Note que o retorno do comando agora tem um novo código hexadecimal (que é a transação assinada) e um campo chamado chamado complete. Esse campo informa se todas as inputs foram assinadas, como eu controlo a chave privada de todas as inputs, a transação foi assinada integralmente e pode ser anunciada na rede.

No nosso experimento, cada participante vai receber um código hexadecimal desses e assinar as suas inputs, o resultado de "complete" vai ser falso para todos menos para o último participante.



Edit: retirei a formatação para as imagens, deixando apenas os links pois o fórum "não gosta" de arquivos formato png :-)
legendary
Activity: 2716
Merit: 1116
January 30, 2018, 04:27:34 PM
#15
Olá Adriano, eu uso a Electrum, posso testar pra você sim, mas infelizmente nas próximas semanas não me encontro no Brasil e prefiro evitar fazer as movimentações via TeamViewer, tendo em vista que a Internet aqui é bem fraca e não é nada segura (WiFi aberto).

Quando chegar em casa te mando MP se possível.

Abraços
legendary
Activity: 2688
Merit: 2297
January 30, 2018, 09:13:01 AM
#14
O que acontece caso uma das transações não tiver saldo? Tentativa de gasto duplo, saldo ainda não chegou naquela carteira, etc..

Tranca todas as outras?
full member
Activity: 518
Merit: 147
January 28, 2018, 08:14:53 AM
#13

[...]

Oi Caneca, você usa o Core? Está usando a interface gráfica, certo?

Eu só uso o core via linha de comando, mas dá pra ver nos exemplos usando a testnet do primeiro post que é um trabalho bastante braçal (achar as transaction-ids e os vouts, criar na mão a raw transaction e depois assinar). Mais tarde vou rodar o core via interface gráfica e verificar o passo-a-passo, atualizo aqui com o que descobrir.

Abraço,
Adriano

Isso, estou utilizando com interface gráfica. Talvez pelo console seja possível fazer com linhas de comando?

No aguardo pelas suas instruções.
staff
Activity: 1286
Merit: 1085
January 28, 2018, 08:05:05 AM
#12
@Adriano, o passo a passo da Electrum se assemelham ao que deve ser feito no Bitcoin Core? Gostaria de ajudá-lo nesse experimento.

Meus conhecimentos técnicos são um pouco limitados, mas só me apontar o caminho que consigo me virar depois.

Oi Caneca, você usa o Core? Está usando a interface gráfica, certo?

Eu só uso o core via linha de comando, mas dá pra ver nos exemplos usando a testnet do primeiro post que é um trabalho bastante braçal (achar as transaction-ids e os vouts, criar na mão a raw transaction e depois assinar). Mais tarde vou rodar o core via interface gráfica e verificar o passo-a-passo, atualizo aqui com o que descobrir.

Abraço,
Adriano
full member
Activity: 518
Merit: 147
January 27, 2018, 08:22:39 PM
#11
@Adriano, o passo a passo da Electrum se assemelham ao que deve ser feito no Bitcoin Core? Gostaria de ajudá-lo nesse experimento.

Meus conhecimentos técnicos são um pouco limitados, mas só me apontar o caminho que consigo me virar depois.
staff
Activity: 1286
Merit: 1085
January 27, 2018, 06:14:17 AM
#10
Show de bola, ano passado deixei de fazer algumas movimentações por causa das altas taxas. Espero que que a galera agregue!

Vai ter número mínimo de participantes? ou dia fixo para ocorrer a transação?


Com uns dois ou três participantes já dá para começar. Eu posso gerar algumas transações minhas para aumentar o número de participantes se for o caso.

Não tem data fixa para a transação, mas a ideia é fazer algumas transações nas próximas semanas. Eu esperava já poder fazer a primeira transação neste final de semana, vamos ver como será a adesão.

PS: Nesse momento as taxas médias na mempool estão bem baixas, aproximadamente 6 MB pagando 5 satoshis por byte ou mais e outros 23 MB pagando entre 2 e 5 satoshis/byte. De repente podemos oferecer algumas transações com 1 input e 1 output "gratís" no experimento para incentivar a participação de mais pessoas, gerando uma transação maior. Isso seria bom para quem quer mover as coins para usar segwit.

Adriano
staff
Activity: 1286
Merit: 1085
January 27, 2018, 06:06:50 AM
#9
Bacana o conceito..

Qual o motivo de não poder ser paralelo? (enviar os raw em qualquer ordem)

Tem como criar um software automatizado para isso? Assim daria pra empacotar X transações e enviar de hora em hora por exemplo..

Infelizmente meus trocados estão em exchanges Sad

Dá para automatizar sim, a ideia do experimento é ver se vale a pena. O electrum tem um plugin que automatiza o processo de multi-sig por exemplo... poderia ser feito algo parecido para automatizar toda a troca de mensagens até que a transação final fosse gerada e então divulgada na rede.

Sobre o paralelismo, até ví alguns artigos mencionando teorias que possibilitariam combinar duas transações independentes em uma única, mas não me pareceu algo para curto prazo, além de ter alguns problemas. Da maneira tradicional, o problema é que a transação final tem que ter as assinaturas dos endereços de todas as inputs, imagine que a transação tem inputs dos usuários A, B e C. Eu gero uma transação que não tem nenhuma assinatura e envio aos três usuários, quando um deles assinar a transação, é essa "nova" transação parcialmente assinada que precisa ser enviada para B e C para que eles assinem, e quando C me enviar a transação assinada por ele, ela agora tem as assinaturas de A e C, então essa "nova" transação é a que precisa ser enviada para B para que ele a assine e assim a transação estaria completa, assinada por todos os participantes e poderia ser propagada para a rede.

Quanto ao software que envie de tempos em tempos, eu imagino que com RBF seja possível ir propagando a transação com alguns participantes e enquanto ela não for incluida em um bloco, seria possível ir adicionando novos participantes... no momento que a transação fosse incluida em um bloco, novos participantes iriam gerar uma nova transação que reiniciaria todo o processo.

Mas tudo isso é apenas uma ideia por enquanto, dependendo dos resultados do experimento para ver se vale o esforço.

Adriano
staff
Activity: 1286
Merit: 1085
January 27, 2018, 05:53:40 AM
#8
Uma duvida sobre a parte de assinar as transações, haveria algum problema de compatibilidade se tentasse misturar transações segwit com o legacy ? Porque seria um otimo método de economizar ainda mais as taxas para os usuarios que ja adotaram o segwit.

Não tem problema não, as inputs que já estão usando segwit serão assinadas corretamente com o novo formato e as inputs que ainda estão utilizando endereços "legacy" são assinadas da maneira original. Inclusive o experimento pode ser uma boa oportunidade para quem quer mover seus bitcoins para endereços segwit, já que não haveria pressa nesse caso, e as taxas seriam menores.

Adriano
legendary
Activity: 2688
Merit: 2297
January 27, 2018, 04:00:56 AM
#7
Bacana o conceito..

Qual o motivo de não poder ser paralelo? (enviar os raw em qualquer ordem)

Tem como criar um software automatizado para isso? Assim daria pra empacotar X transações e enviar de hora em hora por exemplo..

Infelizmente meus trocados estão em exchanges Sad
member
Activity: 560
Merit: 65
January 26, 2018, 05:48:57 PM
#6
Show de bola, ano passado deixei de fazer algumas movimentações por causa das altas taxas. Espero que que a galera agregue!

Vai ter número mínimo de participantes? ou dia fixo para ocorrer a transação?

Uma duvida sobre a parte de assinar as transações, haveria algum problema de compatibilidade se tentasse misturar transações segwit com o legacy ? Porque seria um otimo método de economizar ainda mais as taxas para os usuarios que ja adotaram o segwit.

Verdade, eu já to uso seg  Grin, tb queria saber
sr. member
Activity: 476
Merit: 314
January 26, 2018, 05:17:38 PM
#5
Uma duvida sobre a parte de assinar as transações, haveria algum problema de compatibilidade se tentasse misturar transações segwit com o legacy ? Porque seria um otimo método de economizar ainda mais as taxas para os usuarios que ja adotaram o segwit.
staff
Activity: 1286
Merit: 1085
January 26, 2018, 02:28:43 PM
#4
Bacana Adriano.
Eu trabalho pouco com transações em BTC, mais comum é converter alts em BTC pra HOLD.
Mas tenho alguns trabalhos que recebo em BTC, dos quais gostaria de fazer uso desse "CoinJoin".

Só uma dúvida... uso a Electrum juntamente com uma Ledger Nano S.
A assinatura posterior por essa opção "Load transaction" não vai dar problema, ou tudo normal assim como assinar uma TX padrão?

Não tem problema não, funciona como uma transação normal.

[EDIT]
Outra coisa....
Se eu tiver uma TX simples com poucos inputs não vou acabar pagando por outros que tem uma mais pesada?  Undecided

Como a transação final é menor do que a soma das transações individuais, o resultado final deve ser uma transação que paga mais taxa do que as individuais quando considerado sat/byte (ou peso) fazendo com que ela seja aceita mais rapidamente.

Mas na realidade, se a sua transação tiver por exemplo 100 satoshis por byte e as demais estiverem pagando 30 satoshis por byte, o ganho no tamanho da transação não será suficiente para cobrir a diferença, resultando em uma transação  que pague uma taxa menor do que voce estaria pagando.

Para evitar isso, se eu souber qual o endereço de troco posso modificar a transação para que todas elas paguem a mesma taxa proporcional, no exemplo acima, eu modificaria a sua transação para que ela pagasse apenas 30 sat/byte igual aos demais, creditando a diferença no seu endereço de troco.

Abraço
Adriano
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
January 26, 2018, 02:15:09 PM
#3
Bacana Adriano.
Eu trabalho pouco com transações em BTC, mais comum é converter alts em BTC pra HOLD.
Mas tenho alguns trabalhos que recebo em BTC, dos quais gostaria de fazer uso desse "CoinJoin".

Só uma dúvida... uso a Electrum juntamente com uma Ledger Nano S.
A assinatura posterior por essa opção "Load transaction" não vai dar problema, ou tudo normal assim como assinar uma TX padrão?


[EDIT]
Outra coisa....
Se eu tiver uma TX simples com poucos inputs não vou acabar pagando por outros que tem uma mais pesada?  Undecided
staff
Activity: 1286
Merit: 1085
January 26, 2018, 02:03:05 PM
#2
reservado para os resultados.
staff
Activity: 1286
Merit: 1085
January 26, 2018, 02:02:38 PM
#1

Pessoal,

Estou querendo fazer um experimento com CoinJoin, este primeiro teste será completamente manual, dependendo do resultado pode evoluir.

Para quem não conhece, CoinJoin é uma técnica onde, ao invés de cada usuário gerar uma transação, as inputs e outputs são combinadas em uma única transação. Existem algumas vantagens, por exemplo:

- o tamanho da transação combinada é menor do que se fossem transações independentes, portanto exigindo taxas menores (ou mais prioridade se forem utilizadas as mesmas taxas);
- maior privacidade, pois como a transação tem várias inputs e várias outputs é mais difícil de identificar quais as origens e destinos de cada transação individual, assim como quais os endereços de destino/troco;

Claro que se os inputs e outputs forem de valores muito diferentes, ainda é fácil verificar quais os outputs somados equivalem a cada input, e existem formas de minimizar esse risco, mas esse não é o principal foco do experimento nesse momento.

A lista de pre-requisitos, se você quiser participar do experimento, é a seguinte:
1. Sua carteira precisa ser capaz de importar e assinar transações;
2. Sua carteira precisa ser capaz de gerar uma transação, assiná-la, mas não fazer o broadcast (opcional neste momento, mas fortemente recomendado);
3. Não pode ser uma transação que você tem urgência, pois o processo será manual e pode demorar alguns dias para coordenar com todos os participantes;

Dois exemplos de carteiras que atendem os pontos 1 e 2 acima são o Bitcoin Core e a Electrum. Se você quiser que adicione outras carteiras à lista, me avise por favor.

Como vai funcionar o experimento:

1. Você gera a transação que quer utilizar no experimento, incluindo a taxa; Não faça o broadcast da mesma e me envie a transação raw via MP (isto é para garantir a pseudo-anonimidade);
    O objetivo de ter a transação assinada neste momento é apenas para garantir que você possui a chave privada dos endereços utilizados, evitando que alguém atrapalhe o processo gerando uma transação aleatória que só atrasaria todo o processo no momento das assinaturas da transação final por cada participante.

2. Eu vou gerar uma nova transação contendo todas as inputs e outputs de todos os participantes e enviar para cada um assinar as suas inputs. Nesse momento você precisa conferir que esta transação tem as mesmas inputs e outputs que a transação que você enviou... isso garante que eu não incluí na transação final outros inputs do seu endereço, ou que mudei o destino ou valor a ser enviado;

3. Se a transação estiver ok, você a assina e me devolve para que eu passe para o próximo participante. Infelizmente esse processo não pode acontecer em paralelo. Uma alternativa para agilizar o processo será eu enviar a transação para todos os participantes, e reenviar a transação para os que ainda não assinaram a cada vez que eu receber uma nova assinatura... como participante você só precisa assinar a última transação que receber de mim. O único problema nesse caso é se duas pessoas assinarem a transação no mesmo momento. Nesse caso eu preciso descartar uma e pedir para a pessoa assinar a nova transação (mais ou menos o que acontece quando dois blocos são minerados muito próximos um do outro, e um deles se torna órfão.

4. Quando todos os participantes tenham assinado a transação, eu farei o broadcast da mesma e vou publicar aqui os detalhes do experimento (tamanho das transações individuais, tamanho da transação final, quantos satoshis por byte cada transação estava pagando e quanto a transação final pagou, etc)

Como fazer utilizando o Electrum:

  • você pode selecionar os inputs que quer utilizar através da aba "Coins" ou qualquer input do endereço através da aba "Addresses", basta clicar com o botão direito e escolher "Spend"/"Spend from";
  • Preencher o(s) endereço(s) de destino e escolher a taxa. Clique então em "Preview" (NÃO clique em Send)
  • Clique em Sign e em seguida em Copy
  • Envie uma MP para mim o a transação que você copiou no passo anterior.

Para confirmar e assinar a transação que eu vou te enviar:

  • Clique em Tools, Load transaction, From text
  • Cole a transação eu eu te enviei na janela que se abrir e clique em Load transaction;
  • O electrum mostra em verde as inputs/outputs da sua carteira. verifique se elas batem com a transação que você me enviou, se sim, clique em Sign e em Copy, me envie novamente o valor copiado através de MP

Aqui alguns exemplos utilizando a rede testnet do Bitcoin:

1 transação comum, com 1 input e 2 outpus, tem 225 bytes depois de assinada:

Code:
# bin/bitcoin-cli -testnet createrawtransaction "[{\"txid\":\"33ecd9a27db30e397440942156beed15dfa0c671c553c135f0aa13c587722143\",\"vout\":0}]" "{\"mzUQE1RewdmyXERGSHpod3rFFtQuaH4ELZ\":1.05955696,\"mpgQEb9ZEhR7PGMaDS344vch1StQUjaZD8\":0.30000000}" 0 true
020000000143217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec330000000000fdffffff0270c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00000000


# bin/bitcoin-cli -testnet signrawtransaction 020000000143217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec330000000000fdffffff0270c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00000000
{
  "hex": "020000000143217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec33000000006a473044022041909a209f9313a0b45046c0cddc553201830818f49931030f6722bd1166a2ce022028ac173709adfb734592ffd924439e830f4b46907d44f54ffe9a17bce6935d0f012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0270c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00000000",
  "complete": true
}

# bin/bitcoin-cli -testnet decoderawtransaction 020000000143217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec33000000006a473044022041909a209f9313a0b45046c0cddc553201830818f49931030f6722bd1166a2ce022028ac173709adfb734592ffd924439e830f4b46907d44f54ffe9a17bce6935d0f012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0270c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00000000
{
  "txid": "cfc75e8ac66e195fa321938f231120de33ae59796be9f8339469e99b4c33ce10",
  "hash": "cfc75e8ac66e195fa321938f231120de33ae59796be9f8339469e99b4c33ce10",
  "version": 2,
  "size": 225,
  "vsize": 225,
  "locktime": 0,
  "vin": [
    {
      "txid": "33ecd9a27db30e397440942156beed15dfa0c671c553c135f0aa13c587722143",
      "vout": 0,
      "scriptSig": {
        "asm": "3044022041909a209f9313a0b45046c0cddc553201830818f49931030f6722bd1166a2ce022028ac173709adfb734592ffd924439e830f4b46907d44f54ffe9a17bce6935d0f[ALL] 03132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e",
        "hex": "473044022041909a209f9313a0b45046c0cddc553201830818f49931030f6722bd1166a2ce022028ac173709adfb734592ffd924439e830f4b46907d44f54ffe9a17bce6935d0f012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e"
      },
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 1.05955696,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 cfeec998872d7328e29347a5b613049587d11c44 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914cfeec998872d7328e29347a5b613049587d11c4488ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mzUQE1RewdmyXERGSHpod3rFFtQuaH4ELZ"
        ]
      }
    },
    {
      "value": 0.30000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 64828790f0ea411e61970f3f13ce36f394c1fc24 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mpgQEb9ZEhR7PGMaDS344vch1StQUjaZD8"
        ]
      }
    }
  ]
}

Outra transação com 1 input e 2 outputs, mesmo tamanho final, 225 bytes:

Code:
# bin/bitcoin-cli -testnet createrawtransaction "[{\"txid\":\"314c12bcc014a6dba4bf86e8623f50745692931861dab7e64c729e6254bd422a\",\"vout\":0}]" "{\"mmmAb9Cmz5pGFMFzexqSZoMtuW4unnQjBU\":0.60000000,\"n2H7WowwnzPTZ3t3QYCvzA2vvQoSexB4T1\":0.05000000}" 0 true
02000000012a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c310000000000fdffffff0200879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000

# bin/bitcoin-cli -testnet signrawtransaction 02000000012a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c310000000000fdffffff0200879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000
{
  "hex": "02000000012a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c31000000006a4730440220711940e0b8ab0157c21b412ba2b7d1c227df97f171c23c774ea260d30761769b022006a432996d516f45509871df2da6e8cd997cc3e9b913db09203d5270dfa98667012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0200879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000",
  "complete": true
}
# bin/bitcoin-cli -testnet decoderawtransaction 02000000012a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c31000000006a4730440220711940e0b8ab0157c21b412ba2b7d1c227df97f171c23c774ea260d30761769b022006a432996d516f45509871df2da6e8cd997cc3e9b913db09203d5270dfa98667012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0200879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000
{
  "txid": "d0efd3285271445a44f8c22f6e23d64012933972e7cddb8e0852611ed64baac3",
  "hash": "d0efd3285271445a44f8c22f6e23d64012933972e7cddb8e0852611ed64baac3",
  "version": 2,
  "size": 225,
  "vsize": 225,
  "locktime": 0,
  "vin": [
    {
      "txid": "314c12bcc014a6dba4bf86e8623f50745692931861dab7e64c729e6254bd422a",
      "vout": 0,
      "scriptSig": {
        "asm": "30440220711940e0b8ab0157c21b412ba2b7d1c227df97f171c23c774ea260d30761769b022006a432996d516f45509871df2da6e8cd997cc3e9b913db09203d5270dfa98667[ALL] 03132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e",
        "hex": "4730440220711940e0b8ab0157c21b412ba2b7d1c227df97f171c23c774ea260d30761769b022006a432996d516f45509871df2da6e8cd997cc3e9b913db09203d5270dfa98667012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e"
      },
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 0.60000000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 4480d7591cb632851816b909a5000f35ec9ba2e7 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a9144480d7591cb632851816b909a5000f35ec9ba2e788ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mmmAb9Cmz5pGFMFzexqSZoMtuW4unnQjBU"
        ]
      }
    },
    {
      "value": 0.05000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 e3bc83b045df3da03fbb06465388e45736d198b0 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914e3bc83b045df3da03fbb06465388e45736d198b088ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "n2H7WowwnzPTZ3t3QYCvzA2vvQoSexB4T1"
        ]
      }
    }
  ]
}

E finalmente, a transação agregada, com as duas inputs e quatro outputs, cujo tamanho total ficou em 440 bytes:

Code:
# bin/bitcoin-cli -testnet createrawtransaction "[{\"txid\":\"33ecd9a27db30e397440942156beed15dfa0c671c553c135f0aa13c587722143\",\"vout\":0},{\"txid\":\"314c12bcc014a6dba4bf86e8623f50745692931861dab7e64c729e6254bd422a\",\"vout\":0}]" "{\"mzUQE1RewdmyXERGSHpod3rFFtQuaH4ELZ\":1.05955696,\"mpgQEb9ZEhR7PGMaDS344vch1StQUjaZD8\":0.30000000,\"mmmAb9Cmz5pGFMFzexqSZoMtuW4unnQjBU\":0.60000000,\"n2H7WowwnzPTZ3t3QYCvzA2vvQoSexB4T1\":0.05000000}" 0 true
020000000243217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec330000000000fdffffff2a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c310000000000fdffffff0470c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000

# bin/bitcoin-cli -testnet signrawtransaction 020000000243217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec330000000000fdffffff2a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c310000000000fdffffff0470c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000
{
  "hex": "020000000243217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec33000000006a47304402203df82b797fb70c4b6945f7fe64c6313f9d5bc8b0a3fa9f85c73eaa1302b2745e0220556808117806164d955498f9b50d6d3c39e0ae4511f2042bb9da2d81f523b5df012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff2a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c31000000006a473044022041dd569d64dd0da3fdb440afa36bd831f9e14686805fc9c926ed0f640a4c346d02205a6a1d8548b7bc6bb1b68fb218daa7098a2872c057108626e4872b1c3eec9704012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0470c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000",
  "complete": true
}

# bin/bitcoin-cli -testnet decoderawtransaction 020000000243217287c513aaf035c153c571c6a0df15edbe5621944074390eb37da2d9ec33000000006a47304402203df82b797fb70c4b6945f7fe64c6313f9d5bc8b0a3fa9f85c73eaa1302b2745e0220556808117806164d955498f9b50d6d3c39e0ae4511f2042bb9da2d81f523b5df012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff2a42bd54629e724ce6b7da611893925674503f62e886bfa4dba614c0bc124c31000000006a473044022041dd569d64dd0da3fdb440afa36bd831f9e14686805fc9c926ed0f640a4c346d02205a6a1d8548b7bc6bb1b68fb218daa7098a2872c057108626e4872b1c3eec9704012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3efdffffff0470c15006000000001976a914cfeec998872d7328e29347a5b613049587d11c4488ac80c3c901000000001976a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac00879303000000001976a9144480d7591cb632851816b909a5000f35ec9ba2e788ac404b4c00000000001976a914e3bc83b045df3da03fbb06465388e45736d198b088ac00000000

{
  "txid": "76f4c981d1f1f03bf108b86c9ac4ed6992d5a7bc2c7e12a336bf00fdca25cc59",
  "hash": "76f4c981d1f1f03bf108b86c9ac4ed6992d5a7bc2c7e12a336bf00fdca25cc59",
  "version": 2,
  "size": 440,
  "vsize": 440,
  "locktime": 0,
  "vin": [
    {
      "txid": "33ecd9a27db30e397440942156beed15dfa0c671c553c135f0aa13c587722143",
      "vout": 0,
      "scriptSig": {
        "asm": "304402203df82b797fb70c4b6945f7fe64c6313f9d5bc8b0a3fa9f85c73eaa1302b2745e0220556808117806164d955498f9b50d6d3c39e0ae4511f2042bb9da2d81f523b5df[ALL] 03132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e",
        "hex": "47304402203df82b797fb70c4b6945f7fe64c6313f9d5bc8b0a3fa9f85c73eaa1302b2745e0220556808117806164d955498f9b50d6d3c39e0ae4511f2042bb9da2d81f523b5df012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e"
      },
      "sequence": 4294967293
    },
    {
      "txid": "314c12bcc014a6dba4bf86e8623f50745692931861dab7e64c729e6254bd422a",
      "vout": 0,
      "scriptSig": {
        "asm": "3044022041dd569d64dd0da3fdb440afa36bd831f9e14686805fc9c926ed0f640a4c346d02205a6a1d8548b7bc6bb1b68fb218daa7098a2872c057108626e4872b1c3eec9704[ALL] 03132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e",
        "hex": "473044022041dd569d64dd0da3fdb440afa36bd831f9e14686805fc9c926ed0f640a4c346d02205a6a1d8548b7bc6bb1b68fb218daa7098a2872c057108626e4872b1c3eec9704012103132c1d6a4ea27d03e6c0f6627eb55654d748087aac09bb838c31926597aebd3e"
      },
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 1.05955696,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 cfeec998872d7328e29347a5b613049587d11c44 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914cfeec998872d7328e29347a5b613049587d11c4488ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mzUQE1RewdmyXERGSHpod3rFFtQuaH4ELZ"
        ]
      }
    },
    {
      "value": 0.30000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 64828790f0ea411e61970f3f13ce36f394c1fc24 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91464828790f0ea411e61970f3f13ce36f394c1fc2488ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mpgQEb9ZEhR7PGMaDS344vch1StQUjaZD8"
        ]
      }
    },
    {
      "value": 0.60000000,
      "n": 2,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 4480d7591cb632851816b909a5000f35ec9ba2e7 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a9144480d7591cb632851816b909a5000f35ec9ba2e788ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mmmAb9Cmz5pGFMFzexqSZoMtuW4unnQjBU"
        ]
      }
    },
    {
      "value": 0.05000000,
      "n": 3,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 e3bc83b045df3da03fbb06465388e45736d198b0 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914e3bc83b045df3da03fbb06465388e45736d198b088ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "n2H7WowwnzPTZ3t3QYCvzA2vvQoSexB4T1"
        ]
      }
    }
  ]
}

Nesse exemplo os ganhos foram bem pequenos (~ 3%) pois cada endereço tinha apenas uma input, parte do que quero com esse experimento é verificar como será o resultado com transações reais, além de verificar como isso escala com mais transações sendo adicionadas.

Agradeço a quem quiser participar,
Abraço,
Adriano
Jump to: