jump to navigation

A Revolução do Blockchain 2 de Abril de 2018

Posted by Rafael in Uncategorized.
add a comment

O que Matrix, Guerra nas Estrelas e De Volta para o Futuro tem a ver com Blockchain? Descubra lendo meu artigo na revista iMasters número 25:

Anúncios

Tempo de confirmação de uma transação Bitcoin: parte 3 27 de Dezembro de 2017

Posted by Rafael in Transações Eletrônicas.
2 comments

A área de comentários de meus artigos sobre o tempo de confirmação de transações Bitcoin anda bem movimentada. Infelizmente muita gente está tendo problemas com transações paradas na fila por taxa insuficiente, ou carteiras que não atualizam após receber transações. Por isso, decidi escrever esse post para servir de guia para quem está com problemas.

Primeiro, se você chegou aqui pedindo ao Google para te salvar dessa enrascada, recomendo a leitura desses três artigos anteriores:

Artigo 1

Artigo 2

Artigo 3

Pronto, agora que você é uma pessoa entendida no assunto, vamos ao que está acontecendo. No artigo 3 eu comparo a rede Bitcoin a um sistema de leilão de passagens aéreas, pois em aviões os assentos são obviamente limitados, assim como os blocos tem limite de um megabyte. No cenário de capitalismo selvagem que delineio, quem oferece mais na fila de embarque, viaja; enquanto os outros esperam outros vôos com o suado dinheirinho na mão esperando um momento sem tantos ricos para te empurrar ao fim da fila do embarque. Economicamente essa ideia é até interessante, pois aloca os recursos finitos aos que mais os valorizam, porém não é nada simpático e pode, em um cenário extremo, claramente gerar uma horda de desafortunados que jamais viajarão.

Outro problema da forma que o Bitcoin funciona é que você tem que decidir a tarifa que você vai ofertar à companhia aérea (a taxa de transação) PREVIAMENTE, usando dados das tarifas médias de vôos passados. Com isso, sua “viagem” corre o risco de não ocorrer se uma excursão enorme de ricos aparecer de supetão no saguão do aeroporto pagando muito mais que você por um assento no avião.

Bitcoin: Um aeroporto no fim de ano com nevasca…

images

Pois, é, o imbróglio é justamente esse. O Bitcoin tornou-se muito popular e há excesso de transações na rede, gerando atrasos e aumento de taxas. Nesse momento, há mais de 170.000 transações na fila esperando para ser confirmadas, e a média de taxas por transação está em 40 dólares, Então, acabou a época em que podíamos brincar de mandar 1 dólar em Bitcoin para seu amigo para mostrar o funcionamento do protocolo.

E como a comunidade está se movimentando para resolver o problema? Na metáfora que uso, a companhia aérea rapidamente compraria uma frota de A380s para atender a demanda que parece que chegou para ficar, ou aumentaria a frequência dos vôos. Afinal, aviões (blocos) estão absolutamente abarrotados e há uma insatisfação generalizada no saguão onde 170.000 passageiros esperam por uma oportunidade para viajar.

Porém, as alterações no protocolo do Bitcoin são muito complicadas, pois não há autoridade central. Isso gerou uma interminável discussão com ânimos acirrados sobre como aumentar a capacidade da rede, da qual não emitirei minha opinião para não transformar a minha pacífica área de comentários em um ringue de luta livre. Porém, assim como em uma economia aberta, novas “companhias aéreas” abriram as portas para atender essa turma, os chamados “forks” do Bitcoin. O mais famoso deles é o Bitcoin Cash (BCH), que aumenta o tamanho máximo do bloco para 8 megabytes. Com “aviões” 8 vezes maiores, a rede do Bitcoin Cash tem maior capacidade para processar transações.

Nesse momento, minha metáfora não é perfeita, pois os “passageiros” (transações) da rede Bitcoin NÃO podem viajar em aviões (“blocos”) Bitcoin Cash diretamente. Os valores em Bitcoin devem ser convertidos para Bitcoin Cash (ou qualquer outra criptomoeda) previamente, pagando a alta taxa de transação, para somente nesse momento, poder ser transferido em outra rede.

E como faço essa conversão? Bom, você pode usar uma corretora e trocar seus Bitcoins com outro usuário, ou a Shapeshift, que permite a troca de criptomoedas. Nela, você escolhe a moeda que você enviará e o endereço de destino da outra moeda que você deseja receber, a corretora te mostrará a taxa de conversão e um endereço para você enviar seus Bitcoins. Se tudo der certo, a quantidade equivalente na moeda de final chegará no seu endereço de destino.

AVISO: Não existe nada 100% seguro, use por conta e risco.  Em caso de problema, fale diretamente com a Shapeshift. 

A grande pergunta agora é se as pessoas que converterem seus Bitcoins para outra criptomoeda para escapar das altíssimas taxas voltarão para o Bitcoin. Se esse êxodo realmente se confirmar, o Bitcoin poderá perder seu título de a criptomoeda mais importante desse mercado. Apenas uma divagação.

Ok, li até aqui, onde estão as soluções???

Bom, não há muita esperança de solução a curto prazo na rede Bitcoin. Recentemente foi ativada uma funcionalidade chamada Segwit que supostamente duplicaria a capacidade dos blocos separando as assinaturas em outra estrutura de dados, porém não parece estar fazendo muita diferença.

Uma das novidades recentes é a capacidade de aumentar a taxa de transação depois de enviada à rede, o chamado Replace-By-Fee (RBF), ou seja, enviar uma nova transação com uma taxa mais adequada à realidade da rede. Eu já havia citado a técnica nesse artigo, porém a novidade é que a funcionalidade está cada vez mais aceita pelos mineradores e em carteiras. Lembro que a transação original deve ter sido marcada como “replaceable”. Isso é feito na carteira que gera a transação ANTES de seu envio. 

Caso isso não seja possível, só resta esperar que sua transação seja “esquecida” pela rede. Apesar de existir um parâmetro que configura o tempo de vida de transações na memória de mineradores, essa configuração não é confiável, pois outros nós podem retransmitir essa transação, evitando que ela expire. No Bitcoin Core 0.14, a configuração padrão desse parâmetro é 2 semanas.

