Post
Topic
Board Português (Portuguese)
Merits 7 from 7 users
[Experimento] CoinJoin
by
Adriano
on 26/01/2018, 19:02:38 UTC
⭐ Merited by Raskolhnikov1 (1) ,sabotag3x (1) ,caneca (1) ,wilwxk (1) ,u9y42 (1) ,jpouza (1) ,bitmover (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