Neste artigo, vamos explorar o que são contratos inteligentes, quais os tipos existentes, conhecer diversas plataformas de contratos inteligentes, suas características, além de discutir como funcionam e quais benefícios podem trazer. Este material será muito útil para leitores que não estão familiarizados com o tema dos contratos inteligentes, mas que desejam se aprofundar em sua compreensão.
Contrato tradicional vs. contrato inteligente
Antes de mergulharmos nos detalhes, vamos analisar, por meio de um exemplo, as diferenças entre um contrato tradicional, que é elaborado em papel, e um contrato inteligente, que é apresentado de forma digital.

Como funcionava antes dos contratos inteligentes? Imagine um grupo de pessoas que deseja estabelecer algumas regras e condições para a distribuição de valores, assim como um mecanismo para garantir a execução dessa distribuição de acordo com as regras estabelecidas. Anteriormente, essas pessoas se reuniam, elaboravam um documento no qual registravam seus dados de identificação, as condições, os valores envolvidos, datavam e assinavam. Este contrato também era autenticado por uma parte confiável, como um notário. Depois, essas pessoas levavam suas cópias desse contrato e começavam a executar ações que poderiam não corresponder ao que estava estipulado no contrato. Ou seja, faziam uma coisa, enquanto no papel constava que deveriam fazer outra completamente diferente. E como resolver essa situação? Basicamente, alguém do grupo precisava pegar esse documento, reunir algumas provas, ir ao tribunal e lutar para que houvesse conformidade entre o contrato e as ações reais. Muitas vezes, é difícil conseguir que o contrato seja cumprido de forma justa, o que pode resultar em consequências indesejadas.
O que podemos dizer sobre os contratos inteligentes? Eles combinam a possibilidade de redigir as condições do contrato com um mecanismo rigoroso para sua execução. Se as condições foram estabelecidas e uma transação ou solicitação correspondente foi assinada, então, após a aceitação dessa solicitação ou transação, já não é possível alterar as condições ou influenciar sua execução.
Há um validador único ou uma rede inteira, bem como uma base de dados que armazena todos os contratos inteligentes que foram submetidos para execução em uma rigorosa sequência cronológica. Também é importante que essa base de dados contenha todas as condições-gatilho para a execução do contrato inteligente. Além disso, ela deve considerar o valor específico, cuja distribuição é descrita no contrato. Se se trata de alguma moeda digital, a base de dados deve levar isso em conta.
Em outras palavras, os validadores de contratos inteligentes devem ter acesso a todos os dados manipulados pelo contrato inteligente. Por exemplo, uma única base de dados deve ser utilizada para contabilizar simultaneamente moedas digitais, saldos de usuários, transações de usuários e marcas de tempo. Assim, a condição no contrato inteligente pode ser o saldo do usuário em uma determinada moeda, a ocorrência de um certo tempo ou o fato de uma transação ter sido realizada, mas não mais do que isso.
Definição de contrato inteligente
Na verdade, a própria terminologia foi criada pelo pesquisador Nick Szabo e foi aplicada pela primeira vez em 1994, sendo documentada em 1997 em um artigo que descreve a ideia de contratos inteligentes.
Os contratos inteligentes pressupõem que há uma certa automação na distribuição de valor, que pode depender apenas das condições previamente estabelecidas. No seu formato mais simples, isso se apresenta como um contrato com condições rigorosamente definidas, assinado por partes específicas.
Os contratos inteligentes visam minimizar a confiança em terceiros. Às vezes, um centro de tomada de decisões é completamente eliminado, do qual tudo depende. Além disso, para tais contratos, é mais fácil realizar auditorias. Isso resulta de certas peculiaridades do design de tal sistema, mas, na maioria das vezes, entendemos por contrato inteligente um ambiente descentralizado com funções que permitem a qualquer interessado analisar a base de dados e realizar uma auditoria completa da execução dos contratos. Assim, garante-se proteção contra alterações de dados retroativas que poderiam resultar em mudanças na execução do próprio contrato. A digitalização da maioria dos processos na criação e implementação de contratos inteligentes frequentemente simplifica a tecnologia e o custo de sua implementação.
Um exemplo simples — Serviço Escrow
Vamos considerar um exemplo muito simples. Isso ajudará a entender as funcionalidades dos contratos inteligentes e a se orientar melhor sobre quando eles devem ser aplicados.

