Atomic Swap - Bitcoin (BTC) vs Monero (XMR): mudanças entre as edições

De Área31 Hackerspace
Sem resumo de edição
Sem resumo de edição
Linha 18: Linha 18:




=Como funciona=
=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:
 
Os programas de '''Alice''' e '''Bob''' conectam-se e criam várias chaves e segredos compartilhados.
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.
'''Bob''' envia BTC para um endereço especial, que suporta transações de reembolso.
'''Alice''' observa a blockchain do Bitcoin, e verifica que o BTC foi depositado.
'''Alice''' envia o XMR para o endereço Monero compartilhado com '''Bob'''.
Usando a chave de visualização do endereço Monero compartilhado, '''Bob''' verifica que o XMR foi depositado.
'''Bob''' envia a '''Alice''' uma parte da chave que permitirá que ela saque o Bitcoin.
Ao sacar o Bitcoin, '''Alice''' revela a '''Bob''' a metade que ela conhece da chave do endereço Monero compartilhado.
'''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==
'''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.
'''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.

Edição das 20h11min de 29 de abril de 2021

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

Os programas de Alice e Bob conectam-se e criam várias chaves e segredos compartilhados. 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. Bob envia BTC para um endereço especial, que suporta transações de reembolso. Alice observa a blockchain do Bitcoin, e verifica que o BTC foi depositado. Alice envia o XMR para o endereço Monero compartilhado com Bob. Usando a chave de visualização do endereço Monero compartilhado, Bob verifica que o XMR foi depositado. Bob envia a Alice uma parte da chave que permitirá que ela saque o Bitcoin. Ao sacar o Bitcoin, Alice revela a Bob a metade que ela conhece da chave do endereço Monero compartilhado. 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.[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
   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:


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.