Agora se o problema for Bitcoins que não aparecem na carteira após confirmações, cito as possíveis causas. As carteiras podem não atualizar corretamente com uma transação recebida, nesse caso, um “resync“, ou seja uma sincronização nova pode resolver. Isso pode demandar a reinstalação, nesse caso, lembre-se de anotar suas chaves. 

Agora se você está usando uma carteira online, entre em contato com o suporte.

Finalmente, confira os endereços usados. Qualquer erro na digitação do endereço ou escolha da rede errada (como Bitcoin Cash para enviar Bitcoins, nas carteiras que suportam) será problema na certa.

Notas finais

Para finalizar, vou dar algumas dicas de como saber se sua transação está com a taxa adequada ou não. A primeira coisa que se deve fazer é descobrir a taxa de transação que foi definida por sua carteira. Para isso, procure o hash da transação no site blockchain.info. Na página com detalhes da transação, você pode achar esse valor no quadro de Inputs and Outputs:

images

No exemplo acima, a taxa usada foi 2.027,436 sat/byte. Essa transação específica pagou 260 dólares de taxa pelo valor do Bitcoin hoje. Lembra do endinheirado turista que entrou na sua frente para viajar primeiro? Olha ele aí! 🙂

images

Bom, mas que taxa devo usar? 260 dólares não vai dar, não sou o Tio Patinhas!! Bom, se você não está esbanjando como nosso amigo aí e sua carteira permite a escolha das taxas (algumas carteiras online não te dão esse “privilégio”), analise as taxas médias em sites que mostram estatísticas da rede, como o bitcoinfees.earn.com. Esse site serve também para você ter uma ideia da situação de uma transação já enviada. A partir de uma taxa de mineração, ele te mostrará uma estimativa de tempo de espera em blocos e minutos para a transação ser confirmada. E no fim da página, ele informa a taxa atual segura para sua transação. Inf significa infinito, ou seja, que transações com essa taxa podem nunca confirmar.

images

(…)

images

No momento da escrita desse artigo, a taxa adequada era 760 sat/byte, não significa que no momento da leitura estará assim. Entre no site e veja a situação atual.

Finalmente, desejo boa sorte a todos que viajarão nesse fim de ano. Espero que os aviões estejam mais baratos que fazer uma transação com Bitcoin.

Dúvidas, comentários, tem 25 dólares em Bitcoins que vão custar 40 para gastar? Deixe seu lamento no campo de comentário.  🙂

UPDATE 28/12/2018

Apelando para a caridade!

Um rápido update que esqueci de citar: Alguns grupos de mineração possuem um link para os infelizes com transações paradas pedirem uma “caridade” para suas transações serem confirmadas. O sistema prioriza as transações dos mendigos usuários que solicitarem uma vaga no bloco mesmo sem ter pago a tarifa suficiente. O serviço é gratuito, por isso chamei de caridade. Não custa tentar pedir uma ajudinha.

Segue aqui o link do VIABTC Transaction Accelerator. 

Como até caridade tem limite, há limite do espaço em bloco que eles estão disponibilizando no acelerador. Então, você deve ter paciência para solicitar, pois muitas vezes o limite de transações priorizadas já foi excedido, tem que ficar tentando.

E se a taxa de transação for extremamente baixa, nem eles vão ajudar. Nesse caso, só rezando mesmo ou esperando a transação ser esquecida.

 

Ethereum: Iniciando uma rede privada com múltiplos nós 31 de Outubro de 2017

Posted by Rafael in Uncategorized.
add a comment

Em complemento ao artigo “Criando um nó privado Ethereum”, tratarei agora de como criar uma REDE Ethereum composta por vários nós. Dessa vez utilizarei a versão 1.7.2-stable-1db4ecdc, a carteira (Ethereum Wallet) versão 0.9.2 e o sistema operacional Ubuntu 16.04.

Os princípios básicos são os mesmos com algumas alterações, conforma abaixo:

Passo 1: Instalar o geth E as ferramentas adicionais

Baixe o arquivo que contém o executável do nó Ethereum escrito em GO e as ferramentas adicionais que precisaremos para montar a rede. O arquivo específico utilizado foi “geth-alltools-linux-amd64-1.7.2-1db4ecdc.tar.gz”.

Após o download do arquivo, entre no diretório onde o arquivo foi gravados e execute os seguintes comandos como superusuário para descompactá-lo e movê-lo para o /usr/bin:

$ gunzip geth-alltools-linux-amd64-1.7.2-1db4ecdc.tar.gz
$ cd geth-alltools-linux-amd64-1.7.2-1db4ecdc/
$ mv bootnode /usr/bin/
$ mv geth /usr/bin/

Se não houve nenhum erro, o comando “geth version” deve retornar:

Geth
Version: 1.7.2-stable
Git Commit: 1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9
Operating System: linux
GOPATH=
GOROOT=/usr/local/go

Pronto, a implementação do Ethereum na linguagem GO está instalada na máquina virtual.

Passo 2: Instalar a carteira Ethereum

Novamente não usei o instalador. O arquivo utilizado foi “Ethereum-Wallet-linux64-0-2-2.zip”. Novamente, no diretório onde o arquivo está gravado, execute o comando abaixo substituindo <diretório de destino> pelo diretório onde você deseja armazenar os arquivos da carteira:

unzip Ethereum-Wallet-linux64-0-9-2.zip -d <diretório de destino>

Pronto, no <diretório de destino> há diretório “linux-unpacked” onde está o binário para executar a carteira Ethereum: “ethereumwallet”.

Passo 3: Criando o blockchain privado

Primeiro crie um diretório para armazenar o blockchain. No exemplo, usarei o /home/user/privatenet. Navegue até esse diretório e crie o arquivo JSON (usarei genesis.json nesse exemplo) com os parâmetros de seu bloco genesis customizado. Abaixo detalho um exemplo de bloco genesis, já com parâmetros obrigatórios nas novas versões:

{
"config": {
 "chainId": 15,
 "homesteadBlock": 0,
 "eip155Block": 0,
 "eip158Block": 0
 },
 "nonce": "0x0000000000000042",
 "timestamp": "0x00",
 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "extraData": "0x00",
 "gasLimit": "0x8000000",
 "difficulty": "0x0400",
 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "coinbase": "0x3333333333333333333333333333333333333333",
 "alloc": {
 }
}

Salve esse arquivo e guarde seu nome, pois ele será parâmetro para o “geth”.

Agora execute o seguinte comando:

geth --datadir /home/user/privatenet/chain/ init ./genesis.json

O resultado esperado é:

hain/ init ./genesis.json
WARN [10-31|12:21:30] No etherbase set and no accounts found as default 
INFO [10-31|12:21:30] Allocated cache and file handles database=/home/rsarres/privatenet/chain/geth/chaindata cache=16 handles=16
INFO [10-31|12:21:30] Writing custom genesis block 
INFO [10-31|12:21:30] Successfully wrote genesis state database=chaindata hash=6650a0…b5c158
INFO [10-31|12:21:30] Allocated cache and file handles database=/home/rsarres/privatenet/chain/geth/lightchaindata cache=16 handles=16
INFO [10-31|12:21:30] Writing custom genesis block 
INFO [10-31|12:21:30] Successfully wrote genesis state database=lightchaindata hash=6650a0…b5c158

Repita esse processo em cada nó que você está preparando. Se você quiser rodar dois ou mais nós Ethereum na mesma VM, você deve usar diretórios para armazenar o blockchain diferentes (por exemplo, /home/user/privatenet/chain2/) e repetir os mesmos passos.

Passo 4: Criando o endereço coinbase

Aqui há uma mudança, vamos criar a conta por linha de comando para facilitar.

$ geth --datadir /home/rsarres/privatenet/chain/ account new
WARN [10-31|12:32:03] No etherbase set and no accounts found as default 
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat passphrase: 
Address: {<ENDEREÇO ETHEREUM>}

O novo endereço criado aparecerá na última linha. Bem mais fácil, não é? Nota-se que não sou muito bom em fazer as coisas do jeito mais simples. 🙂

Repita esse passo em cada nó que você está criando.

Passo 5: Crie a chave do Bootnode

O Ethereum usa o conceito de “nós de boot”, ou bootnodes com o intuito de servir de ponto de encontro para os demais nós. Como nossa rede é privada, precisamos criar um bootnode específico e a chave do bootnode que os demais nós usarão para se conectar:

$ bootnode -genkey bootnode.key

Passo 6: inicie o Bootnode

Com essa chave criada e gravada no arquivo bootnode.key, podemos iniciar o bootnode:

$ bootnode -nodekey bootnode.key
INFO [10-31|12:53:55] UDP listener up self=enode://<ENODE ID>@[::]:<PORTA>

