Introdução ao Blockchain e Ethereum

Autora:Zero., Criado: 2016-05-05 17:31:57, Atualizado: 2016-05-05 17:32:31

Origem:https://jysperm.me/2016/05/blockchain-slides/

Este artigo é uma composição de um artigo que eu fiz no LeanCloud no final de março, assumindo que o leitor já tenha conhecimento básico de criptografia e uma compreensão preliminar da implementação do Bitcoin.

O blockchain, também chamado de cadeia de blocos, pode ser considerado uma espécie de HashTree (árvore de hash), e por isso possui algumas propriedades semelhantes às do HashTree:

blockchain-hash-tree

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

Ou seja, em uma estrutura arbórea, cada terminal tem um valor de parcela, enquanto os valores de parcela dos não-terminal são derivados de parcela de todos os seus sub-nósticos diretos, portanto, cada node contém, direta ou indiretamente, informações de todos os seus sub-nósticos. Assim, sempre que o valor de parcela de qualquer terminal for alterado, o valor de parcela de todos os seus nodos-pais também será alterado.

Eu posso citar uma aplicação do HashTree: "100% de prova de reservas", que pertence ao tipo de "prova de zero conhecimento". Podemos considerar um cenário em que o detentor do Bitcion precisa enviar Bitcoin para uma troca, e, em teoria, a troca pode deslocar o dinheiro (o saldo da conta registrada de todos os usuários), algo que os usuários não querem ver, e a troca também quer se certificar: a troca publica primeiro um endereço de Bitcoin que eles possuem, para que todos possam confirmar que a transação realmente tem tanto Bitcoin como reserva, mas como provar que esse dinheiro é realmente maior do que o total de todos os usuários?

blockchain-proof-of-reserves

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

Podemos construir uma HashTree, onde todos os nodes finais representam um usuário e contêm o saldo do usuário.Σ) e fragmentos de IDs de usuários (como endereços de correio eletrônico)h), enquanto o nó pai contém a soma do saldo de seus nós filhos.sum) e fragmentos de informações de todos os sub-nósticoshashPara cada usuário, basta mostrar a ele seu próprio terminal e seu irmão, todos os seus nodos paternos e seus nodos irmãos, pois esse usuário pode confirmar que seu saldo foi incluído no pai e finalmente incluído no núcleo raiz através de um processo de rastreamento progressivo do pai.

Dessa forma, a informação exibida a cada usuário é apenas sua própria informação e alguma informação agregada, e cada usuário pode confirmar que seu saldo está contido no núcleo raiz sem saber de outros saldos de uso.hParae4df9d12O ponto não deve ser um ponto final que representa o usuário, mas um ponto de informação agregado (que pode conter um usuário com saldo 3333, e um usuário fictício com saldo zero) 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:http://gitbook.liuhui998.com/1_2.html(GPL v2)

No Git, qualquer arquivo (Blob), índice (Tree) ou compromisso (Commit) tem um Hash determinado pelo seu conteúdo. Se dois objetos tiverem o mesmo conteúdo, eles terão o mesmo Hash. No Git, o histórico de todo o repositório é um Blockchain, cada Commit é equivalente a um Bloco, o Commit contém o Hash do Commit anterior e o Hash do objeto relacionado que foi modificado.

O Git usa o Blockchain para definir um histórico único para o repositório. Se um Commit for modificado, todos os Hashes dos Commits que o seguem serão alterados. Claro que, como o Git é apenas uma ferramenta de controle de versão, isso não impede que você modifique o histórico (apesar de tudo, você pode rebase e depois).push --forceO site do blog do autor, que é o site oficial do blog do autor, afirma que a alteração foi notada por todos os co-autores.

Outra aplicação clássica do Blockchain é o Bitcoin, que é o Bitcoin que divulgou a palavra Blockchain (o conceito sempre existiu):

blockchain-bitcoin-block-data

Imagem: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 contabilidade descentralizada. Como um novo Bloco é gerado a cada dez minutos, e uma vez que o Bloco é gerado, ele permanece para sempre no Blockchain, o Blockchain fixa a ordem em que as transações ocorrem, mantendo a ordem antecedente das transações, determinando se uma conta tem um saldo suficiente para iniciar uma transação.

Bitcoin

A primeira parte deste post é uma simples revisão do Bitcoin.

A geração de blocos em Bitcoin é realizada por meio de uma "prova de volume de trabalho", ou seja, todos os "mineiros" envolvidos na "mineração" devem realizar uma computação computacional relacionada a um cálculo em conjunto, de natureza aleatória, até que um número aleatório que atenda a determinadas condições seja calculado e obtenha o direito de publicar um bloco.

Por definição, cada minerador sempre vai confiar no "cadeia mais longa" e calcular o próximo bloco com base no mais longo conhecido que atende às regras, caso contrário, seu poder de computação será desperdiçado em branco.

O Bitcoin é projetado para gerar um novo Bloco a cada 10 minutos, o que é feito por todos juntos, observando o intervalo de tempo entre os blocos anteriores, para ajustar a dificuldade da geração do próximo bloco. Quando os blocos anteriores são gerados mais rápido do que o esperado, todos pensam que o próximo bloco deve ser gerado com maior dificuldade.

Normalmente, cada nó Bitcoin precisa de armazenar um conjunto completo de dados Blockchain para confirmar se uma transação é legítima. Se o iniciador da transação tem um saldo suficiente para iniciar a transação. Mas agora o blockchain completo já tem 66G, e ainda está crescendo a uma taxa de cerca de 0.1G por dia. Se exigir que cada usuário do Bitcoin armazene o blockchain completo não é muito exigente, então o Bitcoin possui um mecanismo de "SPV de confirmação simplificada, verificação de pagamento simplificada", o chamado "cliente de nível leve", que pode optar por não armazenar o blockchain completo, mas se está ligado a um ou mais nódulos completos, armazenando apenas todos os elementos de informação (Hash, comprovação de transação, trabalho), e então verificar o volume de trabalho de cada bloco de comprovação, sempre que necessário para verificar o ponto de transação onde a transação está localizada.

blockchain-bitcoin-state-machine

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

  • O Blockchain é o livro de contabilidade, o registro de mudanças de estado.
  • Transaction Arrow Transaction Arrow Uma mudança de estado
  • O Block é um "consenso" sobre o estado atual.

Na verdade, podemos imaginar o Blockchain do Bitcoin como uma "máquina de estado", onde todo o Blockchain é um "livro" de estado, onde são armazenados registros de todas as transações, com base nesses registros, é possível deduzir 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" dos mineradores da rede Bitcoin sobre o estado atual, porque o Bitcoin gera um novo Bloco a cada 10 minutos, o que equivale a um consenso sobre o saldo de todas as contas a cada 10 minutos, e entre esses dez minutos, o estado da conta é um estado de "caos".

Alt Coin

Muitas outras moedas criptográficas derivadas do Bitcoin, muitas vezes chamadas de "Alt Coin", geralmente têm duas realizações:

O primeiro é o uso de sua própria rede, independente do Bitcoin, o que significa que o Bitcoin pode criar seus próprios protocolos e regras com muita flexibilidade, mas sua defesa contra ataques maliciosos será muito fraca porque o número de usuários é difícil de alcançar o nível de Bitcoin.

A segunda é a implementação de um "metaprotócol" da rede Bitcoin, com informações personalizadas em cima das transações do Bitcoin para implementar sua própria lógica. O benefício é que você pode usar a escala de computação do Bitcoin para resistir aos ataques, mas ao mesmo tempo, não todos os mineradores que estão ligados à rede Bitcoin cumprem as regras do Bitcoin, portanto, não é possível impedir que blocos não conformes entrem no Blockchain, apenas filtrando transações não conformes no cliente, nem aproveitando a funcionalidade de confirmação simplificada oferecida pelo Bitcoin mencionada anteriormente.

Para essas moedas, o Bitcoin pode fornecer um Blockchain com a participação de um grande número de mineradores, capaz de resistir a ataques maliciosos em larga escala, e também pode conter dados personalizados nas transações do Bitcoin, deixando um espaço para a implementação do Bitcoin.

A Bitocin também oferece umaBitcoin ScriptO Bitcoin é usado para realizar transações mais complexas, mas como essa não é a função central do Bitcoin, só é possível realizar operações mais simples, ler apenas dados muito limitados no Blockchain e escrever lógica completa de Turing, por causa da falta de mecanismos de ciclo.

Ethereum

blockchain-ethereum

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

O Ethereum é uma plataforma de aplicativos descentralizada baseada em blockchain, que combina a infraestrutura do Bitcoin com a tecnologia blockchain baseada em criptografia para criar uma plataforma universal e complementar algumas funcionalidades que a rede Bitcoin não possui para que os desenvolvedores possam executar seus próprios aplicativos descentralizados no Blockchain.

Antes de falar em detalhes sobre o Ethereum, vou falar sobre as duas principais bases de uma rede descentralizada: criptografia e jogo. A criptografia, naturalmente, é uma questão de segurança matemática através de criptografia de chave pública, assinaturas digitais, arranjos e algoritmos de resumo; enquanto o jogo é uma questão de segurança em uma rede descentralizada, onde qualquer pessoa, incluindo quem deseja atacar a rede maliciosamente, pode participar e deve pensar na relação de interesse de cada participante ao projetar uma rede descentralizada.

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 alguma ligação com o mundo físico para definir "benefícios". Por exemplo, na rede Bitcoin, se um atacante quiser alterar artificialmente o rumo da Blcokchain, ele precisará ter um poder de computação maior do que todos os outros mineradores, enquanto no mundo físico, o poder de computação é fornecido por equipamentos de computação, que precisam ser comprados do mundo físico.

Portanto, em uma rede descentralizada, nem todos os problemas são resolvidos pela "tecnologia", e as partes que não são alcançadas pela tecnologia devem ser resolvidas por meio de lucros, por meio de incentivos econômicos. Também por causa da necessidade de incentivos econômicos, o Ethereum também possui um sistema de carteira (a unidade monetária é chamada "Ether") em que cada usuário tem um endereço de carteira como seu único identificador, sendo bastante semelhante ao Bitcion nesse ponto.

O "contrato" é 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. Mas no Ethereum, além de um endereço possuído por uma chave, há um endereço possuído pelo "código", o Contract.

  • Os resultados da computação não precisam ser armazenados no blockchain, pois podem ser recomputados a qualquer momento.
  • É possível chamar funções de outros contratos (o código e os dados de outros contratos também existem no blockchain).
  • No processo de execução, novas transações podem ser criadas (manipulação do seu próprio saldo de carteira) e essas transações podem ser executadas por outros Contratos.

Para começar, um exemplo de uma carteira compartilhada é o cliente oficial do Ethereum, que possui um recurso para criar carteiras para várias pessoas:

blockchain-ethereum-multi-sig-wallet

A função permite criar um endereço de carteira compartilhado com outras duas pessoas, com um máximo de 100 Ether por dia para cada pessoa, e, se esse limite for excedido, deve ser obtido com o consentimento da outra pessoa.

Esta função cria um contrato, que é descrito pela lógica acima através do código no contrato. Quando você deseja gastar dinheiro com o seu colete, você precisa enviar uma mensagem para o colete (transação é uma mensagem, o valor da transação pode ser zero, carregando apenas dados), e o código do colete é executado, iniciando uma transação de gasto real se o pedido de gasto estiver de acordo com a lógica acima, caso contrário, o pedido de gasto será rejeitado sem um item de gasto real.

Outro exemplo é o "contrato de hedge", que tem sido criticado como uma moeda digital cujo valor (e a taxa de câmbio da moeda legal) é instável, e muitas vezes ocorre que o valor da moeda suba ou desça duas vezes entre os dias, mas se um contrato de hedge for implementado com o Contract, o problema pode ser resolvido até certo ponto.

Nós chamaremos de "risque avoiders" as pessoas que querem manter o valor da moeda estável, e chamamos de "risque takers" as outras que estão dispostas a assumir o risco de fluctuação da moeda e lucrar com isso, para que eles possam acordar um valor (por exemplo, 1000 CNY) e uma janela de tempo (por exemplo, um mês) e criar um contrato que execute a seguinte lógica:

  • O evitador de risco envia 1000 CNY de Ether para o endereço da carteira do Contrato, e o risco assumido envia 1000 CNY (ou mais) de Ether para o Contrato para pagar (se ninguém pagar, o evitador de risco pode recuperar seu Ether).
  • Depois de um mês, o evasor pode retirar o Ether do Contrato, que tinha um valor de 1000 CNY, e o restante do Ether é recuperado pelo arriscador, independentemente da taxa de câmbio entre o Ether e o CNY.

Se o valor do Ether aumentar, o risco assumido ganha, se o valor do Ether cair, o risco assumido perde, mas o risco evitado sempre não perde. Claro, o risco evitado e o risco assumido podem acordar previamente uma "taxa de seguro" que o risco evitado deve pagar, ou também o risco assumido deve fornecer uma garantia de vários vezes mais de 1000 CNY ("o maior o risco que o risco pode assumir").

No exemplo acima, há também um problema que não é muito bem resolvido, que é como determinar a taxa de câmbio entre o Ether e a moeda legal, como mencionamos anteriormente, o Contract só tem acesso a dados no blockchain, enquanto a moeda legal é um dado que existe no mundo físico e não no mundo criptográfico, e precisamos de introduzir esse tipo de "dados do mundo não criptográfico" no blockchain por meio de algum mecanismo.

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

  • Todos podem depositar uma caução no Contract e fornecer uma taxa de câmbio.
  • No final da janela de tempo, o Contract calcula e publica a média das taxas de câmbio oferecidas por todos (de acordo com o peso da garantia).
  • O valor da garantia recolhida será distribuído entre os 25% mais próximos da média (de acordo com o peso da garantia).

Para qualquer participante que não conheça as ofertas dos outros, apresentar uma taxa de câmbio real tem uma maior probabilidade de receber um prêmio, enquanto apresentar uma taxa de câmbio muito estranha terá uma grande chance de perder a garantia.

É claro que há algumas falhas nesta regra, como que se uma pessoa tem muito dinheiro para pagar, ela pode tirar a média para um preço mais alto ou mais baixo do que a taxa de câmbio real, ao mesmo tempo em que ganha um prêmio, e faz com que outras pessoas que oferecem a taxa de câmbio precisa percam o seu dinheiro. Mas é o mesmo no mundo físico, se você tem muito dinheiro também pode aumentar ou reduzir o preço de um produto, mas o volume da moeda eletrônica é pequeno em relação ao mundo físico e não precisa de muito dinheiro para fazê-lo; mas, na verdade, aumentar ou reduzir o preço de câmbio maliciosamente também é muito arriscado, porque você não tem certeza se o seu dinheiro pago é suficiente, e se você falhar, perderá todo o seu dinheiro.

Outra falha é que "todo mundo pode depositar em seu contrato e fornecer uma moeda". Este passo é feito através da criação de transações, e todas as transações são escritas no Blockchain, de modo que a moeda que você submete é visível para outras pessoas, criando ainda mais oportunidades para atacantes mal-intencionados.

No início, nós mencionamos que o contrato pode ler os dados no Blockchain, mas os dados no Blockchain são determinados, e se nós vamos implementar uma aplicação semelhante ao jogo, de onde é que vamos obter um número aleatório?

Uma fonte de números aleatórios que pode ser pensada é o Hash do próximo Bloco, e, na maioria dos casos, esse grau de aleatoriedade é suficiente. Mas a verdade é que o minerador pode manipular esse número aleatório até certo ponto, assumindo que um minerador participe de um jogo e o ganho do jogo é maior do que o ganho de um bloco, então se esse minerador escavar um bloco que o fará perder o jogo, então obviamente o minerador optará por não divulgar o novo bloco, o que é mais evidente no caso do poder computacional de um minerador individual.

Portanto, precisamos introduzir um mecanismo semelhante ao de coleta de taxas de câmbio para coletar um número aleatório de sementes e, em seguida, usar essas sementes para calcular um número aleatório em conjunto no final de cada janela de tempo. Mas, assim como a coleta de taxas de câmbio, uma vez que os participantes realizam a submissão de taxas de câmbio através da criação de transações, portanto, entre uma janela de tempo, os números aleatórios submetidos por cada pessoa são visíveis para os outros, de modo que uma pessoa que já participou de um jogo de azar pode selecionar cuidadosamente um número aleatório de sementes para que as sementes submetidas por outras pessoas, além do número de sementes aleatórias novas produzidas, atendam exatamente às suas expectativas.

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

  • Fase I: Todos podem fazer um depósito no Contract e fornecer "o valor de lote de uma semente escolhida aleatoriamente".
  • Fase II: os participantes da fase I fornecem sementes não segregadas ao Contract.
  • Fase II termina: o contrato seleciona todas as sementes legítimas, gera um conjunto de números aleatórios e é divulgado; no segundo estágio, a garantia é para quem forneceu a semente correta.

No primeiro estágio, você só conhece o valor de lote das sementes submetidas por outras pessoas, mas não conhece as sementes reais, e, portanto, não pode criar uma semente para intervir nos resultados; no segundo estágio, todos só confirmam as sementes submetidas no primeiro estágio, não podem submeter novas sementes, nem podem impedir que outras pessoas submetam sementes.

O Bitcoin Script não oferece a capacidade de circular, regressar, saltar, etc. Talvez o Bitcoin seja para controlar o tempo de execução do Bitcoin Script, porque, de acordo com o "teorema de paralisação" de Turing, os programas escritos pela linguagem de programação completa de Turing não podem sempre determinar, apenas do ponto de vista da análise estática, se terminam após um número limitado de passos, de modo que os atacantes mal-intencionados podem construir uma transação que causará um ciclo de morte para interferir no funcionamento normal dos mineiros.

O Ethereum, por sua vez, contorna o problema através de "incentivos econômicos", o Contract é executado em opcode (código operativo) em uma máquina virtual chamada EVM (Ethereum Virtual Machine), uma máquina virtual que possui um "cargo" próprio, no qual o padrão do EVM define a quantidade de Gás consumida por cada opcode, um recurso de computação comprado pelo Ether, com base na memória e no tempo de CPU necessários para a operação. Quando o objetivo de uma transação é o Contract, o código do Contract é executado, o iniciador da transação precisa pagar pelo Gás consumido durante a execução do Contract, declarando "a quantidade máxima de Gás que ele está disposto a pagar", e se o meio termo for esgotado, o Contract será interrompido.

Então, vamos voltar ao problema do "intervalo de consenso", mencionado anteriormente, um novo bloco é criado a cada 10 minutos em Bitcoin, ou seja, a rede inteira chega a um "consenso" a cada 10 minutos, então as transações normais de Bitcoin demoram até dez minutos para serem confirmadas.

Isso ocorre porque os intervalos de consenso mais rápidos aumentam a vantagem do "minério centralizado" até certo ponto. O chamado "minério" significa que os mineiros do Bitcoin se reúnem para minerar, os mineiros obedecem incondicionalmente às instruções do minério e, finalmente, acordam com o minério para dividir os lucros, obviamente, o Bitcoin, como um sistema descentralizado, não quer que esse minério centralizado tenha vantagens adicionais.

Quando um minerador A desenterra um novo bloco, ele irá divulgar este bloco, e os outros, assim que receberem a mensagem, começarão a trabalhar imediatamente com base no novo bloco. Enquanto outros, a contagem do tempo entre "A desenterrou o novo bloco" e "recebeu a mensagem de divulgação de A" é praticamente desperdiçada, enquanto os outros mineradores do pool centralizado não terão esse problema, pois podem obter informações sobre o novo bloco mais rapidamente e começar a trabalhar imediatamente com base no novo bloco.

blockchain-ethereum-without-uncles

O tempo de transmissão pode levar cerca de dez segundos, o que não é muito importante para 10 minutos, mas se reduzirmos o intervalo de consenso, os benefícios do pool de mineração centralizado serão cada vez mais evidentes. No entanto, o Ethereum resolveu esse problema introduzindo o conceito de "Uncle Block", reduzindo o intervalo de consenso para 15 segundos, o que representa um grande avanço em relação ao Bitcoin na velocidade de confirmação de pagamentos.

No Blockchain do Bitcoin, um Bloco pode ter apenas um bloco pai e um bloco filho. Mas no Ethereum, um bloco recém-gerado pode ter um bloco pai e vários blocos-irmãos. Voltando ao exemplo acima, se um novo bloco é escavado em A, mas outros não receberam a transmissão, se alguém escavar um novo bloco no tempo da transmissão, mas porque a transmissão não foi aceita por todos, então esse bloco tem a possibilidade de se tornar o "bloco-irmão" do próximo bloco.

blockchain-ethereum-uncles

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

Problemas não resolvidos

Em seguida, nesta seção, vou mostrar alguns dos problemas que o Ethereum ainda não resolveu.

O primeiro é que o Ethereum atualmente é um consenso de que, tal como o Bitcoin, é garantido por POW (prova de volume de trabalho), e que apenas os nós que completam um determinado volume de trabalho podem participar do trabalho da geração de blocos. O problema da prova de volume de trabalho é que desperdiça muito poder de computação para garantir a segurança da rede, embora isso também seja baseado na ideia de "incentivo econômico" mencionada anteriormente, mas na verdade pode ser melhorado.

O POS é uma garantia de que todos os nós que querem participar da produção de blocos (mineração no sentido tradicional) precisam de um sistema (o sistema refere-se a um protocolo onde todos os nós consideram que o dinheiro é "congelado") para pagar uma garantia, e então todos usam seu próprio dinheiro para apostar no que pode ser o próximo Bloco.

O modelo é muito semelhante ao POW, onde os mineiros "apostam" com seu próprio poder de computação e, se uma cadeia for mais longa, é necessário mudar para a cadeia para continuar a mineração. Porque o maior número de pessoas envolvidas é mais provável que a cadeia seja a correta e, finalmente, um consenso é alcançado.

O POS aumentará o tráfego da rede inteira. O consenso não será mais necessário através de um grande número de cálculos sem sentido, e o volume de operações de cada nó será mais próximo do volume de operações para executar o código no contrato e fazer a verificação de dados.

Claro que o POS ainda não foi adotado, porque ainda há alguns problemas que não foram resolvidos, um deles é o problema do ataque de 51% como o POW, onde o 51% do poder de computação da rede inteira centralizada no POW tem uma certa limitação física. Porém, o poder de computação é necessário para fornecer o equipamento de computação; em comparação, coletar 51% do Ether da rede inteira no POS é comparativamente mais fácil, desde que você tenha dinheiro suficiente.

Outro tópico é o "fragmento", tanto Bitcoin quanto Ethereum, que atualmente confirmam todas as transações no mesmo Blockchain, o que limita drasticamente a capacidade de computação de uma rede distribuída.

Assim, Ethereum espera introduzir um mecanismo de "fragmentação" no futuro, para dividir a rede inteira em várias partes, para verificar transações independentemente entre elas. Mas entre os fragmentos, por meio da estrutura de ponteiros, os dados de outros fragmentos serão referenciados, e outros fragmentos serão afetados por uma chamada assíncrona, de modo que a rede inteira permaneça unida aos olhos do usuário, mas a capacidade de processamento da rede inteira terá uma grande escalabilidade.

Contrato

Nesta seção, vou mostrar alguns códigos reais e funcionais para o Contract. O Contract pode ser escrito em muitas linguagens de padrões diferentes, que eventualmente serão compiladas em opcode e executadas no 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á uma demonstração de algumas gramáticas básicas que você pode declarar variáveis de estado no Solidity.uint storedData;O valor das variáveis é mantido para sempre no Blockchain; pode ser usado para obter informações sobre o conteúdo da blockchain.structPara declarar estruturas de dados complexas; também é possível definir funções que serão executadas quando o 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 o valor pode ser modificado.

A linguagem tem algumas funções pequenas e úteis, como o algoritmo de criptografia comum.sha256) ◄ Compensação por unidades ((10 finneyNão, não, não, não.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(Risos)msgÉ uma variável global embutida, que pode ser usada para ler informações relacionadas com a transação, como iniciador, quantia, etc. O contrato pode ser chamado de dois modos:delegatecallO que é o mesmo que colocar o código de outro Contract para executar no contexto atual, como se fosse introduzir uma função de biblioteca;callA lógica é iniciar uma nova transação para desencadear outro contrato.

Então, como é que um contrato lê e escreve dados no blockchain? Este trabalho complexo é abstraído para uma "variavel de estado", onde o storedData é uma variável de estado. Na verdade, as modificações de uma variável de estado durante a execução de um contrato não são salvas no blockchain, porque o contrato é executado como um cálculo de certeza.

A seguir, vou mostrar um contracto realmente disponível para lançar seu próprio token 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);
    }
}

O código vem dehttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example(MIT)

Este contrato, chamado Coin, declara duas variáveis de estado, que são as seguintes:minterO criador do token, que é usado para armazenar este código, está construindo funções para o seu computador.function Coin()A primeira transação que foi usada para criar o contrato foi atribuída a essa variável; também foi declarado um mapa de endereços de carteiras para números.balancesA moeda é usada para indicar o saldo de cada endereço que possui o token.

mintEsta função determina se o iniciador da transação é o criador do token, e se for o caso, adiciona um determinado 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 subtrai um determinado saldo do endereço do iniciador do transação (se houver um saldo suficiente) e o acrescenta ao endereço do alvo, o que equivale a uma função de transferência.

Nós também anunciamos um projeto chamadoSentOs eventos não têm qualquer efeito prático, apenas para imprimir eventos críticos durante o depurador, e no futuro também facilitará a implementação do cliente leve (o cliente leve só aceita eventos e não executa o contrato).

blockchain-ethereum-mix

Ethereum fornece um IDE chamado Mix para debuggar o código. No lado direito do Mix, você pode criar blocos e contas para testar seu contrato e ver como o valor de cada variável de estado muda durante a execução. Vale a pena mencionar que o contrato não pode ser modificado uma vez lançado, e sua execução é desencadeada exclusivamente por transações de outras pessoas, o que é muito chato para programadores que escrevem bugs todos os dias, mas o significado do contrato é "contrato", ou quem vai confiar em seu contrato uma vez que você lança um contrato que naturalmente não pode ser modificado.

Depois de ser escrito, podemos lançar o contrato na web com a carteira Ethereum:

blockchain-ethereum-create-contract

Depois da publicação, você pode acompanhar este contrato, acessando a interface detalhada do contrato:

blockchain-ethereum-wallet-contract

No lado esquerdo, você pode ver os valores das duas variáveis de estado.minterO valor é o meu próprio endereço.balancesComo é um mapa, você pode inserir um endereço para consultar o seu saldo. No lado direito você pode iniciar uma nova transação para este contrato e há um menu desabafador para escolher.sendOumintA função, você pode preencher o parâmetro de passar para o contrato. Como aqui o objetivo de enviar uma transação é transmitir uma mensagem, e não transmitir Ether, não precisamos definir o valor da transação.

Agora vou apresentar um contrato muito interessante, um contrato que realiza um efeito de "fraude de Ponzi", onde você pode pagar 1 Ether para entrar no jogo, e depois cada três pessoas que entram no jogo recebem 3 Ether para os primeiros que entram:

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;
    }
}

O código é simplificadohttps://ethereumpyramid.com/contract.html

O código é muito simples, o contrato declara uma coisa.participantsO conjunto é usado para armazenar o endereço de carteira de todos os participantes em ordem, ou declarar umpayoutIdxPara registrar quantos participantes receberam 3 Ether antes.enterA principal função implementada neste contrato é primeiro verificar alguns parâmetros, garantir que cada participante pague 1 Ether, e depois colocar novos participantes em uma caixa de eters.participantsNo final do conjunto, se o número de participantes for um múltiplo de 3, enviaremos 3 Ether para o terceiro participante.payoutIdxA partir de agora, o projeto será lançado.payoutIdxA partir de agora, o site irá mostrar o seguinte participante.

Links de referência

HashTree:

Bitcoin:

Problemas de paragem:

Ethereum:

Rede Ethereum:

Próximo do Ethereum:

Contrato:

Contrato IDE:


Mais.

Sonhos pequenosEu não sei o que fazer, mas eu sei o que fazer, eu sei o que fazer.

XuanxuanAfinal, o chefe foi pesquisar o BTC com o ETH.

MomoxNão entendo.