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

De Área31 Hackerspace
Revisão de 07h51min de 29 de abril de 2021 por Coffnix (discussão | contribs)
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

   Atenção:

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


Monero-wallet-cli

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


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!



   Dica:

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

./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:


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.[6]

   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:

Cookies nos ajudam a entregar nossos serviços. Ao usar nossos serviços, você concorda com o uso de cookies.