Note que o seu enode ID será um conjunto de caracteres que deriva do bootnode key criado anteriormente. Você precisará dessa informação (enode://<ENODE ID>@[<IP>]:<PORTA>) para iniciar a rede. Lembre-se de alterar [::] para o endereço IP do bootnode.

Passo 7: Inicie os nós da rede

O comando para iniciar cada nó Ethereum usando o bootnode para encontrar os demais nós é:

geth --bootnodes "enode://<ENODE ID>@[::]:<PORTA>" --networkid 15 --datadir /home/user/privatenet/chain --mine --minerthreads 1 --etherbase "COLE AQUI O ENDEREÇO DE MINERAÇÃO"

Preste atenção nos parâmetros que você deve substituir nesse comando, que são:

  1. O enode ID, criado no passo 6
  2. O endereço etherbase, criado no passo 4
  3. O endereço IP do bootnode

Se você estiver rodando vários nós na mesma VM, acrescente o parâmetro –port <NÚMERO DE PORTA> e escolha uma porta diferente, caso contrário, o segundo nó não subirá porque haverá conflito de bind de porta TCP na inicialização.

Passo 8: Teste a comunicação entre os nós

Em cada um dos nós, execute o comando de conexão direta:

$ geth attach ipc:./privatenet/chain/geth.ipc

O resultado esperado é:

Welcome to the Geth JavaScript console!

instance: Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9
coinbase: 0x3b0061931126984d2a02aacb09810d0c1cfd28e8
at block: 218 (Tue, 31 Oct 2017 13:20:28 BRST)
 datadir: /home/rsarres/privatenet/chain
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

Agora dê os comandos para verificar se você está comunicando corretamente com os outros nós:

> admin.peers

Esse comando listará os nós conectados. Se o resultado for [], o seu nó está sozinho na rede. Caso contrário, informações dos demais nós aparecerão.

Para saber se todos os nós estão sincronizados, um comando útil é:

> eth.blockNumber

Esse comando retorna o número do bloco mais recente, e deve ser igual em um dado momento em todos os nós que participam da rede. Ou seja, todos os nós devem estar trabalhando no mesmo blockchain. Para ter certeza que todos estão na mesma cadeia, outro comando útil é:

> eth.getBlock(1)

onde 1 pode ser substituído por qualquer outro número de bloco da cadeia. Todos os nós devem retornar as mesmas informações se consultados por um bloco específico, essa comparação garante que todos estão atualizando o mesmo blockchain.

Agora é só conectar a carteira (Wallet) em qualquer nó e interagir com o blockchain. Um bom teste é realizar atualizações no blockchain em um nó (como envio de ethers) e ver se os demais  atualizam seu estado.

Boa sorte.

Não funcionou? Deu pau? Não entendeu nada? Deixe um comentário.

Positioning report do Banco Central do Brasil sobre a Tecnologia de Registro Distribuído 6 de Setembro de 2017

Posted by Rafael in Transações Eletrônicas.
add a comment

Para quem gosta do assunto, compartilho o documento que publicamos no Banco Central do Brasil sobre a Tecnologia de Registro Distribuído, ou blockchain como tem sido chamado. Esse documento faz uma análise do potencial e problemas que encontramos no desenvolvimento de protótipos em diversas plataformas.

O documento pode ser encontrado no link abaixo:

http://www.bcb.gov.br/htms/public/microcredito/Distributed_ledger_technical_research_in_Central_Bank_of_Brazil.pdf

 

Tempo de confirmação de uma transação Bitcoin: parte 2 15 de Maio de 2017

Posted by Rafael in Uncategorized.
97 comments

Como parece que a área de comentários de meu post sobre o tempo de confirmação de uma transação bitcoin virou uma filial do help-desk  das corretoras de criptomoedas, decidi escrever esse post curto para tentar explicar melhor o que ocorre quando realizamos uma transferência de bitcoins.

O primeiro passo na transferência de bitcoins é a criação da transação, que é um conjunto transações de entrada (“input txs“) e transações de saída (“output txs“). Esse processo ocorre completamente na estação do usuário remetente que gera uma sequência de dados identificando a transação ou as transações de origem. As transações de entrada são compostas por transações de saída de transferências passadas endereçadas anteriormente para o remetente, mas que ainda não foram usadas como entrada em outra transação. Essas transações são chamadas de UTXOs (Unspent Transaction Output). Uma analogia que costumo fazer é comparar as transações UTXOs com cédulas de real em uma carteira física. Essas cédulas foram recebidas em um momento passado (uma transação anterior), mas nunca foram gastas, por isso permanecem em sua carteira.

Quando vamos pagar algum bem usando cédulas de real, buscamos em nossa carteira cédulas cuja somatória seja igual ou superior ao valor do bem sendo negociado. Uma carteira bitcoin faz o mesmo processo, pois quando ela apresenta quantos bitcoins você possui, na verdade ela está somando todas as UTXOs que são endereçadas a você que estão gravados no blockchain ( suas “cédulas”).

Como muitas vezes acontece, nenhuma combinação das cédulas de real que temos na carteira forma exatamente o valor do produto que estamos adquirindo. Assim, a carteira acrescenta uma nova transação de saída retornando o valor excedente para o remetente, o tão conhecido “troco”.

Hora de assinar o cheque

Depois que as UTXOs que serão usadas em uma transferência foram selecionadas, a carteira cria a transação adicionando assinaturas digitais que permitem o uso de cada UTXO. Isso garante que somente o dono da chave privada que é o par da chave pública que foi usada para derivar o endereço bitcoin pode transferir seu valor.

Nesse momento nossa transferência está composta com um conjunto de entradas (UTXOs) e um conjunto de saídas, todas com uma quantidade de bitcoins definida. Essa transferência é enviada a um ou mais mineradores, que a propagarão até que cheguem a todos os mineradores. Obviamente a soma das entradas deve ser maior ou igual à soma das saídas, caso contrário seria um “cheque sem fundos” e o minerador a descartaria. Porém, se o valor das entradas for maior que a soma das saídas, temos um excedente na transação. Esse excedente geralmente é confundido por meus alunos pelo troco, mas não é. Lembrem, o troco é uma transação de saída adicional.

Afinal, o que ocorre com os bitcoins excedentes que você envia em uma transação?

A taxa de transação

Esse excedente é a parte importante no entendimento do tempo de transação. Todo bitcoin que é usado como entrada em uma transação, mas não é consumido pelas saídas é considerado “taxa de transação” (“tx fee“). Esse valor será coletado pelo minerador que processar o bloco com essa transação inserida. Esse excedente não é obrigatório pelo protocolo, mas veremos que atualmente é obrigatório para ter sua transação processada.

Nesse momento já conseguimos ver que há um incentivo econômico para os mineradores processarem transações com a maior taxa de transação possível. Como os blocos são atualmente limitados a um megabyte, o espaço nos blocos é escasso frente a atual demanda por processamento de transações, gerando um congestionamento na rede. As transações “paradas no engarrafamento” permanecem em um buffer chamado MEMPOOL até que sejam selecionadas e incluídas em um bloco.

Essa situação é análoga ao preço das passagens aéreas durante as festividades de fim de ano. Como há muita gente querendo viajar e o espaço nos aviões é obviamente limitado, o preço das passagens sobe. Em um cenário de capitalismo puro, as companhias aéreas realizariam leilões dos assentos dos vôos, alocando os passageiros com maiores lances primeiro nos assentos e seguindo a lista de lances de forma decrescente, até completar o avião. Isso certamente maximizaria seus lucros. Felizmente ainda não chegamos ao ponto.

Porém, essa é exatamente a forma como os mineradores trabalham. Ao criar um bloco para iniciar o processamento, os mineradores selecionam as transações com maior taxa de processamento em seu MEMPOOL primeiro. Logo, se uma transação possui uma taxa de transação muito baixa (ou até zero), ela estará constantemente sendo ultrapassada por transações que pagam mais caro pelo precioso espaço no bloco. Essa situação pode levar ao ponto de uma transação nunca ser processada e acabar sendo descartada pelo minerador ao reiniciar o software de mineração.

Essa é a triste realidade de um cenário de capitalismo puro. Imaginem essa situação ocorrendo com vagas em hospitais ou escolas. Nesse momento identificamos que o capitalismo absolutamente desenfreado não é desejável, mas estou divagando…. De volta ao assunto.

Que taxa de transação devo usar?

Como tudo no mercado, o preço das coisas varia. Um assento de avião pode ter um valor elevado no Natal e ser vendido por poucos reais em épocas de pouco movimento. O mesmo ocorre com as taxas de transação no bitcoin. Para saber as taxas vigentes, o remetente pode consultar sites como Bitcoinfees. Normalmente as carteiras são espertas ao escolher uma taxa de transação adequada e algumas vezes permitem até uma escolha do usuário dependendo da urgência, mas erros ocorrem. Se sua carteira vive errando a taxa correta, tente trocar de software.

Enviei uma transferência com taxa de transação muito baixa, e agora?

Não se preocupe porque você não perderá seus bitcoins. Na verdade, a única coisa que ocorrerá é que eles não sairão do lugar. A primeira coisa que um remetente sempre deve realizar é anotar o identificador de toda transação que ele cria. Assim ele pode acompanhar se a transação foi processada ou ainda está na fila consultando sites como blockchain.info. Se sua transação está há muito tempo sem ser processada, você pode tentar criar uma nova transação semelhante realizando as mesmas transferências, porém com uma taxa de transação superior. Essa técnica é chamada de full replace-by-fee. Quando a nova transação for recebida, ela sobrescreverá a transação anterior e ainda pendente porque a antiga entra em conflito com a nova transação, caracterizando uma tentativa de double-spending.

Esse envio de uma nova transação tem uma desvantagem: Nem todos os mineradores aceitam Full Replace-By-Fee porque isso pode complicar a vida de usuários da rede bitcoin que consideram transações não-confirmadas para algum fim. Isso significa que mineradores que não aceitam a técnica vão descartar a segunda transação enviada logo no recebimento, mesmo que ela tenha uma taxa de transação maior, porque ela tenta usar os mesmos UTXOs que uma transação já no MEMPOOL, caracterizando uma tentativa de double-spending. Não tenho informação sobre a parcela de mineradores que a suporta, mas parece ser baixa. É importante frisar que muitas carteiras não aceitam essa técnica.

Outra forma de tentar acelerar uma transação presa no horário de rush é Child Pays for Parent. Essa técnica é mais complicada e consiste em criar uma nova transação gastando o troco da transação no MEMPOOL com uma taxa de transação alta. Como alguns mineradores não avaliam taxas de transações individuais, mas de grupos de transações, uma transação seguinte com alta taxa torna ambas as transações atrativas. De novo, isso não é padronizado entre os mineradores, mas parece ser bem suportada.

A última técnica chama-se Opt-In Replace-by-Fee e depende da transação original ter sido criada com essa sinalização. Mineradores que suportam essa técnica identificarão transações enviadas com essa sinalização e permitirão que transações futuras com taxas maiores a sobrescrevam. Parece ser a mais aceita na rede.

Nada funcionou, e agora?

Bom, agora você espera a rede “esquecer” sua transação. Não é comum, mas pode ocorrer porque se um nó reinicia, ele retorna sem transações na MEMPOOL. Claro que ele pode sempre receber as transações no MEMPOOL de outros nós, mas pode realmente ocorrer de uma transação ser “esquecida”.

Dúvidas, perguntas, sua transação está presa no engarrafamento? Relaxe, leia um bom livro e, se quiser, abra um ticket no help-desk…, er, digo um comentário no botão abaixo.

 

Criando um nó privado Ethereum – Atualização 17 de Abril de 2017

Posted by Rafael in Uncategorized.
7 comments

Como esse ambiente de blockchain e criptomoedas é atualizado muito rápido, meu tutorial para a criação de um nó privado Ethereum já possui algumas falhas devido a atualizações dos programas utilizados. Assim, resolvi criar um novo post com um novo tutorial para auxiliar meus alunos e entusiastas no assunto.

Ambiente

O ambiente utilizado com os links para download segue abaixo:

  1. Ubuntu 16.04 virtualizado em VirtualBox. O sistema operacional do host não importa, mas a título de curiosidade foi utilizado Windows 7.
  2. A implementação do Ethereum utilizada (node) é o Geth 1.6.0.
  3. A carteira para interagir com o node: Ethereum Wallet 0.8.9.

Passo 1: Instalar o geth

Nesse tutorial não usei o instalador do Geth, mas o binário compilado e compactado. O arquivo específico utilizado foi “geth-linux-amd64-1.6.0-facc47cb.tar.gz”.

Após o download do arquivo, entre no diretório onde o arquivo foi gravados e execute os seguintes comandos como superusuário para descompactá-lo e movê-lo para o /usr/bin:

gunzip geth-linux-amd64-1.6.0-facc47cb.tar.gz 
tar -xvf geth-linux-amd64-1.6.0-facc47cb.tar 
cd geth-linux-amd64-1.6.0-facc47cb/
mv geth /usr/bin/geth

Se não houve nenhum erro, o comando “geth version” deve retornar:

Geth
Version: 1.6.0-stable
Git Commit: facc47cb5cec97b22c815a0a6118816a98f39876
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.8.1
Operating System: linux
GOPATH=
GOROOT=/usr/local/go

Pronto, a implementação do Ethereum na linguagem GO está instalada na máquina virtual.

Passo 2: Instalar a carteira Ethereum

Novamente não usei o instalador porque instalador é coisa de amador. O arquivo utilizado foi “Ethereum-Wallet-linux64-0-8-9.zip”. Novamente, no diretório onde o arquivo está gravado, execute o comando abaixo substituindo <diretório de destino> pelo diretório onde você deseja armazenar os arquivos da carteira:

unzip Ethereum-Wallet-linux64-0-8-9.zip -d <diretório de destino>

Pronto, no <diretório de destino> há diretório “linux-unpacked” onde está o binário para executar a carteira Ethereum: “ethereumwallet”.

Passo 3: Criando o blockchain privado

Primeiro crie um diretório para armazenar o blockchain. No exemplo, usarei o /home/user/privatenet. Navegue até esse diretório e crie o arquivo JSON (usarei genesis.json nesse exemplo) com os parâmetros de seu bloco genesis customizado. Abaixo detalho um exemplo de bloco genesis, já com parâmetros obrigatórios nas novas versões:

{
"config": {
 "chainId": 15,
 "homesteadBlock": 0,
 "eip155Block": 0,
 "eip158Block": 0
 },
 "nonce": "0x0000000000000042",
 "timestamp": "0x00",
 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "extraData": "0x00",
 "gasLimit": "0x8000000",
 "difficulty": "0x0400",
 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "coinbase": "0x3333333333333333333333333333333333333333",
 "alloc": {
 }
}

Salve esse arquivo e guarde seu nome, pois ele será parâmetro para o “geth”.

Agora execute o seguinte comando:

geth --datadir /home/user/privatenet/chain/ init ./genesis.json

O resultado esperado é:

WARN [04-17|13:34:48] No etherbase set and no accounts found as default 
INFO [04-17|13:34:48] Allocated cache and file handles database=/home/rsarres/testnet2/chain/geth/chaindata cache=128 handles=1024
INFO [04-17|13:34:48] Writing custom genesis block 
INFO [04-17|13:34:48] Successfully wrote genesis state hash=6650a0…b5c158

 

Passo 4: Criando o endereço coinbase

Coinbase é a conta onde os ethers minerados são depositados. Para criar essa conta, precisamos rodar o node inicialmente sem mineração apenas para esse fim. O comando para isso é:

geth --networkid 15 --datadir /home/user/privatenet/chain

Depois que o geth inicializar, inicie a carteira com o comando:

./ethereumwallet --rpc /home/user/privatenet/chain/geth.ipc

É necessário ter acesso à internet ativo nesse momento na máquina virtual para a carteira baixar o binário do geth.

Após a inicialização, a carteira deve abrir no modo gráfico. Atente para o aviso em vermelho “PRIVATE-NET”. Essa informação é importante porque confirma que a carteira está conectada a uma instância que possui seu próprio blockchain e não usa o blockchain público do Ethereum.

Para criar uma nova conta, clique no botão “ADD ACCOUNT”:

ethereum-wallet

Digite a senha que será usada para criptografar sua nova chave privada e clique em OK.

Uma nova conta aparecerá na tela (MAIN ACCOUNT), conforme a imagem abaixo:EthereumWalletPrivateNode

Após a conta aparecer, clique na conta e aperte o botão “Copy Address” à direita. Um aviso te alerta para o fato da rede ser privada, e para não usar esse endereço na rede pública. Caso você se confunda e envie dinheiro de verdade na rede pública para esse endereço de outra cadeia, você perderá seu dinheiro.

Passo 5: Altere a coinbase e comece a minerar

Pare ambos os processos geth e ethereumwallet (CRTL+C). Inicie o geth novamente com o parâmetro adicional etherbase, mine e minerthreads conforme abaixo :

geth --networkid 15 --datadir /home/user/privatenet/chain --mine --minerthreads 1 --etherbase COLEAQUIOENDEREÇO

Copie o endereço que você copiou da carteira no local que aparece “COLEAQUIOENDEREÇO” no comando acima. Reinicie a geth agora em modo de mineração. Tenha paciência porque o processo de mineração demora para iniciar efetivamente, pois o algoritmo ETHASH exige a geração de uma massa de dados chamada DAG. Você pode acompanhar o processo de geração se não tiver nada melhor para fazer na console do terminal geth:

INFO [04-17|16:08:33] Generating DAG in progress epoch=1 percentage=15 elapsed=1m55.517s
INFO [04-17|16:08:38] Generating DAG in progress epoch=1 percentage=16 elapsed=2m0.741s

Reinicie a carteira com o comando abaixo:

./ethereumwallet --rpc /home/user/privatenet/chain/geth.ipc

Quando o processo de mineração começar, você verá o número de blocos incrementar. O contador de blocos fica à direita do PRIVATE-NET escrito em vermelho. Na imagem abaixo, o contador está em 88.

ethereum-wallet

Tudo pronto!

Pronto. Agora você pode ver os ethers sendo minerados em sua rede privada. A imagem apresenta 685 ethers já minerados na rede privada.

EthereumWalletPrivateNode

Agora é só publicar contratos e interagir no blockchain privado.

Dúvidas, sugestões, o artigo já ficou desatualizado depois de 4 horas no ar? Comente!

 

Desenvolvendo e publicando um contrato inteligente no Ethereum 13 de Março de 2017

Posted by Rafael in Transações Eletrônicas.
2 comments

No post anterior apresentei como iniciar um nó privado no Ethereum, ou seja, um nó que cria um blockchain próprio para testes. Agora mostrarei como publicar e interagir com um contrato inteligente usando essa infraestrutura recém-criada.

Se tudo deu certo no passo anterior, você terá uma imagem semelhante à apresentada abaixo em sua carteira Ethereum.

EthereumWalletPrivateNode

O ambiente de desenvolvimento que uso para desenvolver em Solidity, a linguagem mais popular de contratos inteligentes no Ethereum, é o REMIX, anteriormente chamado de browser-solidity. O ambiente é totalmente online, o que facilita muito o seu uso em ambientes mais restritos à instalação.

É bastante intuitivo programar nessa ferramenta. Basta abrir e começar a escrever o programa que a compilação é imediata. Os erros são reportados imediatamente como acontece em um corretor ortográfico. Caso você veja um botão verde à direita do código do programa, seu contrato compilou corretamente e pode ser levado à carteira.

REMIX OK

Qualquer erro será mostrado com um alerta em vermelho e um X na linha com problemas.

REMIX Error

Para facilitar o entendimento e o começo do uso, a ferramenta já apresenta um contrato exemplo no primeiro acesso. Atualmente trata-se de um contrato simples de votação que apresenta várias estruturas interessantes para o aprendizado como “structs”. Recomendo que os iniciantes estudem o contrato exemplo para entender as semântica básica do Solidity.

O REMIX possui funções avançadas como o debug de contratos executando-os passo a passo. Não entrarei nesse detalhe nesse artigo.

Usaremos o famoso contrato SimpleStorage como exemplo na publicação em nossa carteira.

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData;

    function set(uint x) {
        storedData = x;
    }

    function get() constant returns (uint) {
        return storedData;
    }
}

