6
focar em
792
Seguidores

Introdução ao Blockchain e Ethereum

Criado em: 2016-05-05 17:31:57, atualizado em: 2016-05-05 17:32:31
comments   3
hits   2492

A partir de agora, o Bitcoin será vendido como uma moeda de troca, e o Bitcoin será vendido como moeda de troca.

Este artigo foi composto a partir de uma partilha de tecnologia que fiz no LeanCloud no final de março, e assume que o leitor já tem conhecimento básico de criptografia e uma visão preliminar da implementação do Bitcoin.

O Blockchain, também conhecido como blockchain, é uma espécie de HashTree, e por isso tem algumas características semelhantes:

blockchain-hash-tree

Imagem de:<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Em uma estrutura de árvore, cada nó terminal tem um valor de hash, enquanto o valor de hash de um nó não-terminal é derivado do valor de hash de todos os seus sub-nós diretos, portanto, cada nó contém informações de todos os seus sub-nós direta ou indiretamente. Assim, sempre que o valor de hash de qualquer um dos nós terminais muda, o valor de hash de todos os seus nodos-mãe também muda, e os nodos-raiz também devem mudar.

Eu posso citar um aplicativo sobre o HashTree: “100% de prova de reserva”, que pertence à categoria de “prova de conhecimento zero”. Podemos considerar um cenário em que os detentores da Bitcion precisam depositar Bitcoin em uma bolsa para realizar transações, e, em teoria, a bolsa pode usar esse dinheiro (o saldo de todas as contas de todos os usuários depositadas) para usá-lo, o que os usuários não querem ver, mas a bolsa também quer se esclarecer: a bolsa primeiro divulga um endereço de Bitcoin que ela detém, e todos confirmam que a bolsa realmente detém esse número de Bitcoin como reserva, mas como provar que o dinheiro é realmente maior do que o total de todos os saldos de todos os usuários? Em outras palavras, como cada usuário pode ter seu próprio saldo incluído na reserva total sem divulgar o saldo de cada usuário (que pode revelar a privacidade do usuário)?

blockchain-proof-of-reserves

Imagem de:<http://blog.bifubao.com/2014/03/16/proof-of-reserves

