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:
# 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:
# 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:
# 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