Aqui há uns tempos falou-se em
Coinjoin e acho que eu fiquei em criar uma thread sobre o assunto. Então aqui fica ela.
O que é o Coinjoin?Coinjoin é um procedimento para misturar moedas Bitcoin e aumentar o nível de privacidade e anonimato dos utilizadores dessas moedas de Bitcoin. Consiste em juntar vários
inputs, gerar novas transacções onde esses
inputs se misturam uns com os outros e finalmente, gerar
outputs nos valores correctos para cada participante do
Coinjoin.
A Blockchain é uma base de dados transparente e que pode ser consultada por qualquer pessoa e, como tal, pode ser usada para análises complexas e, dessa forma, conseguir associar
addresses Bitcoin a pessoas inividuais ou empresas. Através da análise de padrões de utilização de
addresses de Bitcoin, montantes transferidos, carteiras usadas, IPs de nodes e muitas outras informações disponíveis, empresas de análise de dados como a Chainanalysis e outras, conseguem reduzir em grande escala a privacidade e o anonimato dos utilizadores de Bitcoin e isso é um problema grave.
Quando foi criado o Coinjoin?O
Coinjoin foi apresentado a 22 de Agosto de 2013 pelo
developer gmaxwell numa thread
aqui no bitcointalk.org. Nesta thread está detalhado o modo de funcionamento.
Como funciona um Coinjoin?Um Coinjoin consiste em que vários utilizadores concordem em usar este serviço e quantos mais utilizadores participarem no mesmo Coinjoin, maior será o nível de privacidade e anonimato para cada utilizador no final!
De referir que, quando vários utilizadores concordam em misturar os seus Bitcoins, não perdem, em momento algum, o controlo deles. Pelo contrário. Nas transações CoinJoin de Bitcoin as assinaturas de cada transacção permanecem independentes entre si, e apenas quando TODOS os participantes providenciarem cada uma das suas assinaturas é que o
Coinjoin poderá ser iniciado e terminado. Após cada uma das transacções ser assinada por cada participante, elas serão agrupadas numa só transacção Coinjoin, será feito o
broadcast e eventualmente aceite por um
miner e incluída num bloco. Na Blockchain aparecerá apenas uma transacção e será extremamente difícil conseguir perceber, mesmo para os participantes do Coinjoin, de onde vieram os Bitcoins para cada um!
O conceito pode ser explicado recorrendo à seguinte imagem:
(nota: este excerto foi traduzido de:
https://en.bitcoin.it/wiki/CoinJoin, sem recurso a AIs)
Uma transacção Bitcoin consome um ou mais
inputs e cria um ou mais
outputs.
Cada
input é um
output de uma transacção anterior. Por cada
input é criada uma assinatura (
scriptsig) distinta, de acordo com as regras especificadas no
output da transacção anterior que está a ser consumida (
scriptpubkey).
A rede Bitcoin é a responsável por certificar que as assinaturas estão correctas, que os
inputs existem e estão elegíveis para serem gastos, e que a soma dos
outputs é menor ou igual à soma dos
inputs (qualquer remanescente será considerado fees para os miners por terem incluído a transacção naquele bloco).
É normal que uma transacção gaste muitos
inputs para conseguir perfazer o valor a ser pago, criando eventualmente uma transacção adicional para efeitos de "troco" para receber de volta Bitcoin não gasto que não sejam
fees/taxas.
Não há qualquer obrigatoriedade que as scriptpubkeys dos
inputs usados sejam as mesmas, ou seja, não é obrigatório que sejam pagamentos para a mesma
address. E na realidade, quando Bitcoin é usado correctamnete com uma
address por transacção, nenhuma das
addresses será a mesma.
Quando consideramos a história da posse/propriedade de Bitcoin, podiamos olhar para transacções que gastam de várias scriptpubkeys distintas como uma co-união de propriedade e partir de um princípio: Como, de outra forma, podia uma transacção gastar de várias addresses a não ser que uma parte comum controlasse esses endereços?
Na imagem a cima, a "transacção 2" gasta moedas que foram assiandas por 1A1 e 1C3. Portanto, 1A1 e 1C3 serão necessariamente as mesmas pessoas?
Partir deste princípio é incorrecto. A utilização de uma transacção única não prova controlo em comum (embora assim o pareça), e isto é o que torna o
Coinjoin possível:
As assinaturas, uma por input, numa transacção são completamente independentes umas das outras. Isto significa que é possível aos utilizadores de Bitcoin em concordarem num conjunto de inputs para serem gastos, e num conjunto de outputs para serem pagos, e por fim, individualmente e separadamente, assinarem uma transacção e mais tarde juntar todas as assinaturas. A transacção não será válida nem será aceites pela rede até que todas as assinaturas sejam "apresentadas" e ninguém vai assinar transacções que não estejam correctas para cada um.
Para aumentar a privacidade, os N utilizadores acordariam quantiade de
output uniforme e forneceriam
inpus que correspondessem pelo menos a essa quantidade. A transacção teria N
outputs dessa quantidade e, potencialmente, mais N outputs de "troco" se alguns dos utilizadores fornecessem
inputs que excedessem o valor total. Todos assinariam a transacção e esta poderia então ser transmitida. Não há risco de roubo em momento algum.
Na figura a cima, a "transacção 2" tem entradas de 1A1 e 1C3. Digamos que 1A1 é um
address usado para Alice e 1C3 é um
address usado para Charlie. A que Alice e a Charlie pertencem quais das
outputs 1D e 1E?
(*fim de excerto)
Uma outra nota que convém referir é que
Coinjoin não garante 100% de anonimato. Mesmo com
Coinjoin continua a haver possibilidade de rastrear Bitcoins e levar a identificar pessoas ou empresas. No entanto, torna-se extremamente mais difícil conseguir tal proeza. Cabe a cada um de nós medir os pros e contras e perceber se compensa ou não.
Ainda convém também referir mais dois pontos que me parecem pertinentes que é o facto de ao aceitarmos fazer
Coinjoin com outras pessoas, podemos estar a misturar os nossos Bitcoins com Bitcoins usados em crimes e essa pode ser uma desvantagem pois podemos acabar com Bitcoins marcados ("tainted") mesmo após o
Coinjoin! É que o facto de termos Bitcoins "tainted" estamos a diminuir a fungibilidade desses Bitcoins.
Onde podemos fazer Coinjoin?Há várias implementações desta feature e algumas das mais comuns são as wallets que as têm incorporadas.
Exemplos:
Samurai Wallethttps://samouraiwallet.com/Wasabi Wallet
https://wasabiwallet.io/JoinMarkethttps://github.com/JoinMarket-Org/joinmarket-clientserverDIY CoinjoinMétodo manual qua usa os nossos nodes e requer comunicação com outros users com o mesmo interesse.
Deixo um link no final com um guide sobre Coinjoin da Bitcoin Magazine e um tutorial para esta opção manual de Coijoin.
Tanto a Samurai como a Wasabi Wallet oferecem serviços de Coinjoin automatizados e usam a tecnologia Whirlpool e cobram cerca de 0.2% do total de Bitcoin de fees pelo serviço e fees de rede.
Cada wallet implementa o Coinjoin da forma que melhor entende. A Samurai chamou à sua implementação "Whirlpool" e parte do princípio que os valores dos inputs são iguais e usa pools para cada valor. 0.1BTC, 0.2BTC, etc (são apenas exmeplos). Os outputs serão também todos iguais por forma a torná-los indiferenciáveis.
Já a Wasabi wallet implementa o Coijoin de forma mais complexa e permite inputs de valores distintos, sendo que no final, vão aparecer vários outputs iguais entre si, ou seja, vários outputs de 0.2BTC, vários de 0.3BTC, vários de outros valores, por forma a que o total dos outputs iguale o total dos inputs e que cada participante receba outputs iguais até perfazero valor com que entrou. Ou seja, se eu entrei com 1.5BTC, eu posso receber 4x 0.2BTC + 2x 0.1BTC + 1x 0.5BTC, por exemplo.
Guide e Tutorial da revista Bitcoin Magazine sobre
Coinjoin e DIY
Coinjoinhttps://bitcoinmagazine.com/technical/a-comprehensive-bitcoin-coinjoin-guideComo nota final, eu não sou nem fiquei expert em Coijoin com a criação desta thread e portanto, se forem necessárias correcções, estarei disponível para as fazer.