Podemos construir um HashTree em que todos os nós finais representam um usuário, contendo o saldo do usuário.Σ) e um fragmento de identificação de usuário (como um endereço de e-mail)h), e o nó pai contém a soma dos saldos dos seus nodos filhos (sum) e um conjunto de informações de todos os sub-nodos (hashPara cada usuário, basta mostrar-lhe o seu próprio nó terminal e os seus irmãos, ou seja, todos os seus parentes e os irmãos dos parentes, pois o usuário pode confirmar que o seu saldo foi incluído no parente e, finalmente, no parente.

Assim, a informação exibida a cada usuário é somente a sua própria informação e algumas informações agregadas, e cada usuário pode confirmar que seu saldo está incluído no nó raiz sem que outros usuários do saldo saibam disso.hPorquê?e4df9d12O nó não deve ser um nó de extremo representativo do usuário, mas um nó de informação agrupado (que pode conter um usuário com saldo 3333, e um usuário virtual com saldo 0) para evitar a divulgação de informações privadas de um usuário.

Agora vamos ver o Git, que é um aplicativo blockchain muito típico:

blockchain-git-objects-example

Imagem de:http://gitbook.liuhui998.com/1_2.html (GPL v2)

No Git, seja um arquivo (Blob), um índice (Tree) ou um comitente (Commit), todos têm um hash determinado pelo seu conteúdo, se dois objetos tiverem o mesmo conteúdo, terão o mesmo hash. No Git, o histórico de todo o repositório é um Blockchain, cada Commit equivale a um Bloco, o Comit contém o hash do Comit anterior e o hash do objeto relacionado a esta modificação, o Hash do Comit em si é determinado pelo seu conteúdo e por essas informações.

O Git usa o Blockchain para definir um único histórico para o repositório. Se um Commit for modificado, todos os hashes dos Commits subsequentes serão alterados. Claro, como o Git é apenas uma ferramenta de controle de versão, isso não impede que você modifique o histórico.push --forceO blogueiro também publicou um post no Facebook, onde afirma que a mudança foi percebida por todos os coautores.

Outra aplicação clássica do Blockchain é o Bitcoin, que é o que fez com que o termo “blockchain” se espalhasse (e o conceito, na verdade, sempre existiu):

blockchain-bitcoin-block-data

Imagem de:https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

No Bitcoin, cada bloco contém uma série de transações e o hash do bloco anterior, enquanto o Blockchain inteiro constitui uma única conta descentralizada. Como um novo bloco é criado a cada dez minutos e, uma vez criado, o bloco permanece na Blockchain para sempre, o Blockchain fixa a ordem em que as transações ocorrem, mantendo a ordem anterior e posterior em que as transações ocorrem e determinando se uma conta tem saldo suficiente para iniciar uma transação.

Bitcoin

A primeira parte deste post é uma breve retrospectiva do Bitcoin.

A geração de blocos em Bitcoin é realizada por meio de “prova de volume de trabalho”, ou seja, todos os “mineros” envolvidos na “mineração” devem realizar uma computação em conjunto, de natureza aleatória, até que um número aleatório que atenda a determinadas condições seja calculado, para obter o direito de lançar um bloco.

Por definição, cada mineiro sempre vai confiar na “cadeia mais longa” e calcular o próximo bloco com base na cadeia mais longa conhecida que satisfaz as regras, caso contrário, sua capacidade de computação será desperdiçada.

O Bitcoin foi projetado para gerar um novo bloco a cada 10 minutos, o que é feito por todos, observando o intervalo de tempo dos últimos blocos, para ajustar a dificuldade das condições de geração do próximo bloco. Quando a velocidade de geração dos últimos blocos é maior do que a esperada, as pessoas acham que a geração do próximo bloco deve ter uma dificuldade maior.

Normalmente, cada nó Bitcoin precisa armazenar dados completos do Blockchain para confirmar se uma transação é legítima. O iniciador de uma transação de criptomoedas tem saldo suficiente para iniciar a transação. Mas agora o blockchain completo já tem 66G e está crescendo a uma taxa de cerca de 0.1G por dia.

blockchain-bitcoin-state-machine

Imagem de:<https://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain Livro de contabilidade de criptomoedas Registro de mudanças de status de criptomoedas
  • Transação Transação Mudança de estado única
  • Um “consenso” sobre a situação atual

Na verdade, podemos imaginar o Blockchain do Bitcoin como uma “máquina de estado”, o Blockchain inteiro é um “livro” de estado, no qual são armazenados todos os registros de transações, com base nesses registros de transações, pode-se calcular o “estado” do livro inteiro em qualquer momento, ou seja, o saldo de cada conta na rede Bitcoin. Cada transação é uma mudança de estado, e cada bloco é um “consenso” sobre o estado atual dos mineiros da rede Bitcoin, porque o Bitcoin gera um novo bloco a cada 10 minutos, o que equivale a que todos chegam a um consenso sobre o saldo de todas as contas a cada 10 minutos, enquanto o estado do livro é realmente um “estado de caos” durante esses dez minutos.

Alt Coin

A base do Bitcoin também é derivada de muitas outras moedas criptográficas, geralmente chamadas de “moedas alternativas”, que geralmente têm duas implementações:

A primeira é a utilização de uma rede própria e independente do Bitcoin, com a vantagem de que a criptomoeda pode projetar seus próprios protocolos e regras com muita flexibilidade, mas, como o número de usuários é difícil de alcançar o nível de Bitcoin, a defesa contra ataques maliciosos será muito fraca.

A segunda é usar a rede do Bitcoin para implementar o “protocolo de meta” e anexar informações personalizadas à Transação do Bitocin para implementar sua própria lógica. Esse benefício é que você pode usar o tamanho do poder de computação do Bitcoin para defender-se de ataques, mas ao mesmo tempo, porque dependendo da rede do Bitcoin, nem todos os mineiros obedecem às regras da moeda clássica.

Para essas moedas clássicas, o Bitcoin pode fornecer um Blockchain com a participação de um grande número de mineiros, que pode resistir a ataques maliciosos em larga escala, e a transação do Bitcoin também pode ser equipada com dados personalizados, deixando espaço para a implementação de moedas clássicas.

O Bitocin também oferece um.Bitcoin ScriptMas como isso não é a função central do Bitcoin, só é possível realizar operações relativamente simples, apenas é possível ler dados muito limitados no Blockchain, e, devido à falta de mecanismo circular, é difícil escrever uma lógica universal e completa de Turing.

Ethereum

blockchain-ethereum

Imagem de:https://www.ethereum.org/assets (CC 3.0)

Ethereum é uma plataforma de aplicações descentralizadas baseada em blockchain, que construiu a infraestrutura de Bitcoin em uma plataforma universal e complementou algumas funções que faltavam na rede Bitcoin para que os desenvolvedores pudessem executar suas próprias aplicações descentralizadas na Blockchain.

Antes de entrar em detalhes sobre o Ethereum, deixe-me falar sobre o que eu acho que são as duas principais bases de uma rede descentralizada: criptografia e jogos. A criptografia é, naturalmente, apenas uma forma matemática de garantir a segurança por meio de criptografia de chave pública, assinatura digital, hashing e algoritmos de resumo. O jogo é que, em uma rede descentralizada, qualquer pessoa, incluindo quem deseja maliciosamente atacar a rede, pode participar.

No entanto, no mundo digital, o lançamento de um pedaço de dados não tem custo, não há “benefícios” e “perdas”, portanto, é necessário estabelecer algum tipo de conexão com o mundo físico para definir “benefícios”. Por exemplo, na rede Bitocin, se um atacante deseja alterar artificialmente o curso da Blcokchain, é necessário ter uma maior potência de computação do que todos os outros mineiros, enquanto no mundo físico, a potência de computação é necessária para fornecer o equipamento de computação, que precisa ser comprado do mundo físico.

Portanto, em uma rede descentralizada, nem todos os problemas são resolvidos pela “tecnologia”, e a parte que a tecnologia não atinge, deve ser resolvida por meio de benefícios, por meio de incentivos econômicos. Também por causa da necessidade de “motivação econômica”, o Ethereum também tem um sistema de carteira (a unidade monetária é chamada “Ether”) e cada usuário tem um endereço de carteira como seu único identificador, neste ponto é semelhante ao Bitcion.

“Contract” é o conceito mais importante introduzido pelo Ethereum. No Bitcoin, todos os endereços pertencem a um usuário. Quando dizemos “usuário”, estamos falando de um par de chaves públicas e privadas.

  • O resultado do cálculo não precisa ser armazenado no blockchain, pois pode ser recalculado a qualquer momento.
  • A função pode ser chamada em outros contratos (o código e os dados de outros contratos também existem na blockchain).
  • A execução pode criar novas transações (manipulação do saldo da sua carteira) que podem ser usadas para executar outros contratos.

Para começar, um exemplo de uma “carteira compartilhada por vários usuários” é a função de criar uma carteira para vários usuários no cliente oficial do Ethereum:

blockchain-ethereum-multi-sig-wallet

A função permite criar um endereço de carteira que é compartilhado com outras duas pessoas, e cada pessoa pode usar até 100 Ether por dia, exceder esse limite requer o consentimento de outra pessoa.

Esta função cria um contrato, e a lógica é descrita pelo código do contrato. Quando você deseja fazer um pagamento a partir da carteira compartilhada, você precisa enviar uma mensagem para a carteira compartilhada ((transação é mensagem, o valor da transação pode ser zero, carregando apenas dados), e o código da carteira compartilhada será executado, e se a solicitação de pagamento for compatível com a lógica acima, a transação de pagamento real será iniciada, caso contrário, a solicitação de pagamento será rejeitada ((não há pagamento realmente realizado)).

Outro exemplo é o “contrato de hedge”, que tem sido constantemente falado sobre a instabilidade do Bitcoin como moeda digital (e do câmbio das moedas legais), que costuma ocorrer em situações em que o valor da moeda aumenta ou diminui duas vezes em um dia, mas isso pode ser resolvido em parte se um contrato de hedge for implementado com o Contract.

Nós chamaremos de “evitador de risco” alguém que deseja manter o valor da moeda estável, e chamaremos de “tomador de risco” outra pessoa que está disposta a assumir o risco de flutuação do valor da moeda e lucrar com isso, então eles podem contratar um valor (por exemplo, 1000 CNY) e uma janela de tempo (por exemplo, um mês) e criar um contrato para executar a seguinte lógica:

  • O evasor de risco envia o Ether de 1000 CNY para o endereço de carteira do Contract, e o assumidor de risco também envia o Ether de 1000 CNY (ou mais) para o Contract para cumprir o contrato (se ninguém cumprir o contrato, o evasor de risco pode recuperar seu próprio Ether).
  • Depois de um mês, os evasores de risco podem retirar do contrato o Ether que, na época, valia 1000 CNY, e o Ether restante é retirado pelos tomadores de risco, independentemente da taxa de câmbio entre Ether e CNY.

Se o valor do Ether aumenta, o tomador de risco ganha, se o valor do Ether diminui, o tomador de risco perde, mas o evasor de risco não perde. Claro, o evasor de risco e o tomador de risco podem acordar previamente um “seguro” que o evasor de risco terá que pagar, e também podem acordar que o tomador de risco precisará fornecer uma garantia de várias vezes a 1000 CNY (quanto maior a taxa de duplicação, maior o risco que pode assumir).

Na verdade, há um problema não muito bem resolvido no exemplo acima, que é como determinar a taxa de câmbio entre o Ether e a moeda virtual. Como mencionamos anteriormente, o contrato só tem acesso a dados na blockchain, e a moeda virtual é um dado que existe no mundo real e não no mundo criptográfico.

Podemos projetar outro Contract para especificar a lógica para obter a taxa de câmbio entre o Ether e a moeda virtual do mundo real, em cada janela de tempo (por exemplo, uma hora):

  • Todos os proprietários podem pagar uma garantia ao Contract e fornecer uma taxa de câmbio.
  • No final da janela de tempo, o Contract calcula o valor médio das taxas de câmbio oferecidas pelos proprietários (ponderadas de acordo com o valor da garantia) e as publica.
  • A garantia será distribuída entre as pessoas mais próximas de 25% da média (peso ponderado).

Para qualquer um dos participantes, apresentar uma taxa de câmbio verdadeira, sem saber o que os outros estão a oferecer, tem uma maior probabilidade de ganhar um prémio, enquanto apresentar uma taxa de câmbio muito estranha terá uma maior probabilidade de perder o depósito.

Claro que esta regra tem algumas lacunas, como se uma pessoa tem muito dinheiro de garantia, então ele pode puxar a média para um preço mais alto ou mais baixo do que a taxa de câmbio real, ao mesmo tempo receber o prêmio, e fazer com que alguns outros que forneceram a taxa de câmbio exata perder a garantia. Mas na verdade, é o mesmo no mundo real, se você tem muito dinheiro também pode elevar ou abaixar o preço de uma mercadoria, só que em comparação com o mundo real, o volume de moeda eletrônica é muito pequeno, e não precisa de muito dinheiro para fazê-lo; mas na verdade, elevar ou pressionar a taxa de câmbio de forma maliciosa também é muito arriscado, porque você não tem certeza de que o valor da garantia que você pagou é suficiente, e se falhar, perderá toda a garantia.

Outra falha é que “todo mundo pode depositar a garantia no contrato e fornecer uma taxa de câmbio”. Isso é feito através da criação de transações, e todas as transações são escritas na Blockchain, então a taxa de câmbio que você envia é realmente visível para outras pessoas, criando ainda mais oportunidades para os atacantes mal-intencionados.

Nós mencionamos anteriormente que o Contract pode ler dados na Blockchain, mas os dados na Blockchain são definitivos, e se queremos implementar uma aplicação semelhante ao jogo de azar, de onde vamos obter um número aleatório?

Uma fonte de números aleatórios imaginável é o hash do próximo bloco, e em muitos casos, esse grau de aleatoriedade é suficiente. Mas, na verdade, o mineiro pode manipular esse número aleatório até certo ponto. Se um mineiro participar de um jogo e o lucro do jogo for maior do que o lucro de uma peça, então se o mineiro escavar uma peça que o levaria a perder o jogo, então o mineiro obviamente escolherá não divulgar o novo bloco, o que é mais óbvio na medida em que o computador do mineiro for mais poderoso.

Por isso, precisamos de introduzir um mecanismo semelhante ao levantamento de taxas de câmbio para recolher um número aleatório de sementes e, em seguida, usar essas sementes para calcular um número aleatório no final de cada janela de tempo e. Mas, como o levantamento de taxas de câmbio, como os participantes são criados através da criação de transações para realizar a submissão de taxas de câmbio, portanto, entre uma janela de tempo, os números aleatórios submetidos por cada pessoa são visíveis para todos os outros, de modo que uma pessoa que já participou de um jogo pode escolher cuidadosamente um número aleatório de sementes para que o número aleatório de sementes submetidas por outras pessoas, além de novas sementes, seja exatamente o que ele esperava.

Por isso, é necessário dividir a janela de recolha de sementes em duas partes, para obter um número aleatório que ninguém pode prever ou intervir:

  • Fase I: Todos podem pagar a garantia ao Contract e fornecer “o valor da soma de uma semente selecionada aleatoriamente”.
  • Fase II: Os participantes da fase I fornecem sementes não semeadas ao Contract.
  • Fase II termina: o Contract faz a triagem de todas as sementes legítimas, gera um conjunto de números aleatórios e publica; retorna à Fase II com a fiança de quem forneceu a semente correta.

Na primeira etapa, você só conhece os valores das sementes submetidas por outras pessoas e não as sementes reais, portanto não é possível construir uma semente para interferir no resultado; e na segunda etapa, todos estão apenas confirmando as sementes submetidas na primeira etapa e não podem submeter novas sementes, nem impedir que outras pessoas submetam sementes.

Anteriormente mencionamos que o Bitcoin Script não oferece a capacidade de ciclo, recursivo, salto, etc. Talvez o Bitcoin seja para controlar o tempo de execução de um Bitcoin Script, porque, de acordo com o “teorema de parada” de Turing, os programas escritos por linguagens de programação completas de Turing, não podem sempre ser apenas avaliados apenas do ponto de vista da análise estática se eles terminam após um número limitado de passos, de modo que os atacantes maliciosos dependentes podem construir uma transação que cause um ciclo de morte para interromper o trabalho normal dos mineiros.

O EVM é uma máquina virtual que possui um “contador” próprio, definido no padrão do EVM, de acordo com a memória e o tempo de CPU necessários para a operação. Cada Gas consumido pelo opcode é um recurso de computação comprado pelo Ether. Quando o objetivo de uma transação é o Contract, o código do Contract é executado, o iniciador da transação precisa pagar o Gas consumido durante a execução do Contract, ao mesmo tempo em que declara “uma disponibilidade para pagar a maior quantidade de Gas” e a execução do Contract será interrompida se o Gas se esgotar no meio do caminho.

Então voltemos ao problema do “intervalo de consenso”, mencionado anteriormente no Bitcoin, em que um novo bloco é criado a cada 10 minutos, ou seja, a rede inteira chega a um “consenso” a cada 10 minutos, então a transação de Bitcoin geralmente demora dez minutos para ser confirmada, e no início do computador não é muito forte, pode ser necessário esperar uma hora (seis blocos) para que a transação seja considerada confiável.

É porque o intervalo de consenso mais rápido aumenta um pouco a vantagem do “banco de minas centralizado”. O “banco de minas” significa que os mineiros de Bitcoin se reúnem para minerar, os mineiros obedecem às instruções do banco de minas sem condições e, finalmente, dividem os lucros com o banco de minas.

Quando um mineiro A encontra um novo bloco, ele transmite o bloco, e os outros começam a trabalhar com base no novo bloco assim que recebem a notícia. Para os outros, o cálculo do tempo entre “A encontra o novo bloco” e “recebe a notícia da transmissão de A” é praticamente desperdiçado, e os outros mineiros do pool de mineração centralizada não têm esse problema, pois eles podem obter informações mais rapidamente sobre o bloco recém-criado e começar a trabalhar com base no novo bloco.

blockchain-ethereum-without-uncles

O tempo de transmissão pode ser de alguns segundos, o que não é muito importante para 10 minutos, mas as vantagens do pool centralizado serão cada vez mais evidentes se o intervalo de consenso for reduzido. Mas o Ethereum resolveu o problema introduzindo o conceito de “Uncle Block”, reduzindo o intervalo de consenso para 15 segundos.

No Blockchain do Bitcoin, um bloco pode ter apenas um bloco pai e um bloco filho. Mas no Ethereum, um bloco recém-criado pode ter um bloco pai e vários blocos tios. Voltando ao exemplo acima, se alguém escavar um novo bloco em A, mas outros ainda não receberam o tempo de transmissão, se alguém escavar um novo bloco, mas, como a transmissão é mais tarde e não é aceita por todos, então esse bloco pode ser o “tipo tio” do bloco seguinte.

blockchain-ethereum-uncles

Imagem de:<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Problemas não resolvidos

A próxima parte é sobre alguns dos problemas que o Ethereum ainda não resolveu.

O problema com a prova de trabalho é que se desperdiça muito poder de computação para garantir a segurança da rede, embora seja baseado na idéia de “motivação econômica” que mencionamos anteriormente, mas na verdade pode ser melhorado. Ehtereum acredita que a melhor maneira é usar POS (prova de propriedade) em vez da prova de trabalho, o que pode aumentar drasticamente a eficiência da rede.

O POS significa que todos os nodos que desejam participar da geração de blocos (em sentido tradicional, a mineração) são chamados de verificadores (que são chamados de verificadores) e precisam pagar um bônus ao sistema (o sistema refere-se ao protocolo, em que todos os nodos consideram que o bônus foi “congelado”) e, em seguida, usam seu próprio bônus para assinar o bloco que pode ser o próximo bloco (uma premissa importante do chamado “possível” é que o bloco deve estar em conformidade com o protocolo). Se o bloco for realmente o próximo bloco, todos os nodos assinados serão premiados, caso contrário, o bônus será cancelado.

Este modelo é muito semelhante ao POW, em POW, os mineiros usam o seu próprio poder de cálculo para “aposta” e, se houver uma cadeia mais longa, é necessário mudar para esta para continuar a mineração. Porque quanto mais pessoas participam da cadeia, mais provável é que seja a cadeia correta e, finalmente, todos cheguem a um consenso.

O ponto de venda aumentará a capacidade de toda a rede Não será mais necessário chegar a um consenso por meio de grandes quantidades de cálculos sem sentido, e a quantidade de operações em cada nó será próxima da quantidade de cálculos necessários para executar o código do contrato e verificar os dados

O motivo pelo qual o POS ainda não foi adotado é que ainda existem alguns problemas não resolvidos, um deles é o problema do ataque de 51% como o POW, em que 51% da capacidade de computação da rede centralizada em POW tem um certo limite físico, pois a capacidade de computação precisa ser fornecida por dispositivos de computação; em comparação, o Ether de 51% da rede coletada no POS é relativamente fácil, desde que você tenha dinheiro suficiente. O POS é naturalmente mais simples do que o POW, e a lógica do trabalho acima é de lidar com problemas como manter uma lista de verificadores efetiva, congelar o ouro da garantia, penalizar e não devolver, propor blocos e blocos de apostas, evitar ataques de aliança entre verificadores, restaurar a rede após o divórcio, etc.

Outro tema é o “fragmentação”, tanto o Bitcoin quanto o Ethereum, atualmente estão confirmando todas as transações no mesmo Blockchain, o que limita muito a capacidade de computação de uma rede distribuída. Cada nó precisa receber, armazenar e validar cada transação.

Portanto, o Ethereum quer introduzir um mecanismo de “fragmentação” no futuro, para dividir a rede inteira em várias partes, entre as quais a verificação de transações é realizada independentemente. Mas as fragmentações entre elas citam dados de outras fragmentações por meio da estrutura do indicador e afetam outras fragmentações por meio de chamadas asíncronas.

Contract

Esta é a parte em que vou mostrar alguns códigos do Contract que realmente funcionam. O Contract pode ser escrito em muitas linguagens diferentes, que são compiladas em opcode e executadas no EVM. Hoje vamos usar o JavaScript Solidity como exemplo, que é uma das linguagens mais bem mantidas do EVM.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Aqui estão alguns exemplos de gramática básica que você pode usar para declarar variáveis de estado no Solidity:uint storedData;O valor de cada variável é armazenado na blockchain para sempre.structPara declarar uma estrutura de dados complexa; também pode definir funções, que serão executadas quando a transação for recebida, e o iniciador da transação pode escolher quais funções executar, de modo que um contrato pode fornecer várias funções, dentro das quais os valores de julgamento lógico, ciclo e modificação podem ser alterados.

A linguagem inclui algumas pequenas funcionalidades, como os algoritmos de criptografia mais comuns.sha256)), unidade de conversão10 finneyO blogueiro escreveu:0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2E assim por diante.msgÉ uma variável global embutida, que pode ser usada para ler informações relacionadas à transação, como o iniciador, o valor, etc. O Contract pode ser chamado de outro Contract de duas maneiras:delegatecallÉ o equivalente a colocar o código de outro contrato no contexto atual, como se fosse uma função de biblioteca; ecallA lógica é iniciar uma nova transação para desencadear outra Contract.

