Atomic Swap - Bitcoin (BTC) vs Monero (XMR)
Responsável: * Raphael Bastos
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 criou 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
Como funciona
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.[5]
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:

Requisitos
Nunca utilize o usuário ROOT para compilar e/ou executar nada deste artigo
Monero-wallet-cli
Compile o monero-wallet-cli no Linux
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
Também é possível executar o monerod em background, utilizando o parâmetro --detach
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:
Crie novas carteiras na stagenet
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:
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.
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:
- ↑ https://www.forbes.com/sites/lukefitzpatrick/2019/09/02/a-complete-beginners-guide-to-atomic-swaps/?sh=5048f35f6178
- ↑ https://github.com/comit-network/grin-btc-poc/blob/master/spec.pdf
- ↑ https://github.com/comit-network/xmr-btc-swap
- ↑ https://docs.waves.tech/en/blockchain/blockchain-network/#connecting-node-to-blockchain-network
- ↑ https://github.com/comit-network/xmr-btc-swap/blob/master/docs/asb/README.md