Dessa forma, copie o código acima e retorne para a carteira Ethereum que está conectada a seu nó privado. Aperte o botão azul “CONTRACTS” e depois “Deploy new contract”.

ContractsButton

Os campos a seguir questionam as seguintes informações:

1- FROM: Conta que será usada para publicar  contrato e que pagará pelo gas consumido na publicação. Lembro que o contrato será uma entidade independente após a publicação, e qualquer acesso especial para a conta que publicou o contrato deve ser explicitamente prevista no código.

2- AMOUNT: Quantidade de ethers que você quer enviar inicialmente para o contrato. Não é obrigatório enviar qualquer valor. LEMBRE-SE que valores enviados ao contrato somente serão movimentados posteriormente seguindo as regras do contrato inteligente. Então se você enviar dinheiro a um contrato que não tem previsão nenhuma de movimentação de ethers, esse dinheiro ficará perdido para sempre. Na nossa rede privada, isso não é problema, pois estamos brincando com ethers falsos em um blockchain separado que você está produzindo sozinho com a mineração. Porém, esse é um erro comum na rede de produção.

3- SOLIDITY CONTRACT SOURCE CODE: Nesse campo você pode colar o código do contrato exemplo. A carteira vai compilar o código fonte e, se tudo estiver OK, você poderá escolher o contrato que deseja publicar no menu drop-down à direita. Se houver função construtora que exige parâmetros no contrato, a carteira solicitará os parâmetros.

4- SELECT FEE: Essa opção serve para ajustar o valor que você deseja pagar aos mineradores pela publicação do contrato. Não é relevante em uma rede de teste com dinheiro fabricado na garagem, mas na rede pública serve para você ajustar a taxa de publicação. Quanto maior a taxa, mais rápido seu contrato será publicado e, obviamente, o contrário também se aplica, mas isso somente ocorre na rede pública onde há competição por espaço em blocos.

DeployContract

Clique DEPLOY e a carteira solicitará a senha para utilizar sua chave privada. Verifique se o “Estimated fee consumption” é menor que o “Provide maximum fee”, senão a publicação irá falhar. O primeiro parâmetro é calculado pela carteira e é apenas estimado. O segundo é um parâmetro editável que permite que você escreva a quantidade de gas que você deseja enviar para executar essa transação. Se a rede exigir mais gas do que você está provendo, sua transação falhará e por falta de gas e você perderá todo o gas enviado, pois ele foi consumido no processamento que chegou à conclusão que faltou gas e esse processamento é obviamente cobrado. Pra enviar a transação, clique em SEND TRANSACTION.

EthereumFee

Depois de enviar a transação, acompanhe seu processamento na parte inferior da página inicial da carteira. Nessa área intitulada “Latest Transactions” são listadas todas as transações recentes. Se você receber erros como “No data is deployed on the contract address!”, aumente a quantidade de gas que você envia para a execução da transação de publicação de contrato. Repito, essa alteração pode ser feita no campo editável azul à direita de “Provide maximum fee”, conforme mostrado na imagem acima. Esse erro gera muitas dúvidas dos alunos. Um exemplo de transação que terminou sem criação de contrato por falta de gas pode ser vista na imagem abaixo.

EthereumOutOfGas

Se nada der errado, o contrato será publicado após sua mineração e automaticamente entrará na lista de contratos acompanhados. Essa lista está na área de contratos, botão “CONTRACTS”. Nessa lista é possível interagir com os contratos chamando as suas funções públicas. As suas variáveis públicas já aparecem na interface e apresentam qualquer alteração em tempo real. Por exemplo, após uma chamada da função “Set” de nosso contrato SimpleStorage, a função Get já é atualizada com o novo valor de storedData (1000 na imagem abaixo). Variáveis declaradas públicas também aparecem na interface.

EthereumContracts

Espero que esse artigo ajude no desenvolvimento do trabalho.

Criando um nó privado no ethereum 25 de Novembro de 2016

Posted by Rafael in Transações Eletrônicas.
4 comments

AVISO: Esse post está desatualizado com as novas versões do GETH e Ethereum Wallet. O post atualizado está no link abaixo:

https://mscrafaelsarres.wordpress.com/2017/04/17/criando-um-no-privado-ethereum-atualizacao/

 

Uma das tarefas que passo na aula de transações eletrônicas é trabalhar na plataforma de contratos inteligentes Ethereum e desenvolver com sucesso um protótipo. Há várias formas de se realizar essa tarefa.

A primeira forma é usar a rede pública do Ethereum. O problema dessa escolha é a necessidade de dinheiro para a compra ethers em uma casa de câmbio para pagar os custos de mineração necessários a seu contrato.

A segunda forma é o uso de rede de teste do Ethereum (Morden) apenas mudando a configuração da carteira. O problema nesse caso é o tempo de mineração, pois ainda é necessária uma longa sincronização do blockchain e a rede é mais lenta que uma cadeia privada local. Adicionalmente é preciso usar o serviço de fontes de ether de teste, tais como esse.

A forma que eu sugiro aos alunos para iniciar a programação de seu projeto é a rede privada. Abaixo explicarei de forma rápida como iniciar um blockchain privado em uma máquina Ubuntu usando a carteira do ethereum.

Passo 1: Baixe a carteira Ethereum

Ethereum é um protocolo, qualquer um pode desenvolver software que se conecta e participa da rede seguindo o protocolo, mais ou menos como há diversos navegadores capazes de conversar em HTTP. A carteira que eu uso do Ethereum é a implementação oficial em GO disponível aqui: https://github.com/ethereum/mist/releases

Passo 2: Criando o arquivo Genesis

O segundo passo é criar um arquivo JSON (usarei genesis.json nesse exemplo) com os parâmetros de seu bloco genesis customizado. Abaixo detalho um exemplo de bloco genesis:

{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash":   "0x0000000000000000000000000000000000000000000000000000000000000000",
 "extraData": "0x0",
 "gasLimit": "0x8000000",
 "difficulty": "0x400",
 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "coinbase": "0x3333333333333333333333333333333333333333",
 "alloc": {
  }
}

Salve esse arquivo e guarde seu nome, pois ele será parâmetro para o “geth”, o executável que implementa o protocolo que acompanha a carteira do passo 1.

Passo 3: Crie o diretório para armazenar os dados do blockchain privado

Crie um diretório dedicado e diferente da cadeia principal do Ethereum, caso você tenha um nó público sincronizado. Nesse tutorial, usarei /home/user1/privatenet.

Passo 4: Criando o blockchain

Há uma série de parâmetros que precisam ser passados ao “geth” para instruí-lo a criar um blockchain privado. Não vou entrar em detalhes sobre cada um, a Internet está aí cheia de informação sobre isso.

O comando para criar uma nova a cadeia

geth --datadir /home/user1/privatenet/chain/ init genesis.json

Espere uma saída contendo “successfully wrote genesis block” dentre as demais informações.

Passo 5: Iniciando a mineração

Agora que seus dados da cadeia estão no diretório  /home/user1/privatenet/chain/, use o comando abaixo para iniciar a mineração:

geth --rpc  --rpcapi="db,eth,net,web3,personal" --rpcport "8545" 
--rpcaddr "10.0.2.15" --rpccorsdomain "10.0.2.15" -nodiscover --maxpeers 0 
--datadir /home/user1/privatenet/chain

O comando acima inicia um nó de mineração com uma thread apenas para não ocupar tempo demais de seu processador, abre uma porta RPC para a conexão da carteira do próximo passo. O endereço IP do exempolo é 10.0.2.15, ip local da minha máquina virtual de teste, altere conforme sua configuração local. Nesse exemplo eu permiti várias APIs sem segurança, pois o ambiente é isolado e apenas de teste. Não use essa configuração em produção.

O comando acima irá permanecer rodando com o servidor RPC aberto. Não interrompa esse processo, pois ele é necessário para a carteira e a geração do endereço etherbase.

Passo 6: Inicie o programa da carteira

Localize o executável “Ethereum-Wallet” em seu computador e rode o seguinte comando:

Ethereum-Wallet --rpc http://10.0.2.15:8545

Novamente altere o ip para o seu caso. A carteria deve apresentar um aviso de segurança informando que seu ambiente não é seguro para produção.

Se tudo estiver correto, você deve ser algo como:ethereum-wallet

Passo 7: Crie uma conta para receber seus ethers privados

Crie uma conta apertando o botão “add account”. Digite uma senha e espere a criação.

Após a conta aparecer, clique na conta e aperte o botão “Copy Address”. Um aviso te alerta para o fato da rede ser privada, e para não usar esse endereço na rede pública. Caso você se confunda e envie dinheiro de verdade na rede pública para esse endereço de outra cadeia, você perderá seu dinheiro.

Passo 8: Altere a etherbase

Volte no terminal que está minerando seus ethers (passo 5) e pare o processo. Inicie o mesmo comando novamente com um parâmetro adicional etherbase:

geth --rpc  --rpcapi="db,eth,net,web3,personal" --rpcport "8545" 
--rpcaddr "10.0.2.15" --rpccorsdomain "10.0.2.15" -nodiscover --maxpeers 0 
--mine --minerthreads 1 --etherbase COPIEAQUIOENDEREÇO 
--datadir /home/rsarres/privatenet/chain

Copie o endereço que você copiou da carteira no local que aparece “COPIEAQUIOENDEREÇO” no comando acima. Reinicie a mineração.

Passo 9: Reinicie a carteira

Rode o mesmo comando do passo 6 e abra a carteira. A diferença agora é que a conta que você criou está recebendo ethers de sua rede de teste para você executar os contratos.

 

Pronto, agora você tem um nó privado e, se você for meu aluno, pode trabalhar no projeto de classe.

 

 

Ethereum, o computador global no blockchain 6 de Setembro de 2016

Posted by Rafael in Uncategorized.
2 comments

Estive bem ocupado ultimamente brincando com contratos inteligentes e passando essa tarefa para meus alunos. A plataforma que escolhi para ensinar as virtudes e problemas de um computador mundial baseado em blockchain foi o ethereum, que me parece ser a mais madura e com desenvolvimento ativo no momento.

O ethereum é uma plataforma de execução de contratos inteligentes que possui a sua moeda nativa, o ether. Há duas estruturas básicas na plataforma: As contas e os contratos inteligentes. As contas são repositórios de ether e podem ser utilizadas para interação com outras contas ou com contratos via transações, também chamadas de mensagens. As transações podem:

  • Uma conta pode enviar ether e/ou chamar funções de outro contrato;
  • Uma conta pode enviar ether para outra conta;
  • Os contratos podem trocar transações entre si, chamando funções e/ou enviando ether para outros contratos;
  • Os contratos podem enviar ether para outras contas.

Um contrato inteligente é um programa orientado a eventos que reside na estrutura de dados do blockchain. Em resumo, o contrato escrito na linguagem Solidity (há outras linguagens, mas essa é a mais suportada) é compilado e seu bytecode é gravado em um bloco da cadeia. O contrato apresenta funções públicas, e esses são os pontos de contato com o código.

A grande vantagem de se utilizar o ethereum ao invés de programas tradicionais são:

  • Autenticação: as transações e contas são protegidas por chaves privadas, garantindo a autenticidade;
  • Censura: As transações não podem ser barradas porque são milhares de mineradores geograficamente dispersos e independentes que executam seu processamento;
  • Alta disponibilidade: É muito difícil a rede parar porque são milhares de mineradores;
  • Integridade: O blockchain é imutável, logo os códigos são protegidos contra alteração não autorizada;
  • Proteção contra fraude: Os mineradores validam todas as transações executando por si os blocos propostos pelos demais. Caso um código o resultado de alguma transação proposta em um bloco não seja a mesma da executada localmente, o bloco é rejeitado pelas regras de validação. Nem o próprio criador do contrato pode impedi-lo de executar se não houver previsão explícita no contrato para tal.

Para ilustrar a independência dos contratos até de seu próprio criador, se um contrato for criado sem função de destruição ou de envio dos fundos para terceiros, os ethers enviados para esse contrato serão irremediavelmente perdidos.

Uma das dificuldades que enfrentamos foi o aprendizado do cliente Ethereum. Apesar de ser bem fácil instalar o nó público, há alguns problemas:

  • A rede de teste é um pouco lenta;
  • Precisa de sincronização do blockchain, que é bem grande;
  • Há a necessidade de internet constante, o que atrapalha na apresentação dos alunos e na agilidade do desenvolvimento.

Assim, em um próximo post detalharei como iniciar um nó privado do ethereum para facilitar o desenvolvimento.

Dúvidas? O campo de comentário está logo abaixo.

 

 

Palestras sobre blockchain 25 de Agosto de 2016

Posted by Rafael in Uncategorized.
add a comment

Para quem gosta do tema blockchain e Distributed Ledger, estarei em Belo Horizonte, São Paulo e Rio de Janeiro apresentando palestras sobre esse fascinante novo paradigma computacional.

O link para os eventos segue abaixo:

27/08/2016: Roadsec Belo Horizonte

20/09/2016 e 21/09/2016: MindTheSec São Paulo

30/09/2016: Roadsec Rio de Janeiro