Então, como o Contract lê e escreve dados do blockchain? Este trabalho complexo é abstraído para “variables de estado”, onde storedData é uma variável de estado. Na verdade, as modificações de variáveis de estado durante a execução do Contract não são armazenadas no blockchain, porque o Contract é executado com base em cálculos definitivos.

A seguir, vou mostrar um exemplo de um Contract Coin que realmente funciona e que emite um token próprio baseado na rede Ethereum:

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Código de origem:http://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

O Contrato, chamado Coin, declara duas variáveis de estado:minterO criador do token usado para armazená-lo está construindo a função ((function Coin()A primeira transação usada para criar o Contract foi atribuída a esta variável; também foi declarado um mapa de endereços de carteira para o número.balances, usado para representar o saldo de cada endereço que detém o token.

mintEsta função julga se o iniciador da transação é o criador do token, e se é, adiciona um certo número de tokens ao endereço indicado de acordo com os parâmetros da função.sendEsta função pode ser chamada por todos e deduzirá um determinado saldo do endereço do iniciador da transação (… se houver um saldo suficiente), somado ao endereço de destino, o que equivale a uma função de transferência.

Também anunciamos um nome:SentO evento, o evento na verdade não terá nenhum papel prático, apenas facilitará a impressão de eventos críticos durante a inicialização, o futuro também facilitará a implementação de clientes leves (clientes leves só aceitam eventos e não executam o contrato).

blockchain-ethereum-mix

O Ethereum fornece um IDE chamado Mix para desativar esse código. No lado direito do Mix, você pode criar blocos e contas para testar seu contrato, e também pode ver como o valor de cada variável de estado muda durante a execução. Vale a pena mencionar que o contrato, uma vez lançado, não pode ser modificado, e a operação posterior é desencadeada por transações de outras pessoas, o que pode ser muito chato para os programadores que escrevem bugs todos os dias, mas o significado do contrato é “contrato”, e quem mais confiaria em seu contrato.

Depois de programado, podemos usar a carteira Ethereum para publicar o contrato na rede:

blockchain-ethereum-create-contract

Para acompanhar este contrato, acesse a página de detalhes do contrato:

blockchain-ethereum-wallet-contract

A esquerda mostra os valores das duas variáveis de estado.minterO valor de “aqui” é o meu endereço, e o de “aqui” é o meu endereço.balancesComo é uma tabela de mapeamento, você pode digitar um endereço para consultar o seu saldo.sendOu…mintFunção, você pode preencher os parâmetros para passar para o Contract. Como aqui nós enviamos uma transação com o objetivo de transmitir uma mensagem, e não o Ether, não temos que definir o valor da transação.

O Contract que eu vou apresentar é um contracto muito interessante, que funciona como uma espécie de fraude ponche, em que você pode pagar 1 Ether para o Contract para entrar no jogo, e depois, para cada 3 pessoas que entram no jogo, eles vão pagar 3 Ether para cada pessoa que entrou no jogo:

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

Código simplificado<https://ethereumpyramid.com/contract.html

O código é muito simples, e o Contract declara uma coisa.participantsA matriz é usada para armazenar os endereços de carteira de todos os participantes em ordem, ou para declarar umpayoutIdxO 3 Ether foi usado para registrar quantos participantes receberam o dinheiro de volta.enterA principal função do contrato é verificar os parâmetros para garantir que cada participante pague 1 Ether, e depois colocar novos participantes no mercado.participantsNo final da matriz, se o número de ordem do participante atual for um múltiplo de 3, ele envia 3 Ether para o terceiro participante.payoutIdxO blogueiro é um participante, e será o primeiro a fazer isso.payoutIdxIndicar para o próximo participante.

Links de referência

HashTree:

  • O Mercador de Bitcoin (MTC) é um sistema de criptomoedas criado pela empresa de criptomoedas Mercador de Bitcoin (MTC) para fornecer informações sobre o mercado de criptomoedas.
  • 100% prova de reservas http://blog.bifubao.com/2014/03/16/proof-of-reserves
  • Modelo de Objeto do Git

Bitcoin:

Halting Problem:

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: