Atomic Swap - Bitcoin (BTC) vs Monero (XMR)

De Área31 Hackerspace
Responsável:
* Raphael Bastos
Btc xmr.jpg


O que é uma Atomic swap

A Atomic swap, também conhecido como “troca atômica”, é uma troca de diferentes criptomoedas entre duas pessoas, realizada sem intermediários. Nesse tipo de troca, cada pessoa começa o processo de troca com suas moedas (BTC ou XMR) e somente dois desfechos são possíveis: ou a troca é realizada (quem tinha BTC fica com XMR e quem tinha XMR fica com BTC), ou a troca não é realizada.


História

A Atomic Swap foi introduzida pela primeira vez por Tier Nolan nos fóruns BitcoinTalk em 2013[1]. Nolan delineou os princípios básicos para trocas de criptomoedas de cadeia cruzada usando transações simples de criptomoedas em diferentes tipos de blockchains.

Em setembro de 2017, as trocas atômicas chamaram a atenção da comunidade hacker quando o fundador do Litecoin, Charlie Lee anunciou a execução bem-sucedida de uma troca atômica entre litecoin e bitcoin no Twitter .

Em 2018 Lucas Soriano e sua equipe criaram uma nova prova de conceito envolvendo Atomic Swap, provando que as trocas atômicas entre Grin[2] e Bitcoin eram possíveis. Em 2020 sua equipe nos abrilhantou com o novo conceito de Atomic Swap entre Monero[3] e Bitcoin. O objetivo do grupo é de conectar todas as blockchains existentes, e o foco do momento é o Monero pelo óbvio, a única criptomoeda com confiança dos seus usuários e completo anonimato dos valores transacionados.


Objetivos

  • Garantir que o software pode ser usado na mainnet[4] sem perda de fundos
  • Entender o melhor caso de uso para Atomic Swap entre Monero vs Bitcoin, e definir um produto que atenda ao referido caso de uso


Há muito tempo que a equipe se interessa pelo Monero, mas até recentemente presumíamos que as trocas atômicas envolvendo-o eram inviáveis ​​devido à falta de suporte para timelocks. Foi apenas através de uma apresentação de Joël Gugger (também conhecido como h4sh3d) no 36C3 que aprendemos que as trocas atômicas podem ser realizadas usando timelocks em apenas uma das duas cadeias.



Motivos

O Procurador-Geral dos Estados Unidos e a Receita Federal do país norte-americano declararam que colocarão as criptomoedas sob um escrutínio mais intenso.

Além disso, o Departamento de Segurança Interna dos EUA recentemente afirmou ter sido capaz de desmascarar usuários do Monero, embora isso tenha sido questionado pela comunidade[5]. Ainda assim, há uma recompensa de $625 mil[6] para quem conseguir quebrar o Monero.

Embora a conversão segura do Monero em moeda fiat ainda seja um obstáculo à privacidade, alguns usuários provavelmente estão vendo a moeda da privacidade como um refúgio de impostos ou aplicação da lei.

Da mesma forma, nos Estados Unidos, três executivos da BitMEX[7] foram recentemente acusados de operar ilegalmente uma exchange, e a China prendeu um executivo da OKEx[8] por causa de uma possível fraude. Isso causou uma pausa nas retiradas da exchange[9].

O Monero também virou alvo da Europol, que afirmou que a moeda é frequentemente usada para atividades criminosas.

Com muitos governos se abrindo para a ideia de CBDC (sigla em inglês para Moedas Digitais do Banco Central), é razoável esperar uma quebra de criptografia.


Qual problema o atomic swap resolve?

Atualmente, para realizar trocas entre duas moedas diferentes, ainda é necessário um terceiro, pois sempre há o risco de a pessoa que recebeu a primeira transferência fugir com o dinheiro recebido sem pagar a sua parte. Isso é especialmente problemático no mundo das criptomoedas, onde as transações são irreversíveis. Diversos relatos de fraudes desse tipo já foram descritos pelos usuários, seja em transações realizadas através da internet (o golpista recebe a sua parte e para de responder as mensagens), seja presencialmente (o golpista recebe a transação inicial em sua carteira e sai correndo pela rua).

Em função desse risco de golpe, atualmente a grande maioria das trocas de criptomoedas são realizadas através de intermediários. Os usuários costumam usar serviços centralizados (exchanges convencionais) ou serviços descentralizados com um árbitro intermediário (exchanges descentralizadas como a bisq ou OpenBazaar). Neste último caso, para evitar golpes, ambos os usuários depositam o dinheiro em um endereço multisig 2-de-3, cujas chaves privadas são controladas pelos dois usuários que estão trocando as moedas (Alice e Bob) e um árbitro que é de confiança de ambos os usuários. Para que a transação seja assinada em um endereço multisig 2-de-3, dois usuários precisam assinar a transação. Em condições normais, quando a troca ocorre dentro do esperado, quem assinará a transação será Alice + Bob. Nos casos em que houver uma disputa entre Alice e Bob, o árbitro fará o papel de intermediador, e criará uma transação com sua decisão final, que será assinada por Alice + árbitro ou Bob + árbitro.

Atomicswap.png


Como funcionará

Com o desenvolvimento do protocolo de atomic swap entre o Monero e o Bitcoin, os usuários dessas criptomoedas poderão trocar suas moedas livremente, diretamente de suas próprias carteiras, sem a necessidade de árbitros ou de exchanges intermediárias.

Como exemplo, vamos considerar dois usuários que querem trocar XMR por BTC. Alice tem XMR e quer trocar BTC, e Bob tem BTC e quer trocar por XMR. Ambos os usuários precisarão executar um programa que tenha suporte à troca atômica, como uma carteira, um aplicativo de uma exchange descentralizada ou um programa dedicado.

Em linhas gerais, a troca atômica ocorre da seguinte forma:

1- Os programas de Alice e Bob conectam-se e criam várias chaves e segredos compartilhados.

2- Um novo endereço Monero compartilhado é criado pelas carteiras dos usuários. Alice detém metade da chave privada deste endereço compartilhado, enquanto Bob detém a outra metade. Ambos os usuários possuem a chave de visualização deste endereço, então ambos conseguem ver quando um valor é depositado neste endereço Monero.

3- Bob envia BTC para um endereço especial, que suporta transações de reembolso.

4- Alice observa a blockchain do Bitcoin, e verifica que o BTC foi depositado.

5- Alice envia o XMR para o endereço Monero compartilhado com Bob.

6- Usando a chave de visualização do endereço Monero compartilhado, Bob verifica que o XMR foi depositado.

7- Bob envia a Alice uma parte da chave que permitirá que ela saque o Bitcoin.

8- Ao sacar o Bitcoin, Alice revela a Bob a metade que ela conhece da chave do endereço Monero compartilhado.

9- Bob usa as duas metades da chave privada e saca o seu Monero do endereço compartilhado.

Perceba que o Bitcoin é enviado antes do Monero ser enviado. Isso acontece pois o Monero ainda não suporta transações de reembolso. Essa funcionalidade é muito importante na troca atômica, pois caso Alice desista de trocar seus XMR por BTC após Bob ter realizado seu depósito no endereço Bitcoin, após decorrido um certo período de tempo, os BTC depositados por Bob serão reembolsados automaticamente para um endereço controlado por Bob.


swapCLI

swapCLI atua na função de Bob para trocar BTC por XMR. O comando principal é o buy-xmr que se conecta automaticamente a um serviço ASB.


ASB Service

ASB a abreviatura de Automated Swap Backend. O serviço atua como contraparte da swapCLI no papel de Alice. Ele fornece ao CLI uma cotação e a liquidez necessária para trocar BTC por XMR.[10]


Detalhes do funcionamento

Para entender melhor os diferentes componentes do ASB e swapCLI, aqui está um diagrama de componentes que mostra a configuração do ASB e da CLI usando a infraestrutura pública de Bitcoin e Monero:

Asb.png


Riscos para a privacidade

Na parte da blockchain do Bitcoin, haverá um pequeno risco de comprometimento da privacidade, pois qualquer observador externo poderá identificar que o usuário fez uma transação multisig.

Na parte da blockchain do Monero, não haverá riscos de privacidade, pois a quantia enviada na transação e os endereços do destinatário e do remetente são ofuscados por padrão.