Ele também pode ser realizado usando Bitcoin, embora ainda seja difícil chamar o Bitcoin de uma plataforma completa para contratos inteligentes. Então, temos um comprador e uma loja online. O comprador deseja comprar um monitor nessa loja. No caso mais simples, o comprador faz e envia o pagamento, e a loja online o aceita, confirma e, em seguida, envia o produto. No entanto, essa situação requer uma grande confiança — o comprador deve confiar todo o valor do monitor à loja online. Como a loja pode ter uma reputação baixa aos olhos do comprador, existe o risco de que, por algum motivo, após receber o pagamento, a loja se recuse a atender e não envie o produto ao comprador. Por isso, o comprador se pergunta (e a loja online também se pergunta) o que pode ser feito para minimizar esses riscos e tornar tais transações mais seguras.
No caso do Bitcoin, é possível permitir que o comprador e o vendedor escolham um mediador de forma independente. Existem muitas pessoas que lidam com questões controversas. E nossos participantes podem escolher, de uma lista geral de mediadores, aquele em quem ambos confiam. Juntos, eles criam um endereço multisig 2 de 3, onde existem três chaves e são necessárias duas assinaturas de quaisquer duas chaves 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 multisig, o comprador enviará o valor necessário para pagar pelo monitor. Agora, quando o vendedor vê que o dinheiro está bloqueado por um tempo no endereço multisig, do qual depende, ele pode enviar o monitor pelo correio sem hesitação.
Em seguida, o comprador recebe o pacote, examina o produto e toma uma decisão sobre a compra final. Ele pode estar completamente satisfeito com o serviço prestado e assinar a transação com sua chave, onde ele transfere as moedas do endereço de multisignature para o vendedor, ou pode estar insatisfeito. Nesse segundo caso, ele entra em contato com o mediador para elaborar uma transação alternativa, que distribuirá essas moedas de maneira diferente.
Suponha que o monitor tenha chegado um pouco arranhado e que não havia cabo de conexão com o computador incluído, embora estivesse escrito no site da loja online que o cabo deveria fazer parte do pacote. Nesse caso, o comprador reúne as evidências necessárias para provar ao mediador que foi enganado nesta situação: ele faz capturas de tela do site, tira uma foto do recibo do correio, registra uma foto dos arranhões no monitor e mostra que o lacre foi rompido e que o cabo foi retirado. A loja online, por sua vez, coleta suas evidências e as encaminha ao mediador.
O mediador está interessado em satisfazer tanto a indignação do comprador quanto os interesses da loja online (isso será explicado adiante). Ele elabora uma transação na qual as moedas do endereço de multisignature serão gastas em uma proporção entre o comprador, a loja online e o mediador, já que ele retém uma parte como recompensa pelo seu trabalho. Suponha que 90% do valor total vá para o vendedor, 5% para o mediador e 5% como compensação ao comprador. Essa transação é assinada pelo mediador com sua chave, mas ainda não pode ser aplicada, pois são necessárias duas assinaturas, e atualmente existe apenas uma. Ele envia essa transação tanto para o comprador quanto para o vendedor. Se pelo menos um deles estiver satisfeito com essa opção de redistribuição das moedas, a transação será co-assinada e propagada na rede. Para validação, basta que um dos participantes do negócio concorde com a proposta do mediador.
É importante escolher um mediador em quem ambas as partes confiem desde o início. Dessa forma, ele atuará de forma independente dos interesses de um ou de outro e avaliará a situação objetivamente. Se o mediador não oferecer uma opção de distribuição das moedas que satisfaça pelo menos uma das partes, então, em conjunto, tanto o comprador quanto a loja online podem transferir as moedas para um novo endereço multisignature, colocando suas duas assinaturas. O novo endereço multisignature será constituído com outro mediador, que talvez seja mais competente na questão e forneça uma melhor opção.
Exemplo com o dormitório e a geladeira
Vamos considerar um exemplo mais complexo que ilustra as capacidades do smart contract de forma mais clara.

Suponha que três rapazes tenham recentemente se mudado para um quarto em um dormitório. Eles estão todos interessados em comprar uma geladeira para o quarto, que utilizarão em conjunto. Um deles se ofereceu para arrecadar o dinheiro necessário para a compra da geladeira e negociar com o vendedor. No entanto, eles se conheceram há pouco tempo e não têm muita confiança entre si. É evidente que dois deles estão correndo o risco ao entregar o dinheiro ao terceiro. Além disso, precisam chegar a um consenso sobre a escolha do vendedor.
Eles podem usar um serviço de escrow, ou seja, escolher um mediador que controle a execução do acordo e resolva disputas, se surgirem. Assim, acordando, eles elaboram um smart contract e estabelecem nele certas condições.
A primeira condição é que, até um certo momento, digamos, dentro de uma semana, o respectivo contrato inteligente deve receber três pagamentos de endereços específicos por um valor determinado. Se isso não acontecer, o contrato inteligente interrompe sua execução e devolve as moedas a todos os participantes. Se a condição for atendida, os valores dos identificadores do vendedor e do mediador são definidos, e também é verificado se todos os participantes concordam 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. Essa abordagem pode proteger os participantes contra fraudes de qualquer lado e, de fato, elimina a necessidade de confiança.
Neste exemplo, vemos o princípio de que essa capacidade de definir parâmetros passo a passo para a execução de cada condição permite criar sistemas de qualquer complexidade e profundidade de níveis. Além disso, primeiro no contrato inteligente pode-se definir a primeira condição, e somente após sua execução, definir os parâmetros para a condição seguinte. Em outras palavras, a condição é formalmente escrita, mas os parâmetros para ela podem ser definidos durante sua execução.
Classificação dos contratos inteligentes
Para a classificação, diferentes grupos de critérios podem ser definidos. No entanto, até o momento, quatro deles são relevantes devido ao desenvolvimento das tecnologias.
Os contratos inteligentes podem ser diferenciados pelo ambiente de execução, que pode ser centralizado ou descentralizado. Em caso de descentralização, temos uma independência e resiliência muito maiores na execução dos contratos inteligentes.
Eles também podem ser diferenciados pelo processo de definição e execução das condições: podem ser programáveis de forma arbitrária, limitados ou pré-configurados, ou seja, estritamente tipificados. Quando na plataforma de contratos inteligentes existem apenas 4 contratos inteligentes específicos, os parâmetros para eles podem ser definidos de forma arbitrária. Assim, é muito mais fácil definí-los: escolhemos um contrato da lista e passamos os parâmetros.
Existem contratos inteligentes automatizados que se autoexecutam ao atingirem determinados critérios, e outros em que as condições são definidas, mas a plataforma não verifica sua execução automaticamente; para isso, precisam ser iniciados separadamente.
Além disso, os contratos inteligentes variam em termos de privacidade. Eles podem ser totalmente públicos, parcialmente públicos ou completamente confidenciais. O último significa que terceiros não veem as condições dos contratos inteligentes. No entanto, o tema da privacidade é bastante abrangente e deve ser abordado separadamente do artigo atual.
A seguir, vamos detalhar os primeiros três critérios para esclarecer melhor o tema em questão.
Contratos inteligentes por meio de execução

Quanto ao ambiente de execução, distingue-se entre plataformas centralizadas e descentralizadas de contratos inteligentes. Nos contratos digitais centralizados, utiliza-se um único serviço, onde há apenas um validador, e pode haver um serviço de backup e recuperação, que também é gerenciado de forma centralizada. Existe um banco de dados que armazena todas as informações necessárias para definir as condições do contrato inteligente e alocar o valor considerado nesse banco de dados do serviço. Esse serviço centralizado tem um cliente que define as condições com solicitações específicas e utiliza esses contratos. Como a plataforma é centralizada, os mecanismos de autenticação podem ser menos confiáveis do que nas criptomoedas.
Como exemplo, podemos considerar provedores de telefonia móvel (diferentes operadoras móveis). Suponha que um determinado operador mantenha de forma centralizada o controle do tráfego em seus servidores, que pode ser transmitido em diferentes formatos, como chamadas de voz, envio de SMS, tráfego de internet móvel e de acordo com diferentes padrões, além de gerenciar os saldos dos usuários. Assim, o provedor de telefonia móvel pode elaborar contratos para registrar os serviços prestados e seus pagamentos com diferentes condições. Nesse caso, é fácil definir condições como 'envie um SMS com um código específico para um determinado número e receba tais condições de alocação de tráfego'.
Pode-se dar mais um exemplo: bancos tradicionais com funcionalidades ampliadas de internet banking e contratos muito simples, como pagamentos regulares, conversão automática de pagamentos recebidos, e dedução automática de porcentagens em uma conta especificada, etc.
Quando se trata de contratos inteligentes em um ambiente de execução descentralizado, há um grupo de validadores. Idealmente, qualquer pessoa pode se tornar um validador. Graças ao protocolo de sincronização de banco de dados e ao alcance de consenso, temos uma base de dados compartilhada que armazenará todas as transações com contratos rigorosamente descritos, e não apenas solicitações condicionais, cujos formatos mudam frequentemente e sem uma especificação aberta. Aqui, as transações conterão instruções para a execução do contrato de acordo com uma especificação rigorosa. Essa especificação é aberta, e, portanto, os próprios usuários da plataforma podem auditar e validar os contratos inteligentes. Observamos que plataformas descentralizadas superam as centralizadas em termos de independência e resiliência, mas seu design e manutenção são muito mais complexos.
Contratos inteligentes com diferentes formas de definição e execução de condições
Agora vamos analisar mais detalhadamente como os contratos inteligentes podem diferir na forma de definir e executar condições. Aqui, focaremos em contratos inteligentes que podem ser programados de forma arbitrária e que são Turing completos. Um contrato inteligente Turing completo permite a definição de praticamente qualquer algoritmo como condição para a execução do contrato: a inclusão de loops, certas funções de cálculo de probabilidades e assim por diante — até mesmo seus próprios algoritmos de assinatura eletrônica. Neste caso, refere-se realmente à escrita arbitrária da lógica.
Existem também contratos inteligentes arbitrários, mas não Turing completos. Isso inclui Bitcoin e Litecoin com seu script. Isso significa que apenas certas operações podem ser usadas em uma ordem arbitrária, mas já não é possível escrever loops e algoritmos próprios.
Além disso, existem plataformas de contratos inteligentes que implementam contratos inteligentes pré-configurados. Entre elas estão Bitshares e Steemit. Bitshares possui uma série de contratos inteligentes para comércio, gerenciamento de contas, administração da própria plataforma e seus parâmetros. Steemit é uma plataforma semelhante, mas em vez de se concentrar na emissão de tokens e comércio, como o Bitshares, ela se destina à publicação de blogs, ou seja, armazena e processa conteúdo de forma descentralizada.
Entre os contratos completos que são Turing-completos, podem ser mencionados a plataforma Ethereum e RootStock, que ainda está em fase de desenvolvimento. Portanto, a seguir, vamos discutir com mais detalhes a plataforma de contratos inteligentes Ethereum.
Contratos inteligentes por método de iniciação
Quanto ao método de iniciação, os contratos inteligentes também podem ser divididos em pelo menos dois grupos: automatizados e manuais (não automatizados). O que caracteriza os contratos automatizados é que, com todos os parâmetros conhecidos e condições satisfatórias, o contrato inteligente é completamente executado automaticamente, ou seja, não requer o envio de transações adicionais e a incorrência de taxas adicionais a cada nova execução. A própria plataforma possui todos os dados necessários para calcular como o contrato inteligente será finalizado. A lógica não é arbitrária, mas previamente definida, e tudo isso é previsível. Isso significa que é possível avaliar com antecedência a complexidade da execução do contrato inteligente, utilizar uma taxa constante para ele e todos os processos de sua execução ocorrem de maneira mais eficiente.
Para contratos inteligentes que são programados de forma arbitrária, a execução não é automatizada. Para iniciar tal contrato inteligente, é necessário criar uma nova transação a cada passo, que chamará a próxima etapa de execução ou o próximo método do contrato inteligente, pagar a taxa correspondente e aguardar a confirmação da transação. A execução pode ser bem-sucedida ou não, pois o código do contrato inteligente é arbitrário e podem surgir momentos imprevisíveis, como um loop infinito, falta de alguns parâmetros e argumentos, exceções não tratadas, etc.
Contas no Ethereum
Tipos de contas Ethereum
Vamos examinar que tipos de contas podem existir na plataforma Ethereum. Há apenas dois tipos de contas e não há outras opções disponíveis. O primeiro tipo é chamado de conta de usuário, e o segundo — conta de contrato. Vamos entender como eles diferem.
A conta do usuário é gerida apenas pela chave privada da assinatura digital. O proprietário da conta gera seu par de chaves para assinatura digital usando o algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm). Apenas transações assinadas por essa chave podem alterar o estado dessa conta.
Para a conta de contrato inteligente, existe uma lógica separada. Ela pode ser gerida apenas através de um código de programação predefinido, que determina completamente o comportamento do contrato inteligente: como ele administrará seus tokens em determinadas circunstâncias, a iniciativa de qual usuário e sob quais condições adicionais esses tokens serão distribuídos. Se certos cenários não forem previstos pelos desenvolvedores no código, podem surgir problemas. Por exemplo, um contrato inteligente pode alcançar um determinado estado em que não aceita a iniciação de nenhuma execução adicional de nenhum dos usuários. Nesse caso, os tokens podem acabar efetivamente congelados, já que o contrato inteligente não prevê uma saída desse estado.
Como as contas são criadas no Ethereum
No caso da conta do usuário, o proprietário gera autonomamente um par de chaves usando ECDSA. É importante notar que o Ethereum utiliza o mesmo algoritmo e a mesma curva elíptica para assinatura digital que o Bitcoin, mas o endereço é calculado de forma ligeiramente diferente. Não se utiliza o resultado da dupla hash, como no Bitcoin, mas sim um hash único com a função Keccak com um comprimento de 256 bits. Os 160 bits inferiores do valor resultante da função hash são cortados. No final, obtemos um endereço no Ethereum. Ele ocupa 20 bytes.
Vale ressaltar que o identificador de conta no Ethereum é codificado em hex sem a aplicação de uma soma de verificação, ao contrário do Bitcoin e 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 é necessário ter cuidado ao trabalhar com identificadores de contas no Ethereum: até mesmo um erro simples no identificador garantirá a perda de moedas.
Há uma característica importante e ela reside no fato de que a conta do usuário no nível do banco de dados geral é criada no momento em que ele recebe o primeiro pagamento.
Em relação à criação da conta do contrato inteligente, aplica-se uma abordagem completamente diferente. Inicialmente, algum usuário escreve o código fonte do contrato inteligente, após o que o código é passado por um compilador específico da plataforma Ethereum, obtendo o bytecode para sua própria máquina virtual Ethereum. O bytecode obtido é colocado em um campo especial da transação. Esta é assinada em nome da conta do iniciador. Em seguida, essa transação se espalha pela rede e publica o código do contrato inteligente. A taxa pela realização da transação e, consequentemente, pela execução do contrato é retirada do saldo da conta do iniciador.
Todo contrato inteligente contém obrigatoriamente seu próprio construtor (deste contrato). Ele pode ser vazio ou pode ter um conteúdo. Após a execução do construtor, é criado um identificador de conta do contrato inteligente, o qual pode ser usado para enviar moedas, chamar certos métodos do contrato inteligente, etc.
Estrutura da transação Ethereum
Para melhor compreensão, vamos analisar a estrutura da transação Ethereum e um exemplo do código do contrato inteligente.

