BLOCKCHAIN & BITCOIN:
INTRODUÇÃO E PRÁTICA
COM C#
Alisson Solitto da Silva
Alisson Solitto da Silva, 23 anos
Técnico em Informática
Técnico em JAVA/WR
Bacharel em Ciência da Computação
MBA em Gestão de TI
Mestrando em Ciência da Computação
6 anos de experiência com o
desenvolvimento de software
Alisson Solitto da Silva, 23 anos
Blog: https://solitto.com.br/
GitHub: https://github.com/alissonsolitto
Linkedin: https://www.linkedin.com/in/solitto
Lattes: http://lattes.cnpq.br/7754813473705418
Simplechain: https://simplechain.com.br/
IzyMobile: http://izymobile.com/
Bitcoin - História
■ White Paper Bitcoin: A Peer-to-Peer Electronic Cash System
■ Ano: 2008 – Crise dos EUA
Unidades Bitcoin
■ No caso do Real a moeda é dividida até sua centésima parte que é o centavo.
■ 1 CENTAVO = R$ 0,01
■ Por ser uma moeda digital o Bitcoin é divisível até a centésima milionésima parte
conhecida como “SATOSHI”em homenagem ao seu criador.
Outros Projetos
CoinMarketCap +2.100 Criptomoedas
Blockchain – O que é?
■ A blockchain funciona como um livro-razão da contabilidade, controlando todos os
créditos e débitos de várias contas.
■ Principal benefício está na descentralização da sua base de dados, visando a
segurança e a confiabilidade de suas transações.
■ Desta forma cria-se uma rede universal, publica e compartilhada.
O que é?
■ O blockchain nada mais é do que uma lista encadeada.
■ As informações referentes a transação são armazenadas em um bloco de dados.
■ HASH: SHA-256
■ Cada nó na rede é um computador e qualquer computador pode fazer parte da
blockchain, para fazer parte da rede é necessário fazer uma cópia de toda a base
de dados da rede, após isso a principal tarefa do nó é validar e repassar os dados
das transações.
■ https://www.blockchain.com/pt/btc/unconfirmed-transactions
Vantagens
■ Transparência: todas as transações que ocorrem na rede são publicas e disponíveis
de forma acessíveis para todos.
■ Descentralização: não há necessidade de um intermediário nas transações, é
possível transferir dinheiro entre pessoas de qualquer lugar do mundo sem uma
instituição financeiro como nos métodos convencionais.
■ Inalterável: as transações feitas na rede são imutáveis, ou seja, não podem ser
alteradas ou deletadas.
■ Baixo custo: Por não haver uma instituição financeira intermediando as transações
o custo é muito menor.
Blockchain – Como funciona?
0x2bf8b4d794eff286baf9de360aeef064478967d7 0xce784419493d80d37ce83dbe86c9353f3f617d75
AliceBob
Transação 01
Transação 02
Transação 03
...
Transação N
Proof of Work
■ O maior trabalho computacional da rede é a criação de um hash válido
■ NONCE (N = Número e Once = Uma vez).
■ Bitcoin utiliza o método hashcash => hash deve ser codificado com um
número n de zero bits.
Exemplo
■ "Olá, mundo! 0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
■ "Olá, mundo! 1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
■ "Olá, mundo! 2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
■ ...
■ "Olá, mundo! 4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
■ "Olá, mundo! 4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
■ "Olá, mundo! 4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
Consenso
■ Broadcast do novo bloco
■ Validação
■ Aceitação
Show me the code! C#
■ Vamos programar uma
Wallet de Bitcoin!!
Show me the code! C#
Show me the code! C#
Show me the code! C#
Key privateKey = new Key();
PubKey publicKey = privateKey.PubKey;
Console.WriteLine(publicKey);
Console.WriteLine(publicKey.GetAddress(Network.TestNet));
Show me the code! C#
■ https://live.blockcypher.com/btc-testnet
■ https://bitcoinfaucet.uo1.net/
Gerando chaves com senha
■ Mnemonic mnemo = new Mnemonic(Wordlist.PortugueseBrazil, WordCount.Twelve);
■ ExtKey pkey = mnemo.DeriveExtKey(senha);
Buscar Saldo
Money SpentCoins = 0;
Money ReceivedCoins = 0;
//Criando address BTC
BitcoinAddress btcAddress = BitcoinAddress.Create(address, Network.TestNet);
//Criando Client QBitNinjaClient
var client = new QBitNinjaClient(Network.TestNet);
Buscar Saldo
//Percorre todas as transações do endereço
client.GetBalance(btcAddress).Result.Operations.ToList().ForEach(x =>
{
if (x.Amount > 0) //Recebido
ReceivedCoins += x.Amount;
else //Enviado
SpentCoins += x.Amount;
});
Buscar Saldo
Console.WriteLine("Recebidos: " + ReceivedCoins.ToUnit(MoneyUnit.BTC));
Console.WriteLine("Enviados: " + SpentCoins.ToUnit(MoneyUnit.BTC));
Console.WriteLine("Total: " + (ReceivedCoins + SpentCoins).ToUnit(MoneyUnit.BTC));
Histórico de Transações
client.GetBalance(btcAddress).Result.Operations.ToList().ForEach(x =>
{
//Detalhes da transação
var tran = client.GetTransaction(x.TransactionId).Result;
Console.WriteLine("----------------------------------------------");
Console.WriteLine("TransactionId" + x.TransactionId.ToString());
Console.WriteLine("Amount" + x.Amount.ToUnit(MoneyUnit.BTC));
Console.WriteLine("BlockId" + x.BlockId.ToString());
Console.WriteLine("Height" + x.Height);
Console.WriteLine("Confirmations" + x.Confirmations);
Console.WriteLine("Fees" + tran.Fees.ToUnit(MoneyUnit.BTC));
});
Criar uma transação
Criar uma transação
■ Chave privada
■ Endereço de destino
■ Quantidade de BTC
■ Taxa de transação
Criar uma transação
var btcSecret = pkey.PrivateKey.GetBitcoinSecret(Network.TestNet);
//Enviando para...
BitcoinAddress btcAddress = BitcoinAddress.Create(addressSend, Network.TestNet);
//Buscando TODAS saídas validas para gastar
var client = new QBitNinjaClient(Network.TestNet);
client.GetBalance(btcSecret.GetAddress(), true).Result.Operations.ToList().ForEach(x =>
{
if (x.Confirmations > 0)
{
x.ReceivedCoins.ForEach(r =>
{
if (r.TxOut.Value > Money.Satoshis(0))
{
lstCoin.Add(new Coin()
{
Outpoint = r.Outpoint,
TxOut = r.TxOut
});
}
});
}
});
//Convertendo as saidas em ICOIN
Coin[] coin = lstCoin.Select((o, i) => new Coin(o.Outpoint, o.TxOut)).ToArray();
//TransactionBuilder montando a transação complexa
TransactionBuilder txBuilder = new TransactionBuilder();
//Politica que define a taxa minima de transacao
txBuilder.StandardTransactionPolicy.MinRelayTxFee = FeeRate.Zero;
//False para permitir transações com poucos satoshis
txBuilder.DustPrevention = false;
Transaction tx = txBuilder
.AddKeys(btcSecret.PrivateKey)
.AddCoins(coin)
.Send(btcAddress.ScriptPubKey, moneySend)
.SetChange(btcSecret.ScriptPubKey)
.SendFees(fee)
.BuildTransaction(true);
BroadcastResponse broadcastResponse = client.Broadcast(tx).Result;
if (!broadcastResponse.Success)
{
Console.WriteLine(string.Format("Code: {0}",
broadcastResponse.Error.ErrorCode));
Console.WriteLine("Mensagem: " + broadcastResponse.Error.Reason);
}
else
{
Console.WriteLine("Sucesso ====> " + tx.GetHash().ToString());
}