Implicações futuras

Muitos usuários estão considerando a implementação do atomic swap como um divisor de águas no mundo das criptomoedas, pois qualquer usuário que possui Bitcoin poderá converter suas moedas para Monero, e vice-versa, sem precisar usar nenhum serviço de terceiros. Ou seja, mesmo que todas as exchanges do mundo sejam proibidas, e mesmo que as criptomoedas sejam proibidas, os usuários ainda poderão realizar trocas entre XMR e BTC, basta encontrar alguém disposto a fazê-las.


Privacidade para o Bitcoin

Os usuários do Bitcoin também se beneficiarão dos atomics swaps, pois poderão “limpar” o histórico de seus bitcoins, ao converterem inicialmente seus valores para Monero e, a seguir, após um decorrido um certo período de tempo, ao converterem seus valores novamente para Bitcoin em uma nova carteira local.

Idealmente isso deverá ser feito com um intervalo grande entre as transações BTC-XMR e XMR-BTC, pois uma análise dos valores na blockchain do BTC poderia deduzir que duas transações com a mesma quantia pertencem ao mesmo usuário. Opte sempre por enviar valores "picados" para carteiras diferentes, para garantir o completo anonimato.


Porta de entrada para o Monero

Além de servir como fonte adicional de privacidade para o Bitcoin, o Monero se beneficiará com os atomics swaps, pois muitos usuários usarão essa funcionalidade, e com isso conhecerão as vantagens do Monero.


Conclusão

Os atomics swaps permitirão que os usuários de Bitcoin e Monero troquem suas moedas entre si, sem intermediários, de uma maneira segura, sem riscos de fraudes, através de um preço previamente acordado entre as partes.

A transação realizada na rede Bitcoin provavlemente será identificável, ou seja, um observador externo saberá que uma transação foi feita para trocar determinadas moedas de Bitcoin por Monero.

A tecnologia será segura e benéfica para todos usuários. Os usuários do Bitcoin se beneficiarão com a privacidade do Monero, podendo retornar à rede Bitcoin quando acharem necessário. Os usuários do Monero se beneficiarão com os novos usuários de Bitcoin que conhecerão sua tecnologia de privacidade, podendo se tornar futuros usuários e investidores.[11]



Compilação e uso

   Atenção:

Nunca utilize o usuário ROOT para compilar e/ou executar nada deste artigo


Compile o monero-wallet-cli no Linux

   Importante:

Recomendamos o GCC 7 para compilar o monerod

user $ git clone --recursive https://github.com/monero-project/monero
user $ sudo mv monero /opt
user $ cd /opt/monero ; git submodule sync && git submodule update
user $ make -j13
   Dica:

Também é possível executar o monerod em background, utilizando o parâmetro --detach


Configurando rede privada de testnet Monero

Ter uma rede privada de testnet Monero pode ser muito útil, já que você pode brincar com o Monero sem correr o risco de cometer erros caros na rede real. Neste exemplo, isso é demonstrado de forma fácil e prática. Não irei ensinar como compilar ou resolver os problemas de compilação, leia o manual, estúpido!

./testnet/
├── node_01
│   ├── bitmonero.log
│   └── lmdb
│       ├── data.mdb
│       └── lock.mdb
├── node_02
│   ├── bitmonero.log
│   └── lmdb
│       ├── data.mdb
│       └── lock.mdb
├── node_03
│   ├── bitmonero.log
│   └── lmdb
│       ├── data.mdb
│       └── lock.mdb
├── wallet_01.bin
├── wallet_01.bin.address.txt
├── wallet_01.bin.keys
├── wallet_01.log
├── wallet_02.bin
├── wallet_02.bin.address.txt
├── wallet_02.bin.keys
├── wallet_02.log
├── wallet_03.bin
├── wallet_03.bin.address.txt
├── wallet_03.bin.keys
└── wallet_03.log

6 directories, 21 files


Crie o diretório ~/testnet:

user $ mkdir ~/testnet &&  cd  ~/testnet


Configuração dos nodes (monerod)

Inicie o primeiro node

O nó 01 ouvirá as conexões na porta 28080 e se conectará aos outros dois nós, ou seja, aqueles nas portas 38080 e 48080. Ele armazenará seu blockchain em ~/testnet/node_01. Vamos definir a mineração fixa com dificuldade em 100. Você pode alterá-la para o valor que quiser. Dessa forma, podemos manter os blocos de mineração mais rápido.

user $ DNS_PUBLIC=tcp://8.8.8.8 /opt/monero/build/Linux/master/release/bin/monerod --testnet  --no-igd --hide-my-port --data-dir ~/testnet/node_01 --p2p-bind-ip 127.0.0.1 --log-level 0 --add-exclusive-node 127.0.0.1:38080 --add-exclusive-node 127.0.0.1:48080  --fixed-difficulty 100


Inicie o segundo node

O nó 02 ouvirá conexões na porta 38080 e se conectará aos outros dois nós, ou seja, aqueles nas portas 28080 e 48080. Ele armazenará seu blockchain em ~/testnet/node_02. Definimos com a mesma dificuldade do primeiro nó.

user $ DNS_PUBLIC=tcp://8.8.8.8 /opt/monero/build/Linux/master/release/bin/monerod --testnet --p2p-bind-port 38080 --rpc-bind-port 38081 --zmq-rpc-bind-port 38082 --no-igd --hide-my-port  --log-level 0 --data-dir ~/testnet/node_02 --p2p-bind-ip 127.0.0.1 --add-exclusive-node 127.0.0.1:28080 --add-exclusive-node 127.0.0.1:48080 --fixed-difficulty 100


Inicie o terceiro node

O nó ouvirá as conexões na porta 48080 e se conectará aos outros dois nós, ou seja, aqueles nas portas 28080 e 38080. Ele armazenará seu blockchain em ~/testnet/node_03. Definimos com a mesma dificuldade do primeiro e segundo nó.

user $ DNS_PUBLIC=tcp://8.8.8.8 /opt/monero/build/Linux/master/release/bin/monerod --testnet --p2p-bind-port 48080 --rpc-bind-port 48081 --zmq-rpc-bind-port 48082 --no-igd --hide-my-port  --log-level 0 --data-dir ~/testnet/node_03 --p2p-bind-ip 127.0.0.1 --add-exclusive-node 127.0.0.1:28080 --add-exclusive-node 127.0.0.1:38080 --fixed-difficulty 100


Ex:

Monerodstagenet.png


Crie novas carteiras na testnet

Cada um dos nós terá uma carteira correspondente. Assim, criaremos as carteiras com os nomes wallet_01.bin, wallet_02.bin e wallet_03.bin. Esses arquivos estarão no diretório ~/testnet

Para a rede testnet, opte inicialmente por ter endereços fixos para cada carteira e nenhuma senha. A razão é que é muito mais fácil trabalhar com essas carteiras testnet durante a fase de entendimento da tecnologia.

Execute os seguintes comandos para criar três carteiras sem senha.

wallet_01.bin

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --generate-new-wallet ~/testnet/wallet_01.bin  --restore-deterministic-wallet --electrum-seed="sequence atlas unveil summon pebbles tuesday beer rudely snake rockets different fuselage woven tagged bested dented vegan hover rapid fawns obvious muppet randomly seasons randomly" --password "" --log-file ~/testnet/wallet_01.log;

Endereço e semente resultantes:

9wviCeWe2D8XS82k2ovp5EUYLzBt9pYNW2LXUFsZiv8S3Mt21FZ5qQaAroko1enzw3eGr9qC7X1D7Geoo2RrAotYPwq9Gm8
sequence atlas unveil summon pebbles tuesday beer rudely snake rockets different fuselage woven tagged bested dented vegan hover rapid fawns obvious muppet randomly seasons randomly

wallet_02.bin

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --generate-new-wallet ~/testnet/wallet_02.bin  --restore-deterministic-wallet --electrum-seed="deftly large tirade gumball android leech sidekick opened iguana voice gels focus poaching itches network espionage much jailed vaults winter oatmeal eleven science siren winter" --password "" --log-file ~/testnet/wallet_02.log;

Endereço e semente resultantes:

