Introdução aos contratos inteligentes

Neste artigo, veremos o que são contratos inteligentes, o que são, conheceremos as diferentes plataformas de contratos inteligentes, suas características e também discutiremos como funcionam e quais vantagens podem trazer. Este material será muito útil para leitores que não estão familiarizados com o tema contratos inteligentes, mas desejam se aproximar de seu entendimento.

Contrato normal vs. contrato inteligente

Antes de nos aprofundarmos nos detalhes, vamos dar um exemplo das diferenças entre um contrato normal, que é especificado em papel, e um contrato inteligente, que é representado digitalmente.

Introdução aos contratos inteligentes

Como isso funcionava antes do advento dos contratos inteligentes? Imagine um grupo de pessoas que pretende estabelecer determinadas regras e condições para a distribuição de valores, bem como um determinado mecanismo para garantir a implementação desta distribuição de acordo com as regras e condições determinadas. Depois reuniam-se, redigiam um papel onde anotavam os seus dados de identificação, os termos, os valores envolvidos, datavam-nos e assinavam-nos. Este contrato também foi certificado por uma parte de confiança, como um notário. Além disso, essas pessoas seguiram direções diferentes com sua cópia impressa de tal contrato e começaram a realizar algumas ações que podem não corresponder ao contrato em si, ou seja, fizeram uma coisa, mas no papel foi certificado que deveriam fazer algo completamente diferente. E como sair dessa situação? Na verdade, um dos membros do grupo precisa pegar esse papel, pegar algumas provas, levá-las a tribunal e conseguir o cumprimento entre o contrato e as ações reais. Muitas vezes, é difícil conseguir uma implementação justa deste contrato, o que leva a consequências desagradáveis.

O que pode ser dito sobre contratos inteligentes? Combinam tanto a possibilidade de redigir os termos do contrato como o mecanismo para a sua estrita implementação. Se as condições tiverem sido definidas e a transação ou solicitação correspondente tiver sido assinada, uma vez aceita essa solicitação ou transação, não será mais possível alterar as condições ou afetar a sua implementação.

Existe um validador ou uma rede inteira, bem como um banco de dados que armazena todos os contratos inteligentes que foram submetidos para execução em estrita ordem cronológica. Também é importante que esse banco de dados contenha todas as condições de gatilho para a execução do contrato inteligente. Além disso, deve levar em consideração o próprio valor cuja distribuição está descrita no contrato. Se isso se aplica a alguma moeda digital, então este banco de dados deve levar isso em consideração.

Em outras palavras, os validadores de contratos inteligentes devem ter acesso a todos os dados nos quais o contrato inteligente opera. Por exemplo, um único banco de dados deve ser usado para contabilizar simultaneamente moedas digitais, saldos de usuários, transações de usuários e carimbos de data/hora. Então, em um contrato inteligente, a condição pode ser o saldo do usuário em uma determinada moeda, a chegada de um determinado horário ou o fato de uma determinada transação ter sido realizada, mas nada mais.

Definição de um contrato inteligente

Em geral, a própria terminologia foi cunhada pelo pesquisador Nick Szabo e usada pela primeira vez em 1994, e foi documentada em 1997 em um artigo que descreve a própria ideia de contratos inteligentes.

Os contratos inteligentes implicam que seja realizada alguma automação na distribuição de valor, que só pode depender das condições pré-determinadas antecipadamente. Na sua forma mais simples, parece um contrato com termos estritamente definidos, que é assinado por determinadas partes.

Os contratos inteligentes são projetados para minimizar a confiança em terceiros. Às vezes, o centro de decisão do qual tudo depende fica completamente excluído. Além disso, esses contratos são mais fáceis de auditar. Isto é consequência de algumas características de design de tal sistema, mas na maioria das vezes entendemos por contrato inteligente um ambiente descentralizado e a presença de funções que permitem a qualquer pessoa analisar a base de dados e realizar uma auditoria completa da execução dos contratos. Isto garante proteção contra alterações retroativas de dados que implicariam alterações na execução do próprio contrato. A digitalização da maioria dos processos ao criar e lançar um contrato inteligente muitas vezes simplifica a tecnologia e o custo da sua implementação.

Um exemplo simples – Serviço de garantia

Vejamos um exemplo muito simples. Isso o ajudará a entender melhor a funcionalidade dos contratos inteligentes, bem como a entender melhor em quais casos eles devem ser utilizados.

Introdução aos contratos inteligentes

Também pode ser implementado usando Bitcoin, embora no momento o Bitcoin ainda dificilmente possa ser chamado de plataforma completa para contratos inteligentes. Então, temos algum comprador e temos uma loja online. Um cliente deseja comprar um monitor nesta loja. No caso mais simples, o comprador completa e envia um pagamento, e a loja online aceita, confirma e envia a mercadoria. Porém, nesta situação é necessária uma grande confiança - o comprador deve confiar na loja online o custo total do monitor. Como uma loja online pode ter baixa reputação aos olhos do comprador, existe o risco de que por algum motivo, após aceitar o pagamento, a loja recuse o serviço e não envie a mercadoria ao comprador. Portanto, o comprador faz a pergunta (e, consequentemente, a loja online faz essa pergunta) o que pode ser aplicado neste caso para minimizar tais riscos e tornar tais transações mais confiáveis.

No caso do Bitcoin, é possível permitir que o comprador e o vendedor selecionem de forma independente um mediador. Existem muitas pessoas envolvidas na resolução de questões controversas. E nossos participantes podem escolher, de uma lista geral de mediadores, aquele em quem confiarão. Juntos, eles criam um endereço com múltiplas assinaturas 2 de 3, onde há três chaves e duas assinaturas com quaisquer duas chaves são necessárias para gastar moedas desse endereço. Uma chave pertencerá ao comprador, a segunda à loja online e a terceira ao mediador. E para esse endereço com múltiplas assinaturas o comprador enviará o valor necessário para pagar pelo monitor. Agora, quando o vendedor perceber que o dinheiro está bloqueado por algum tempo em um endereço multiassinatura que depende dele, ele pode enviar o monitor pelo correio com segurança.

Em seguida, o comprador recebe a encomenda, inspeciona a mercadoria e decide sobre a compra final. Ele pode concordar plenamente com o serviço prestado e assinar a transação com sua chave, onde transfere moedas do endereço multiassinatura para o vendedor, ou pode ficar insatisfeito com alguma coisa. No segundo caso, ele contata um mediador para montar uma transação alternativa que distribua essas moedas de forma diferente.

Digamos que o monitor chegou um pouco arranhado e o kit não incluía cabo para conexão ao computador, embora o site da loja online dissesse que o cabo deveria estar incluso no kit. Em seguida, o comprador coleta as provas necessárias para comprovar ao mediador que foi enganado nessa situação: tira screenshots do site, tira foto do recibo do correio, tira foto dos arranhões no monitor e mostra que o selo foi quebrado e o cabo foi puxado. A loja online, por sua vez, coleta suas provas e as transfere para o mediador.

O mediador está interessado em satisfazer simultaneamente a indignação do comprador e os interesses da loja online (o porquê ficará claro mais tarde). Constitui uma transação em que as moedas de um endereço multiassinatura serão gastas em alguma proporção entre o comprador, a loja online e o mediador, uma vez que este recebe uma parte para si como recompensa pelo seu trabalho. Digamos que 90% do valor total vai para o vendedor, 5% para o mediador e 5% de indenização para o comprador. O mediador assina esta transação com sua chave, mas ela ainda não pode ser aplicada, pois são necessárias duas assinaturas, mas vale apenas uma. Ele envia tal transação tanto para o comprador quanto para o vendedor. Se pelo menos um deles estiver satisfeito com esta opção de redistribuição de moedas, a transação será pré-assinada e distribuída para a rede. Para validá-la, basta que uma das partes da transação concorde com a opção do mediador.

É importante escolher inicialmente um mediador para que ambos os participantes confiem nele. Nesse caso, ele agirá independentemente dos interesses de um ou de outro e avaliará objetivamente a situação. Caso o mediador não ofereça a opção de distribuição de moedas que satisfaça pelo menos um participante, então, após acordo conjunto, tanto o comprador quanto a loja online podem enviar as moedas para um novo endereço com múltiplas assinaturas, colocando suas duas assinaturas. O novo endereço multiassinatura será compilado com um mediador diferente, que poderá ser mais competente no assunto e oferecer uma melhor opção.

Exemplo com dormitório e geladeira

Vejamos um exemplo mais complexo que mostra as capacidades de um contrato inteligente de forma mais explícita.

Introdução aos contratos inteligentes

Digamos que há três caras que recentemente se mudaram para o mesmo dormitório. Os três têm interesse em comprar uma geladeira para o quarto para usarem juntos. Um deles se ofereceu para arrecadar a quantia necessária para comprar uma geladeira e negociar com o vendedor. No entanto, eles se conheceram recentemente e não há confiança suficiente entre eles. Obviamente, dois deles estão arriscando ao dar dinheiro ao terceiro. Além disso, eles precisam chegar a um acordo na escolha do vendedor.

Eles podem utilizar o serviço de escrow, ou seja, escolher um mediador que acompanhará a execução da transação e resolverá questões polêmicas caso surjam. Então, tendo concordado, eles elaboram um contrato inteligente e prescrevem nele certas condições.

A primeira condição é que antes de um determinado período, digamos dentro de uma semana, a conta do contrato inteligente correspondente receba três pagamentos de determinados endereços por um determinado valor. Caso isso não aconteça, o contrato inteligente para de ser executado e devolve as moedas a todos os participantes. Se a condição for atendida, então os valores dos identificadores do vendedor e do mediador são definidos, e é verificada a condição de que todos os participantes concordem com a escolha do vendedor e do mediador. Quando todas as condições forem atendidas, os fundos serão transferidos para os endereços especificados. Esta abordagem pode proteger os participantes contra fraudes de qualquer parte e geralmente elimina a necessidade de confiança.

Vemos neste exemplo o próprio princípio de que essa capacidade de definir parâmetros passo a passo para cumprir cada condição permite criar sistemas de qualquer complexidade e profundidade de níveis aninhados. Além disso, você pode primeiro definir a primeira condição no contrato inteligente e somente após seu cumprimento poderá definir parâmetros para a próxima condição. Em outras palavras, a condição é escrita formalmente e os parâmetros para ela podem ser definidos já durante sua operação.

Classificação de contratos inteligentes

Para classificação, você pode definir diferentes grupos de critérios. Porém, no momento do desenvolvimento tecnológico, quatro deles são relevantes.

Os contratos inteligentes podem ser diferenciados pelo seu ambiente de execução, que pode ser centralizado ou descentralizado. No caso da descentralização, temos muito maior independência e tolerância a falhas na execução de contratos inteligentes.

Eles também podem ser diferenciados pelo processo de configuração e cumprimento de condições: podem ser livremente programáveis, limitados ou predefinidos, ou seja, estritamente digitados. Quando existem apenas 4 contratos inteligentes específicos na plataforma de contratos inteligentes, os parâmetros para eles podem ser definidos de qualquer forma. Assim, configurá-los é muito mais simples: selecionamos um contrato da lista e passamos os parâmetros.

De acordo com o método de iniciação, existem contratos inteligentes automatizados, ou seja, quando ocorrem determinadas condições, são autoexecutáveis, e há contratos em que as condições são especificadas, mas a plataforma não verifica automaticamente o seu cumprimento; para isso eles precisam ser iniciados separadamente.

Além disso, os contratos inteligentes variam no seu nível de privacidade. Eles podem ser totalmente abertos, parcial ou totalmente confidenciais. Este último significa que observadores terceiros não veem os termos dos contratos inteligentes. No entanto, o tema privacidade é muito amplo e é melhor considerá-lo separadamente do artigo atual.

A seguir examinaremos mais de perto os três primeiros critérios para trazer mais clareza ao entendimento do tema atual.

Contratos inteligentes por tempo de execução

Introdução aos contratos inteligentes

Com base no ambiente de execução, é feita uma distinção entre plataformas de contratos inteligentes centralizadas e descentralizadas. No caso dos contratos digitais centralizados, é utilizado um único serviço, onde existe apenas um validador, podendo existir um serviço de backup e recuperação, também gerido centralmente. Existe um banco de dados que armazena todas as informações necessárias para definir os termos do contrato inteligente e distribuir o valor que é levado em consideração neste mesmo banco de dados de serviços. Esse serviço centralizado possui um cliente que estabelece condições para determinadas solicitações e utiliza tais contratos. Devido à natureza centralizada da plataforma, os mecanismos de autenticação podem ser menos seguros do que nas criptomoedas.

Como exemplo, podemos tomar os provedores de comunicações móveis (diferentes operadoras móveis). Digamos que uma determinada operadora mantenha em seus servidores um registro centralizado do tráfego, que pode ser transmitido em diversos formatos, por exemplo: na forma de chamadas de voz, transmissão de SMS, tráfego de Internet móvel, e de acordo com diversos padrões, e também mantém registros de fundos nos saldos dos usuários. Assim, o prestador de comunicações móveis pode celebrar contratos de contabilização dos serviços prestados e do seu pagamento com condições diferenciadas. Neste caso, é fácil definir condições como “envie um SMS com tal e tal código para tal e tal número e receberá tais e tais condições de distribuição de tráfego”.

Mais um exemplo pode ser dado: bancos tradicionais com funcionalidade expandida de Internet banking e contratos muito simples, como pagamentos regulares, conversão automática de pagamentos recebidos, dedução automática de juros para uma conta específica, etc.

Se falamos de contratos inteligentes com ambiente de execução descentralizado, então temos um grupo de validadores. Idealmente, qualquer pessoa pode se tornar um validador. Devido ao protocolo de sincronização de banco de dados e ao consenso, temos algum banco de dados comum que agora armazenará todas as transações com contratos estritamente descritos, e não algumas consultas condicionais, cujos formatos mudam frequentemente e não há especificação aberta. Aqui, as transações conterão instruções para executar o contrato de acordo com uma especificação estrita. Esta especificação é aberta e, portanto, os próprios usuários da plataforma podem auditar e validar contratos inteligentes. Aqui vemos que as plataformas descentralizadas são superiores às centralizadas em termos de independência e tolerância a falhas, mas a sua concepção e manutenção são muito mais complexas.

Contratos inteligentes pelo método de definição e cumprimento de condições

Agora vamos examinar mais de perto como os contratos inteligentes podem diferir na forma como estabelecem e cumprem as condições. Aqui voltamos nossa atenção para contratos inteligentes que são programáveis ​​aleatoriamente e Turing completos. Um contrato inteligente completo de Turing permite que você defina quase todos os algoritmos como condições para a execução do contrato: ciclos de gravação, algumas funções para calcular probabilidades e assim por diante - até seus próprios algoritmos de assinatura eletrônica. Neste caso, queremos dizer uma escrita de lógica verdadeiramente arbitrária.

Existem também contratos inteligentes arbitrários, mas não contratos completos de Turing. Isso inclui Bitcoin e Litecoin com seu próprio script. Isso significa que você pode usar apenas determinadas operações em qualquer ordem, mas não pode mais escrever loops e seus próprios algoritmos.

Além disso, existem plataformas de contratos inteligentes que implementam contratos inteligentes pré-definidos. Isso inclui Bitshares e Steemit. A Bitshares possui uma gama de contratos inteligentes para negociação, gerenciamento de contas, gerenciamento da própria plataforma e seus parâmetros. Steemit é uma plataforma semelhante, mas não está mais focada na emissão de tokens e negociação, como o Bitshares, mas sim em blogs, ou seja, armazena e processa conteúdo de forma descentralizada.

Os contratos arbitrários de Turing completos incluem a plataforma Ethereum e RootStock, que ainda está em desenvolvimento. Portanto, a seguir iremos nos aprofundar um pouco mais detalhadamente na plataforma de contrato inteligente Ethereum.

Contratos inteligentes por método de iniciação

Com base no método de iniciação, os contratos inteligentes também podem ser divididos em pelo menos dois grupos: automatizados e manuais (não automatizados). Os automatizados caracterizam-se pelo fato de que, dados todos os parâmetros e condições conhecidos, o contrato inteligente é totalmente executado de forma automática, ou seja, não requer o envio de nenhuma transação adicional e o gasto de uma comissão adicional em cada execução subsequente. A própria plataforma possui todos os dados para calcular como o contrato inteligente será concluído. A lógica aí não é arbitrária, mas predeterminada e tudo isso é previsível. Ou seja, você pode estimar antecipadamente a complexidade da execução de um contrato inteligente, utilizar algum tipo de comissão constante para ele, e todos os processos para sua implementação serão mais eficientes.

Para contratos inteligentes programados livremente, a execução não é automatizada. Para iniciar esse contrato inteligente, em praticamente cada etapa você precisa criar uma nova transação, que chamará a próxima etapa de execução ou o próximo método de contrato inteligente, pagar a comissão apropriada e aguardar a confirmação da transação. A execução pode ser concluída com sucesso ou não, pois o código do contrato inteligente é arbitrário e podem surgir alguns momentos imprevisíveis, como loop eterno, falta de alguns parâmetros e argumentos, exceções não tratadas, etc.

Contas Ethereum

Tipos de conta Ethereum

Vejamos que tipos de contas podem existir na plataforma Ethereum. Existem apenas dois tipos de contas aqui e não há outras opções. O primeiro tipo é chamado de conta de usuário, o segundo é uma conta de contrato. Vamos descobrir como eles diferem.

A conta do usuário é controlada apenas pela chave pessoal da assinatura eletrônica. O proprietário da conta gera seu próprio par de chaves para assinatura eletrônica usando o algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm). Somente as transações assinadas com esta chave podem alterar o estado desta conta.

Uma lógica separada é fornecida para a conta do contrato inteligente. Só pode ser controlado por um código de software predefinido que determina completamente o comportamento do contrato inteligente: como irá gerir as suas moedas em determinadas circunstâncias, por iniciativa de qual utilizador e sob que condições adicionais estas moedas serão distribuídas. Se alguns pontos não forem previstos pelos desenvolvedores no código do programa, poderão surgir problemas. Por exemplo, um contrato inteligente pode receber um determinado estado no qual não aceita o início de execução adicional de nenhum dos usuários. Nesse caso, as moedas ficarão realmente congeladas, pois o contrato inteligente não prevê a saída desse estado.

Como as contas são criadas no Ethereum

No caso de uma conta de usuário, o proprietário gera independentemente um par de chaves usando ECDSA. É importante notar que o Ethereum usa exatamente o mesmo algoritmo e exatamente a mesma curva elíptica para assinaturas eletrônicas que o Bitcoin, mas o endereço é calculado de uma maneira um pouco diferente. Aqui, o resultado do hash duplo não é mais usado, como no Bitcoin, mas o hash único é fornecido com a função Keccak com comprimento de 256 bits. Os bits menos significativos são cortados do valor resultante, ou seja, os 160 bits menos significativos do valor hash de saída. Como resultado, obtemos um endereço em Ethereum. Na verdade, ocupa 20 bytes.

Observe que o identificador da conta no Ethereum é codificado em hexadecimal sem aplicar uma soma de verificação, ao contrário do Bitcoin e de muitos outros sistemas, onde o endereço é codificado em um sistema numérico de base 58 com a adição de uma soma de verificação. Isso significa que você precisa ter cuidado ao trabalhar com identificadores de conta no Ethereum: mesmo um erro no identificador certamente levará à perda de moedas.

Há uma característica importante: uma conta de usuário no nível geral do banco de dados é criada no momento em que ele aceita o primeiro pagamento recebido.

A criação de uma conta de contrato inteligente adota uma abordagem completamente diferente. Inicialmente, um dos usuários escreve o código-fonte do contrato inteligente, após o qual o código passa por um compilador especial para a plataforma Ethereum, obtendo bytecode para sua própria máquina virtual Ethereum. O bytecode resultante é colocado em um campo especial da transação. É certificado em nome da conta do iniciador. Em seguida, esta transação é propagada por toda a rede e coloca o código do contrato inteligente. A comissão pela transação e, consequentemente, pela execução do contrato é retirada do saldo da conta do iniciador.

Cada contrato inteligente contém necessariamente seu próprio construtor (deste contrato). Pode estar vazio ou pode ter conteúdo. Após a execução do construtor, um identificador de conta de contrato inteligente é criado, com o qual você pode enviar moedas, chamar determinados métodos de contrato inteligente, etc.

Estrutura de transação Ethereum

Para deixar isso mais claro, começaremos a examinar a estrutura de uma transação Ethereum e um exemplo de código de contrato inteligente.

Introdução aos contratos inteligentes

Uma transação Ethereum consiste em vários campos. O primeiro deles, nonce, é um determinado número de série da transação relativo à própria conta que a distribui e é sua autora. Isto é necessário para distinguir transações duplas, ou seja, para excluir o caso em que a mesma transação é aceita duas vezes. Ao usar um identificador, cada transação possui um valor hash exclusivo.

Em seguida vem um campo como preço do gás. Indica o preço pelo qual a moeda base Ethereum é convertida em gás, que é utilizado para pagar a execução do contrato inteligente e a alocação do recurso da máquina virtual. O que isso significa?

No Bitcoin, as taxas são pagas diretamente pela moeda base – o próprio Bitcoin. Isto é possível graças a um mecanismo simples de cálculo: pagamos estritamente pela quantidade de dados contidos na transação. No Ethereum a situação é mais complicada, pois é muito difícil confiar no volume de dados de transações. Aqui, a transação também pode conter código de programa que será executado na máquina virtual, e cada operação da máquina virtual pode ter uma complexidade diferente. Existem também operações que alocam memória para variáveis. Terão uma complexidade própria, da qual dependerá o pagamento de cada operação.

O custo de cada operação em gás equivalente será constante. É introduzido especificamente para determinar o custo constante de cada operação. Dependendo da carga da rede, mudará o preço do gás, ou seja, o coeficiente pelo qual a moeda base será convertida nesta unidade auxiliar para pagamento da comissão.

Há mais uma característica de uma transação no Ethereum: o bytecode que ela contém para execução em uma máquina virtual será executado até que seja concluída com algum resultado (sucesso ou falha) ou até que se esgote uma determinada quantidade de moedas alocadas para pagar a comissão . É para evitar uma situação em que, em caso de algum erro, todas as moedas da conta do remetente sejam gastas em comissão (por exemplo, algum tipo de ciclo eterno iniciado numa máquina virtual), existe o seguinte campo - começar a gasolina (frequentemente chamado de limite de gás) - determina a quantidade máxima de moedas que o remetente está disposto a gastar para concluir uma determinada transação.

O próximo campo é chamado endereço de destino. Isto inclui o endereço do destinatário das moedas ou o endereço de um contrato inteligente específico cujos métodos serão chamados. Depois vem o campo valor, onde é inserida a quantidade de moedas que são enviadas para o endereço de destino.

A seguir está um campo interessante chamado dados,, onde cabe toda a estrutura. Este não é um campo separado, mas toda uma estrutura na qual o código da máquina virtual é definido. Você pode colocar dados arbitrários aqui - existem regras separadas para isso.

E o último campo é chamado assinatura. Contém simultaneamente a assinatura eletrónica do autor desta transação e a chave pública com a qual esta assinatura será verificada. A partir da chave pública é possível obter o identificador da conta do remetente desta transação, ou seja, identificar de forma única a conta do remetente no próprio sistema. Descobrimos o principal sobre a estrutura da transação.

Exemplo de código de contrato inteligente para Solidity

Vamos agora dar uma olhada mais de perto no contrato inteligente mais simples usando um exemplo.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Acima está um código-fonte simplificado que pode conter as moedas dos usuários e devolvê-las sob demanda.

Portanto, existe um contrato inteligente do Banco que desempenha as seguintes funções: acumula moedas em seu saldo, ou seja, quando uma transação é confirmada e tal contrato inteligente é colocado, é criada uma nova conta que pode conter moedas em seu saldo; lembra os usuários e a distribuição de moedas entre eles; possui diversos métodos de gerenciamento de saldos, ou seja, é possível reabastecer, sacar e consultar o saldo do usuário.

Vamos examinar cada linha do código-fonte. Este contrato possui campos constantes. Um deles, do tipo endereço, é denominado proprietário. Aqui o contrato lembra o endereço do usuário que criou este contrato inteligente. Além disso, existe uma estrutura dinâmica que mantém a correspondência entre os endereços dos usuários e os saldos.

Segue-se o método Bank - tem o mesmo nome do contrato. Conseqüentemente, este é o seu construtor. Aqui, à variável proprietário é atribuído o endereço da pessoa que colocou este contrato inteligente na rede. Esta é a única coisa que acontece neste construtor. Ou seja, msg neste caso é exatamente o dado que foi transferido para a máquina virtual junto com a transação contendo todo o código deste contrato. Conseqüentemente, msg.sender é o autor desta transação que hospeda este código. Ele será o dono do contrato inteligente.

O método de depósito permite transferir um determinado número de moedas para a conta do contrato por transação. Nesse caso, o contrato inteligente, ao receber essas moedas, as deixa em seu balanço, mas registra na estrutura de saldos quem exatamente foi o remetente dessas moedas para saber a quem elas pertencem.

O próximo método é chamado de retirada e leva um parâmetro – a quantidade de moedas que alguém deseja sacar deste banco. Isto verifica se há moedas suficientes no saldo do usuário que chama este método para enviá-las. Se houver um número suficiente deles, o próprio contrato inteligente retornará esse número de moedas ao chamador.

A seguir vem o método para verificar o saldo atual do usuário. Quem chamar esse método será utilizado para recuperar esse saldo no contrato inteligente. Vale ressaltar que o modificador deste método é visualizar. Isso significa que o método em si não altera as variáveis ​​de sua classe de forma alguma e, na verdade, é apenas um método de leitura. Nenhuma transação separada é criada para chamar esse método, nenhuma taxa é paga e todos os cálculos são realizados localmente, após os quais o usuário recebe o resultado.

O método kill é necessário para destruir o estado do contrato inteligente. E aqui há uma verificação adicional se o chamador deste método é o proprietário deste contrato. Nesse caso, o contrato se autodestrói e a função de destruição assume um parâmetro - o identificador da conta para a qual o contrato enviará todas as moedas restantes em seu saldo. Neste caso, as moedas restantes irão automaticamente para o endereço do titular do contrato.

Como funciona um nó completo na rede Ethereum?

Vejamos esquematicamente como esses contratos inteligentes são executados na plataforma Ethereum e como funciona um nó de rede completo.

Introdução aos contratos inteligentes

Um nó completo na rede Ethereum deve ter pelo menos quatro módulos.
O primeiro, como qualquer protocolo descentralizado, é o módulo de rede P2P - um módulo para conexão de rede e trabalho com outros nós, onde são trocados blocos, transações e informações sobre outros nós. Este é um componente tradicional para todas as criptomoedas descentralizadas.

A seguir, temos um módulo para armazenar dados de blockchain, processar, escolher uma ramificação prioritária, anexar blocos, desvincular blocos, validar esses blocos, etc.

O terceiro módulo é denominado EVM (máquina virtual Ethereum) - é uma máquina virtual que recebe bytecode das transações Ethereum. Este módulo pega o estado atual de uma conta específica e faz alterações em seu estado com base no bytecode recebido. A versão da máquina virtual em cada nó da rede deve ser a mesma. Os cálculos que ocorrem em cada nó Ethereum são exatamente os mesmos, mas ocorrem de forma assíncrona: alguém verifica e aceita essa transação antes, ou seja, executa todo o código nela contido, e alguém depois. Assim, quando uma transação é criada, ela é distribuída para a rede, os nós a aceitam e, no momento da verificação, da mesma forma que o Bitcoin Script é executado no Bitcoin, o bytecode da máquina virtual é executado aqui.

Uma transação é considerada verificada se todo o código nela contido foi executado, um novo estado de uma determinada conta foi gerado e salvo até que fique claro se esta transação foi aplicada ou não. Se a transação for aplicada, esse estado será considerado não apenas concluído, mas também atual. Existe um banco de dados que armazena o estado de cada conta para cada nó da rede. Devido ao fato de todos os cálculos ocorrerem da mesma forma e o estado do blockchain ser o mesmo, o banco de dados contendo os estados de todas as contas também será o mesmo para cada nó.

Mitos e limitações dos contratos inteligentes

Quanto às restrições existentes para plataformas de contratos inteligentes semelhantes ao Ethereum, podem ser citadas as seguintes:

  • execução de código;
  • alocar memória;
  • dados de blockchain;
  • enviar pagamentos;
  • criar novo contrato;
  • ligue para outros contratos.

Vejamos as restrições impostas a uma máquina virtual e, consequentemente, dissiparemos alguns mitos sobre contratos inteligentes. Em uma máquina virtual, que pode estar não apenas em Ethereum, mas também em plataformas semelhantes, você pode realizar operações lógicas verdadeiramente arbitrárias, ou seja, escrever código e ele será executado lá, você também pode alocar memória. Contudo, a taxa é paga separadamente para cada operação e para cada unidade adicional de memória alocada.

Em seguida, a máquina virtual pode ler dados do banco de dados blockchain para usar esses dados como gatilho para executar uma ou outra lógica de contrato inteligente. A máquina virtual pode criar e enviar transações, pode criar novos contratos e chamar métodos de outros contratos inteligentes que já estão publicados na rede: existentes, disponíveis, etc.

O mito mais comum é que os contratos inteligentes Ethereum podem usar informações de qualquer recurso da Internet em seus termos. A verdade é que uma máquina virtual não pode enviar uma solicitação de rede para algum recurso de informação externo na Internet, ou seja, é impossível escrever um contrato inteligente que distribua valor entre os usuários dependendo, digamos, de como está o tempo lá fora, ou quem ganhou algum campeonato, ou com base em algum outro incidente ocorrido no mundo exterior, porque as informações sobre esses incidentes simplesmente não estão no banco de dados da própria plataforma. Ou seja, não há nada no blockchain sobre isso. Se não aparecer lá, a máquina virtual não poderá usar esses dados como gatilhos.

Desvantagens do Ethereum

Vamos listar os principais. A primeira desvantagem é que existem algumas dificuldades em projetar, desenvolver e testar contratos inteligentes no Ethereum (o Ethereum usa a linguagem Solidity para escrever contratos inteligentes). Na verdade, a prática mostra que uma grande percentagem de todos os erros pertence ao factor humano. Na verdade, isso é verdade para contratos inteligentes Ethereum já escritos que possuem complexidade média ou superior. Se para contratos inteligentes simples a probabilidade de erro é pequena, então em contratos inteligentes complexos há muitas vezes erros que levam ao roubo de fundos, seu congelamento, destruição de contratos inteligentes de forma inesperada, etc. conhecido.

A segunda desvantagem é que a máquina virtual em si não é perfeita, pois também é escrita por pessoas. Ele pode executar comandos arbitrários e é aí que reside a vulnerabilidade: vários comandos podem ser configurados de uma determinada maneira que levará a consequências imprevistas de antemão. Esta é uma área muito complexa, mas já existem vários estudos que mostram que estas vulnerabilidades existem na versão atual da rede Ethereum e podem levar ao fracasso de muitos contratos inteligentes.

Outra grande dificuldade, pode ser considerada uma desvantagem. Está no fato de que você pode chegar à conclusão prática ou técnica de que se você compilar o bytecode de um contrato que será executado em uma máquina virtual, poderá determinar alguma ordem específica de operações. Quando realizadas em conjunto, essas operações irão carregar muito a máquina virtual e torná-la mais lenta desproporcionalmente à taxa paga pela execução dessas operações.

No passado, já houve um período no desenvolvimento do Ethereum, em que muitos caras que entendiam detalhadamente o funcionamento de uma máquina virtual encontravam tais vulnerabilidades. Na verdade, as transações pagavam uma taxa muito pequena, mas praticamente deixavam toda a rede lenta. Estes problemas são muito difíceis de resolver, pois é necessário, em primeiro lugar, determiná-los, em segundo lugar, ajustar o preço de realização destas operações e, em terceiro lugar, realizar um hard fork, o que significa atualizar todos os nós da rede para uma nova versão do software e, em seguida, ativação simultânea dessas alterações.

Quanto ao Ethereum, muita investigação foi realizada, muita experiência prática foi adquirida: tanto positiva como negativa, mas mesmo assim permanecem dificuldades e vulnerabilidades que ainda têm de ser tratadas de alguma forma.

Concluída a parte temática do artigo, passemos às questões que surgem com bastante frequência.

Perguntas mais frequentes

— Se todas as partes de um contrato inteligente existente quiserem alterar os termos, elas podem cancelar esse contrato inteligente usando multisig e, em seguida, criar um novo contrato inteligente com termos atualizados de sua execução?

A resposta aqui será dupla. Por que? Porque por um lado, um contrato inteligente é definido uma vez e já não implica quaisquer alterações, e por outro lado, pode ter uma lógica pré-escrita que prevê a alteração total ou parcial de algumas condições. Ou seja, se você quiser alterar algo em seu contrato inteligente, deverá prescrever as condições sob as quais poderá atualizar essas condições. Assim, só de forma tão prudente poderá ser organizada a renovação do contrato. Mas aqui também você pode ter problemas: cometa algum erro e obtenha uma vulnerabilidade correspondente. Portanto, tais coisas precisam ser muito detalhadas e cuidadosamente projetadas e testadas.

— E se o mediador celebrar um acordo com uma das partes participantes: escrow ou contrato inteligente? É necessário um mediador em um contrato inteligente?

Um mediador não é necessário em um contrato inteligente. Pode não existir. Se, no caso do depósito em garantia, o mediador conspirar com uma das partes, então sim, esse esquema perde drasticamente todo o seu valor. Portanto, os mediadores são selecionados de forma que tenham a confiança de todas as partes envolvidas neste processo ao mesmo tempo. Conseqüentemente, você simplesmente não transferirá moedas para um endereço com múltiplas assinaturas com um mediador em que não confia.

— É possível, com uma transação Ethereum, transferir muitos tokens diferentes do seu endereço para diferentes endereços de destino, por exemplo, endereços de troca onde esses tokens são negociados?

Esta é uma boa pergunta e diz respeito ao modelo de transação Ethereum e como ele difere do modelo Bitcoin. E a diferença é radical. Se no modelo de transação Ethereum você simplesmente transfere moedas, elas são transferidas apenas de um endereço para outro, sem alteração, apenas o valor específico que você especificou. Por outras palavras, este não é um modelo de resultados não gastos (UTXO), mas um modelo de contas e saldos correspondentes. É teoricamente possível enviar vários tokens diferentes em uma transação ao mesmo tempo se você escrever um contrato inteligente astuto, mas ainda terá que fazer muitas transações, criar um contrato, transferir tokens e moedas para ele e, em seguida, chamar o método apropriado . Isso exige esforço e tempo, então na prática não funciona assim e todos os pagamentos no Ethereum são feitos em transações separadas.

— Um dos mitos sobre a plataforma Ethereum é que é impossível descrever condições que dependerão dos dados de um recurso externo da Internet, então o que fazer então?

A solução é que o próprio contrato inteligente possa fornecer um ou mais chamados oráculos confiáveis, que coletam dados sobre o estado das coisas no mundo exterior e os transmitem aos contratos inteligentes por meio de métodos especiais. O próprio contrato considera verdadeiros os dados recebidos de partes confiáveis. Para maior confiabilidade, basta escolher um grande grupo de oráculos e minimizar o risco de conluio. O contrato em si pode não levar em conta dados de oráculos que contrariem a maioria.

Uma das palestras do curso online sobre Blockchain é dedicada a este tema - “Introdução aos contratos inteligentes".

Fonte: habr.com

Adicionar um comentário