Blockchain e Bitcoin Introdução e Prática com C#

  • 1.
    BLOCKCHAIN & BITCOIN: INTRODUÇÃOE PRÁTICA COM C# Alisson Solitto da Silva
  • 2.
    Alisson Solitto daSilva, 23 anos Técnico em Informática Técnico em JAVA/WR Bacharel em Ciência da Computação MBA em Gestão de TI Mestrando em Ciência da Computação 6 anos de experiência com o desenvolvimento de software
  • 3.
    Alisson Solitto daSilva, 23 anos Blog: https://solitto.com.br/ GitHub: https://github.com/alissonsolitto Linkedin: https://www.linkedin.com/in/solitto Lattes: http://lattes.cnpq.br/7754813473705418 Simplechain: https://simplechain.com.br/ IzyMobile: http://izymobile.com/
  • 4.
    Bitcoin - História ■White Paper Bitcoin: A Peer-to-Peer Electronic Cash System ■ Ano: 2008 – Crise dos EUA
  • 5.
    Unidades Bitcoin ■ Nocaso do Real a moeda é dividida até sua centésima parte que é o centavo. ■ 1 CENTAVO = R$ 0,01 ■ Por ser uma moeda digital o Bitcoin é divisível até a centésima milionésima parte conhecida como “SATOSHI”em homenagem ao seu criador.
  • 7.
  • 8.
  • 9.
    Blockchain – Oque é? ■ A blockchain funciona como um livro-razão da contabilidade, controlando todos os créditos e débitos de várias contas. ■ Principal benefício está na descentralização da sua base de dados, visando a segurança e a confiabilidade de suas transações. ■ Desta forma cria-se uma rede universal, publica e compartilhada.
  • 11.
    O que é? ■O blockchain nada mais é do que uma lista encadeada. ■ As informações referentes a transação são armazenadas em um bloco de dados. ■ HASH: SHA-256
  • 12.
    ■ Cada nóna rede é um computador e qualquer computador pode fazer parte da blockchain, para fazer parte da rede é necessário fazer uma cópia de toda a base de dados da rede, após isso a principal tarefa do nó é validar e repassar os dados das transações. ■ https://www.blockchain.com/pt/btc/unconfirmed-transactions
  • 13.
    Vantagens ■ Transparência: todasas transações que ocorrem na rede são publicas e disponíveis de forma acessíveis para todos. ■ Descentralização: não há necessidade de um intermediário nas transações, é possível transferir dinheiro entre pessoas de qualquer lugar do mundo sem uma instituição financeiro como nos métodos convencionais. ■ Inalterável: as transações feitas na rede são imutáveis, ou seja, não podem ser alteradas ou deletadas. ■ Baixo custo: Por não haver uma instituição financeira intermediando as transações o custo é muito menor.
  • 14.
  • 15.
  • 16.
  • 17.
    Proof of Work ■O maior trabalho computacional da rede é a criação de um hash válido ■ NONCE (N = Número e Once = Uma vez). ■ Bitcoin utiliza o método hashcash => hash deve ser codificado com um número n de zero bits.
  • 18.
    Exemplo ■ "Olá, mundo!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64 ■ "Olá, mundo! 1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8 ■ "Olá, mundo! 2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7 ■ ... ■ "Olá, mundo! 4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965 ■ "Olá, mundo! 4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6 ■ "Olá, mundo! 4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
  • 19.
    Consenso ■ Broadcast donovo bloco ■ Validação ■ Aceitação
  • 20.
    Show me thecode! C# ■ Vamos programar uma Wallet de Bitcoin!!
  • 21.
    Show me thecode! C#
  • 22.
    Show me thecode! C#
  • 23.
    Show me thecode! C# Key privateKey = new Key(); PubKey publicKey = privateKey.PubKey; Console.WriteLine(publicKey); Console.WriteLine(publicKey.GetAddress(Network.TestNet));
  • 24.
    Show me thecode! C# ■ https://live.blockcypher.com/btc-testnet ■ https://bitcoinfaucet.uo1.net/
  • 25.
    Gerando chaves comsenha ■ Mnemonic mnemo = new Mnemonic(Wordlist.PortugueseBrazil, WordCount.Twelve); ■ ExtKey pkey = mnemo.DeriveExtKey(senha);
  • 26.
    Buscar Saldo Money SpentCoins= 0; Money ReceivedCoins = 0; //Criando address BTC BitcoinAddress btcAddress = BitcoinAddress.Create(address, Network.TestNet); //Criando Client QBitNinjaClient var client = new QBitNinjaClient(Network.TestNet);
  • 27.
    Buscar Saldo //Percorre todasas transações do endereço client.GetBalance(btcAddress).Result.Operations.ToList().ForEach(x => { if (x.Amount > 0) //Recebido ReceivedCoins += x.Amount; else //Enviado SpentCoins += x.Amount; });
  • 28.
    Buscar Saldo Console.WriteLine("Recebidos: "+ ReceivedCoins.ToUnit(MoneyUnit.BTC)); Console.WriteLine("Enviados: " + SpentCoins.ToUnit(MoneyUnit.BTC)); Console.WriteLine("Total: " + (ReceivedCoins + SpentCoins).ToUnit(MoneyUnit.BTC));
  • 29.
    Histórico de Transações client.GetBalance(btcAddress).Result.Operations.ToList().ForEach(x=> { //Detalhes da transação var tran = client.GetTransaction(x.TransactionId).Result; Console.WriteLine("----------------------------------------------"); Console.WriteLine("TransactionId" + x.TransactionId.ToString()); Console.WriteLine("Amount" + x.Amount.ToUnit(MoneyUnit.BTC)); Console.WriteLine("BlockId" + x.BlockId.ToString()); Console.WriteLine("Height" + x.Height); Console.WriteLine("Confirmations" + x.Confirmations); Console.WriteLine("Fees" + tran.Fees.ToUnit(MoneyUnit.BTC)); });
  • 30.
  • 31.
    Criar uma transação ■Chave privada ■ Endereço de destino ■ Quantidade de BTC ■ Taxa de transação
  • 32.
    Criar uma transação varbtcSecret = pkey.PrivateKey.GetBitcoinSecret(Network.TestNet); //Enviando para... BitcoinAddress btcAddress = BitcoinAddress.Create(addressSend, Network.TestNet);
  • 33.
    //Buscando TODAS saídasvalidas para gastar var client = new QBitNinjaClient(Network.TestNet); client.GetBalance(btcSecret.GetAddress(), true).Result.Operations.ToList().ForEach(x => { if (x.Confirmations > 0) { x.ReceivedCoins.ForEach(r => { if (r.TxOut.Value > Money.Satoshis(0)) { lstCoin.Add(new Coin() { Outpoint = r.Outpoint, TxOut = r.TxOut }); } }); } }); //Convertendo as saidas em ICOIN Coin[] coin = lstCoin.Select((o, i) => new Coin(o.Outpoint, o.TxOut)).ToArray();
  • 34.
    //TransactionBuilder montando atransação complexa TransactionBuilder txBuilder = new TransactionBuilder(); //Politica que define a taxa minima de transacao txBuilder.StandardTransactionPolicy.MinRelayTxFee = FeeRate.Zero; //False para permitir transações com poucos satoshis txBuilder.DustPrevention = false; Transaction tx = txBuilder .AddKeys(btcSecret.PrivateKey) .AddCoins(coin) .Send(btcAddress.ScriptPubKey, moneySend) .SetChange(btcSecret.ScriptPubKey) .SendFees(fee) .BuildTransaction(true);
  • 35.
    BroadcastResponse broadcastResponse =client.Broadcast(tx).Result; if (!broadcastResponse.Success) { Console.WriteLine(string.Format("Code: {0}", broadcastResponse.Error.ErrorCode)); Console.WriteLine("Mensagem: " + broadcastResponse.Error.Reason); } else { Console.WriteLine("Sucesso ====> " + tx.GetHash().ToString()); }