Uma transação Ethereum consiste em vários campos. O primeiro deles, nonce, é um número sequencial da transação em relação à própria conta que a dissemina e é seu autor. Isso é necessário para distinguir transações duplicadas, isto é, para evitar o caso em que a mesma transação é aceita duas vezes. Graças à aplicação do identificador, cada transação tem um valor hash único.
Em seguida, temos um campo chamado gas price. Aqui está indicado o preço pelo qual a moeda base Ethereum é convertida em gas, que é utilizado para pagar a execução de contratos inteligentes e a alocação de recursos de máquinas virtuais. O que isso significa?
No Bitcoin, as taxas são pagas diretamente na moeda base — o próprio Bitcoin. Isso é possível graças a um mecanismo simples de cálculo: pagamos estritamente pelo volume de dados contidos na transação. Na Ethereum, a situação é mais complexa, pois é muito difícil basear-se apenas no volume de dados da transação. Aqui, a transação também pode conter código programático que será executado na máquina virtual, e cada operação da máquina virtual pode ter complexidades diferentes. Também existem operações que alocam memória para variáveis. Elas terão sua própria complexidade, a partir da qual o pagamento por cada operação será estipulado.
O custo de cada operação em equivalentes de gas será constante. Isso é introduzido especialmente para determinar o custo constante de cada operação. Dependendo da carga na rede, o gas price vai mudar, ou seja, o coeficiente segundo o qual a moeda base será convertida nesta unidade auxiliar para o pagamento da taxa.
Há ainda mais uma característica das transações na Ethereum: o bytecode que ela contém para execução na máquina virtual será executado até que conclua com algum resultado (sucesso ou fracasso) ou até que se esgotem certos fundos alocados para o pagamento das taxas. Para evitar situações em que todas as moedas da conta do remetente sejam gastas em taxas em caso de algum erro (por exemplo, se algum loop eterno for acionado na máquina virtual), existe o seguinte campo — start gas (frequentemente chamado de gas limit) — que define o volume máximo de moedas que o remetente está disposto a gastar na execução de uma determinada transação.
O próximo campo é chamado de destination address. Aqui é inserido o endereço do destinatário das moedas ou o endereço de um contrato inteligente específico cujos métodos serão acionados. Após isso, segue um campo valor, onde é inserida a quantia de moedas que estão sendo enviadas para o destination address.
Em seguida, encontra-se um campo interessante chamado de data, onde se insere toda a estrutura. Não é um campo separado, mas uma estrutura completa, na qual se define o código para a máquina virtual. Aqui podem ser inseridos dados arbitrários — para isso existem regras específicas.
E o último campo é chamado de assinatura. Ele contém simultaneamente a assinatura eletrônica do autor dessa transação e a chave pública, que será utilizada para verificar essa assinatura. A partir da chave pública, é possível obter o identificador da conta do remetente dessa transação, ou seja, identificar exclusivamente a conta do remetente dentro do sistema. Quanto à estrutura da transação, já esclarecemos o principal.
Exemplo de código de um contrato inteligente em Solidity
Vamos agora examinar em detalhes o contrato inteligente mais simples como 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á o código-fonte simplificado, que pode reter as moedas dos usuários e devolvê-las mediante solicitação.
Portanto, existe um contrato inteligente chamado Bank, que desempenha as seguintes funções: ele acumula em seu saldo as moedas, ou seja, ao confirmar uma transação e implantar tal contrato inteligente, uma nova conta é criada que pode conter moedas em seu saldo; ele lembra os usuários e a distribuição de moedas entre eles; possui vários métodos de gerenciamento de saldos, ou seja, há a possibilidade de depósito, retirada e verificação do saldo do usuário.
Vamos examinar cada linha do código-fonte. Neste contrato, existem campos constantes. Um deles, do tipo endereço, é chamado de owner. Aqui, o contrato armazena o endereço do usuário que criou este contrato inteligente. Em seguida, há uma estrutura dinâmica que mantém as correspondências entre os endereços dos usuários e seus saldos.
Depois disso, segue o método Bank — ele é chamado da mesma forma que o contrato. Portanto, este é o seu construtor. Aqui, a variável owner é atribuída ao endereço daquele que implantou este contrato inteligente na rede. Isso é tudo o que acontece neste construtor. Ou seja, msg neste caso são exatamente os dados que foram enviados à máquina virtual junto com a transação contendo todo o código deste contrato. Portanto, msg.sender é o autor desta transação, que está implantando este código. Ele será o proprietário do contrato inteligente.
O método deposit permite transferir uma quantidade específica de moedas para a conta do contrato através de uma transação. Neste caso, o contrato inteligente, ao receber essas moedas, mantém-nas em seu saldo, mas registra na estrutura balances quem foi o remetente dessas moedas, para saber a quem elas pertencem.
O próximo método é chamado withdraw e aceita um parâmetro — a quantia de moedas que alguém deseja retirar desse banco. Aqui, há uma verificação se há moedas suficientes no saldo do usuário que chama este método para enviá-las. Se houver saldo suficiente, o próprio contrato inteligente retorna essa quantidade de moedas ao chamador.
A seguir, temos o método que verifica o saldo atual do usuário. Aquela pessoa que chama este método será usada para obter esse saldo no contrato inteligente. Vale ressaltar que o modificador deste método é view. Isso significa que o método não altera nenhuma variável de sua classe e, de fato, é apenas um método de leitura. Uma transação separada não é criada para chamar este método, nenhuma taxa é paga e todos os cálculos são feitos localmente, após os quais o usuário recebe o resultado.
O método kill é usado para destruir o estado do contrato inteligente. Há uma verificação adicional que verifica se quem chama este método é o proprietário do contrato. Se for, o contrato se autodestrói, e a função de destruição aceita 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 serão automaticamente enviadas ao endereço do proprietário do contrato.
Como funciona um nó completo da rede Ethereum?
Vamos descrever graficamente como a execução desses contratos inteligentes na plataforma Ethereum ocorre e como funciona um nó completo da rede.

Um nó completo da rede Ethereum deve ter pelo menos quatro módulos.
O primeiro, como em qualquer protocolo descentralizado, é o módulo de P2P networking — o módulo de conexão em rede e interação com outros nós, onde ocorre a troca de blocos, transações e informações sobre outros nós. Este é um componente tradicional para todas as criptomoedas descentralizadas.
Em seguida, temos o módulo de armazenamento de dados da blockchain, processamento, seleção do ramo prioritário, adição de blocos, desconexão de blocos, verificação desses blocos, etc.
O terceiro módulo é chamado EVM (máquina virtual Ethereum) — é isso máquina virtual, que aceita código de bytes de uma transação Ethereum. Este módulo aceita o estado atual de uma conta específica e aplica mudanças em seu estado com base no código de bytes recebido. A versão da máquina virtual em cada um dos nós da rede deve ser idêntica. Os cálculos ocorrem em cada nó Ethereum de forma absolutamente idêntica, mas acontecem de maneira assíncrona: alguns verificam e aceitam essa transação antes, ou seja, executam todo o código contido nela, enquanto outros fazem isso depois. Assim, quando uma transação é criada, ela se espalha pela rede, os nós a aceitam e, no momento da verificação, assim como no Bitcoin, onde o Bitcoin Script é executado, aqui o código de bytes da máquina virtual é executado.
Uma transação é considerada verificada se todo o código contido nela foi executado, um novo estado de uma conta específica foi gerado e mantido até que se saiba se essa transação foi aplicada ou não. Se a transação foi aplicada, esse estado não é apenas considerado executado, mas também atual. Existe um banco de dados que armazena o estado de cada conta para cada nó da rede. Como todos os cálculos ocorrem de maneira idêntica e o estado da blockchain é o mesmo, o banco de dados que contém os estados de todas as contas também será idêntico para cada nó.
Mitos e limitações dos contratos inteligentes
No que diz respeito às limitações que existem para plataformas de contratos inteligentes semelhantes ao Ethereum, podemos mencionar as seguintes:
- execução de código;
- alocar memória;
- dados da blockchain;
- enviar pagamentos;
- criar um novo contrato;
- chamar outros contratos.
Vamos considerar as limitações impostas à máquina virtual e, consequentemente, desmistificar alguns mitos sobre contratos inteligentes. Em uma máquina virtual, que pode estar não apenas no Ethereum, mas também em plataformas semelhantes, é possível realizar operações lógicas realmente arbitrárias, ou seja, escrever código que será executado ali, e é possível alocar memória adicional. No entanto, a taxa é paga separadamente por cada operação e por cada unidade adicional de memória alocada.
Além disso, a máquina virtual pode ler dados do banco de dados do blockchain, a fim de usar esses dados como gatilho para executar determinada lógica de contratos inteligentes. A máquina virtual pode criar e enviar transações, pode criar novos contratos e invocar métodos de outros contratos inteligentes que já foram publicados na rede: que existem, estão disponíveis, etc.
Um dos mitos mais comuns é que os contratos inteligentes do Ethereum podem usar informações de qualquer recurso da internet em suas condições. A verdade é que a máquina virtual não pode enviar uma solicitação de rede a algum recurso informativo externo na internet, ou seja, não é possível escrever um contrato inteligente que distribua valor entre os usuários com base em, por exemplo, qual é o clima lá fora, ou quem ganhou algum campeonato, ou com base em algum outro evento que ocorreu no mundo externo, porque não há informações sobre esses eventos no banco de dados da própria plataforma. Em outras palavras, não há nada sobre isso no blockchain. Se não aparecer lá, a máquina virtual não pode usar esses dados como gatilhos.
Desvantagens do Ethereum
Vamos listar os principais entre eles. O primeiro defeito é que existem algumas dificuldades no projeto, desenvolvimento e teste de contratos inteligentes na Ethereum (na Ethereum, a linguagem utilizada para escrever contratos inteligentes é a Solidity). De fato, a prática mostra que uma porcentagem muito grande de todos os erros é atribuída ao fator humano. Isso é, de fato, relevante também para os contratos inteligentes já escritos na Ethereum, que têm uma complexidade média ou superior. Enquanto para contratos inteligentes simples a probabilidade de erro é baixa, em contratos inteligentes complexos, erros que resultam em roubo de fundos, congelamento ou até destruição inesperada de contratos inteligentes ocorrem com frequência. Já existem muitos casos conhecidos desse tipo.
O segundo problema é que a própria máquina virtual não é perfeita, pois também foi escrita por humanos. Ela pode executar comandos arbitrários e aí reside uma vulnerabilidade: é possível configurar uma série de comandos de forma que resulte em consequências inesperadas. Este é um campo muito complexo, mas já existem alguns estudos que mostram que essas vulnerabilidades estão presentes na versão atual da rede Ethereum e podem resultar em falhas no funcionamento de muitos contratos inteligentes.
Mais uma grande dificuldade, que pode ser considerada uma desvantagem. Ela consiste no fato de que pode-se, de maneira prática ou técnica, chegar ao ponto em que se compila o bytecode de um contrato que será executado na máquina virtual, é possível determinar uma certa ordem específica de operações. Quando executadas em conjunto, essas operações sobrecarregam muito a máquina virtual e a desaceleram de forma desproporcional à taxa que foi paga pela execução dessas operações.
No passado, houve um período similar de desenvolvimento do Ethereum, onde muitas pessoas que entendiam detalhadamente como funciona a máquina virtual encontravam vulnerabilidades. De fato, as transações pagavam uma taxa muito baixa, mas praticamente desaceleravam toda a rede. Esses problemas são muito difíceis de resolver, pois precisam ser, primeiro, determinados, segundo, o preço para a execução dessas operações deve ser ajustado e, em terceiro lugar, um hard fork deve ser realizado, o que significa a atualização de todos os nós da rede para uma nova versão do software, e depois a ativação simultânea dessas mudanças.
No que diz respeito ao Ethereum, foram realizados muitos estudos e adquirida uma extensa experiência prática: tanto positiva quanto negativa, mas ainda há dificuldades e vulnerabilidades que precisam ser enfrentadas.
Assim, a parte temática do artigo está concluída, vamos passar para as perguntas que surgem com bastante frequência.
Perguntas frequentes
— Se todas as partes do contrato inteligente em vigor desejam alterar os termos, podem elas cancelar esse contrato inteligente com uma múltipla assinatura e depois criar um novo contrato inteligente com os termos atualizados de sua execução?
Aqui, a resposta será dupla. Por quê? Porque, por um lado, o contrato inteligente é definido uma vez e não pressupõe alterações, enquanto, por outro lado, ele pode ter uma lógica pré-definida que prevê a modificação total ou parcial de certas condições. Ou seja, se você quiser mudar algo em seu contrato inteligente, deve previamente definir as condições sob as quais pode atualizar esses termos. Portanto, somente dessa maneira cautelosa é possível organizar a atualização do contrato. Mas aqui também pode haver complicações: cometer um erro e criar uma vulnerabilidade correspondente. Por isso, essas questões devem ser projetadas e testadas de maneira muito detalhada e rigorosa.
— E se o mediador conspirar com uma das partes participantes: escrow ou contrato inteligente? O mediador é obrigatória no contrato inteligente?
Um intermediário não é obrigatório em um contrato inteligente. Ele pode não existir. Se em um caso de escrow o intermediário conluir com uma das partes, então, sim, esse esquema perde rapidamente todo o seu valor. Portanto, os intermediários são escolhidos de forma que todos os lados envolvidos nesse processo confiem neles ao mesmo tempo. Assim, você simplesmente não enviará moedas para um endereço multisignature com aquele intermediário que você não confia.
— É possível transferir diferentes tokens de uma vez só da sua carteira para diferentes endereços de destino, como, por exemplo, endereços de exchanges onde esses tokens são negociados?
Essa é uma boa pergunta e diz respeito ao modelo de transações do Ethereum e suas diferenças em relação ao modelo do Bitcoin. E a diferença é radical. No modelo de transação do Ethereum, você simplesmente transfere moedas, que vão de um endereço a outro, sem troco, apenas a quantia específica que você indicou. Em outras palavras, não é um modelo de saídas não gastas (UTXO), mas sim um modelo baseado em contas e seus respectivos saldos. É teoricamente possível enviar vários tokens diferentes em uma única transação, se você criar um contrato inteligente astuto, mas ainda assim será necessário fazer muitas transações, criar o contrato, depois transferir tokens e moedas para ele, e depois chamar o método correspondente. Isso demanda esforço e tempo, portanto, na prática, isso não funciona assim e todos os pagamentos no Ethereum são realizados em transações separadas.
— Um dos mitos sobre a plataforma Ethereum é que não é possível descrever condições que dependem de dados de um recurso externo da internet, como proceder então?
A solução está no fato de que o próprio contrato inteligente pode prever um ou vários chamados oráculos de confiança, que coletam dados sobre o estado das coisas no mundo externo e os transmitem para os contratos inteligentes por meio de métodos especiais. O contrato em si considera verdadeiros os dados que ele recebe de partes confiáveis. Para maior confiabilidade, geralmente é escolhida um grupo maior de oráculos para minimizar o risco de conluio. O próprio contrato pode desconsiderar dados de oráculos que contrariam a maioria.
Este tema é abordado em uma das aulas do curso online sobre Blockchain — “”.
Fonte: habr.com