9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh
deftly large tirade gumball android leech sidekick opened iguana voice gels focus poaching itches network espionage much jailed vaults winter oatmeal eleven science siren winter

wallet_03.bin

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --generate-new-wallet ~/testnet/wallet_03.bin  --restore-deterministic-wallet --electrum-seed="upstairs arsenic adjust emulate karate efficient demonstrate weekday kangaroo yoga huts seventh goes heron sleepless fungal tweezers zigzags maps hedgehog hoax foyer jury knife karate" --password "" --log-file ~/testnet/wallet_03.log;

Endereço e semente resultantes:

A2rgGdM78JEQcxEUsi761WbnJWsFRCwh1PkiGtGnUUcJTGenfCr5WEtdoXezutmPiQMsaM4zJbpdH5PMjkCt7QrXAhV8wDB
upstairs arsenic adjust emulate karate efficient demonstrate weekday kangaroo yoga huts seventh goes heron sleepless fungal tweezers zigzags maps hedgehog hoax foyer jury knife karate


Após criar, surgirá uma imagem parecida com o exemplo abaixo. Pode encerrar as carteiras, iremos falar mais delas posteriormente:

Wallet-03.png


Comece a minerar

Como você minera é totalmente opcional. Você pode minerar apenas a primeira carteira e manter as outras duas vazias por enquanto, ou minerar em dois nós, ou em todos os três.

Utilize os seguintes comandos para minerar as duas primeiras carteiras:

Digite no minerd do node_01 (mineração da primeira carteira):

start_mining  9wviCeWe2D8XS82k2ovp5EUYLzBt9pYNW2LXUFsZiv8S3Mt21FZ5qQaAroko1enzw3eGr9qC7X1D7Geoo2RrAotYPwq9Gm8 1

Digite no minerd do node_02 (mineração da segunda carteira):

start_mining  9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh 1

Digite no minerd do node_03 (mineração da primeira carteira):

start_mining  9wviCeWe2D8XS82k2ovp5EUYLzBt9pYNW2LXUFsZiv8S3Mt21FZ5qQaAroko1enzw3eGr9qC7X1D7Geoo2RrAotYPwq9Gm8 1

Como você pode notar, tanto node_01 quanto node_03 mineram para a primeira carteira. A terceira carteira não é usada para mineração neste exemplo. A razão é que receberá XMR, por transferência, das restantes carteiras.

Inicie as carteiras

wallet_01:

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --trusted-daemon --wallet-file ~/testnet/wallet_01.bin --password '' --log-file ~/testnet/wallet_01.log

wallet_02:

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --daemon-port 38081 --trusted-daemon --wallet-file ~/testnet/wallet_02.bin --password '' --log-file ~/testnet/wallet_02.log

wallet_03:

user $ /opt/monero/build/Linux/master/release/bin/monero-wallet-cli --testnet --daemon-port 48081 --trusted-daemon --wallet-file ~/testnet/wallet_03.bin --password '' --log-file ~/testnet/wallet_03.log


Fazendo transferências

Blocos recém-minerados exigem a confirmação de pelo menos 60 blocos antes de serem usados. Portanto, antes que você possa fazer qualquer transferência entre as carteiras precisamos minerar pelo menos 60 blocos. Até então, as carteiras serão unlocked balance igual a 0. Em contraste, para que as transferências regulares entre carteiras sejam desbloqueadas, são necessários 10 blocos.


Explorador privado testnet blockchain

O onion-monero-blockchain-explorer do branch devel pode ser utilizado para explorar o seu blockchain privado.[12]

   Importante:

Recomendamos o GCC 9 para compilar o xmrblocks


user $ git clone https://github.com/moneroexamples/onion-monero-blockchain-explorer.git
user $ cd onion-monero-blockchain-explorer
user $ sudo mv monero /opt
user $ cd /opt/monero ; git checkout devel ; git submodule sync && git submodule update
user $ mkdir build && cd build ; cmake -DMONERO_DIR=/opt/monero ..
user $ make -j13
user $ ./xmrblocks -t -p 9999 -b /home/mwo/testnet/node_01/testnet/lmdb/ --no-blocks-on-index 50 --enable-as-hex  --enable-pusher


Referências: