Verificação de Contrato
A verificação de contrato é o processo de corresponder um contrato ink! implantado com o código-fonte e os metadados gerados quando ele foi construído.
O processo de verificação para linguagens de contrato inteligente baseadas em Wasm é mais complexo do que linguagens baseadas em EVM, como o Solidity, devido ao compilador Rust não fornecer compilações determinísticas de contratos.
Para verificar um contrato ink! ou Wasm, o processo de verificação deve recompilar o contrato em um ambiente de hospedagem idêntico ao qual foi originalmente construído. A forma mais simples de fazer isso é usando um contêiner Docker.
Como isso não será possível com contratos inteligentes existentes, foi criado um mecanismo alternativo onde um implantador de contrato pode fornecer um arquivo de metadados assinado para associar ao contrato. Esta abordagem também é detalhada abaixo.
NOTA: No momento atual, a ferramenta CLI cargo-contract
não fornece uma imagem Docker para criação de compilações verificáveis do ink!.
A seguinte issue foi criada com detalhes sobre isso. Como solução intermediária, a Web3 Labs está publicando uma imagem de contêiner para verificação do código-fonte de contratos inteligentes ink!.
A Web3 Labs disponibilizou uma versão pública de seu serviço de verificação para atender aos ecossistemas ink! e DotSama. Isso pode ser usado em conjunto com o contêiner de imagem de compilação verificável para verificar contratos inteligentes ink!.
Os seguintes passos delineiam como criar uma compilação verificável e posteriormente verificá-la usando esses serviços.
Realizando uma compilação verificável
You should already be familiar with using cargo-contract
to compile your contract.
You will need to install the ink! verified image crate:
Você já deve estar familiarizado com o uso do cargo-contract
para compilar seu contrato.
Você precisará instalar o crate ink-verified-image:
Agora você pode realizar uma compilação verificada executando o seguinte comando na pasta do projeto de contratos inteligentes:
NOTA: As compilações reproduzíveis só funcionam com o cargo-contract >= 2.0.2
e contratos gerados com essa versão em diante. Para contornar isso, você pode usar o arquivo de metadados assinado.
Se você estivesse usando o exemplo flipper, você veria uma saída semelhante à seguinte:
Se você tiver algum problema ao executar a compilação, você pode compilá-la manualmente executando os seguintes comandos:
Agora haverá um arquivo zip do pacote disponível que contém o código-fonte do contrato, metadados e o binário Wasm:
Agora que você criou a compilação verificada, pode implantar seu contrato.
Após a implantação, será necessário anotar o hash do código do contrato para poder verificá-lo.
Verificando um contrato inteligente ink!
Usando o aplicativo web de verificação
O Serviço de Verificação ink! é um serviço web RESTful criado para verificar contratos inteligentes implantados usando pallet-contracts
.
A Web3 Labs hospeda uma instância pública do serviço em ink-verifier.sirato.xyz. Uma interface Swagger para o serviço também está disponível em ink-verifier.sirato.xyz/api/api-docs/.
Por favor, escreva em português.
O processo de verificação envolve as seguintes etapas:
O solicitante faz o upload do arquivo de pacote de origem para uma rede e hash de código
O servidor verifica o seguinte:
O código-fonte para a rede e hash de código não está sendo verificado ou já foi verificado
Existem recursos suficientes no host para iniciar uma nova verificação
O servidor faz o download do código Wasm original correspondente à rede e hash de código fornecidos
O servidor transmite o arquivo de arquivamento se for um arquivo compactado
O servidor move os arquivos de encenação para o diretório de processamento
O servidor executa um processo de contêiner para a imagem do verificador para verificar o pacote em processamento. Consulte o fluxo de trabalho de verificação do código-fonte para obter detalhes.
No caso de saída do contêiner, o servidor move os artefatos verificados para o diretório de publicação se a verificação for bem-sucedida, caso contrário, mantém um registro no diretório de erros.
Ele funciona com qualquer rede que esteja definida no pacote @polkadot/apps-config .
Para verificar um contrato implantado usando o serviço, você precisará usar o endpoint /verify/{network}/{codeHash}
, que está documentado aqui.
Depois que um contrato for verificado, você poderá usar os endpoints /contract/{codeHash}/metadata.json
e /contract/{codeHash}/src
para recuperar os metadados e o código-fonte, respectivamente.
Usando o Sirato
Sirato Substrate é um explorador de contratos inteligentes para contratos ink!. Ele integra-se ao serviço de verificação de contratos, permitindo que os usuários façam upload de arquivos de pacote gerados pela imagem de construção verificável por meio da interface do usuário do Sirato, em vez de usar o endpoint da web.
Além disso, uma vez que um contrato tenha sido verificado, os detalhes de qualquer atividade do contrato e eventos que ocorram em uma parachain ou cadeia Substrate são decodificados para o usuário no Sirato.
Por exemplo, para verificar um contrato implantado na parachain Rococo, você pode acessar a instância do Sirato em substrate.sirato.xyz.
A partir daí, você pode navegar até o código implantado clicando na referência do código que corresponde ao código hash retornado pela chamada de instanciação do contrato do cargo contract.
Alternativamente, você pode navegar diretamente digitando a URL https://substrate.sirato.xyz/codes/0x<code-hash>
.
Agora clique na guia de código-fonte:
Em seguida, faça o upload do arquivo package.zip
verificado que você gerou anteriormente.
Agora você pode iniciar o processo de verificação, que inicia uma compilação dos recursos fornecidos.
Ao clicar em "Contract successfully verified
", serão exibidos os arquivos de metadados e código-fonte associados ao seu contrato.
Ao clicar em "Procurar arquivos verificados", serão exibidos os metadados e arquivos de código-fonte associados ao seu contrato.
Se voltarmos para a instância do contrato, todos os métodos ou eventos agora serão decodificados.
Podemos verificar isso invocando um método no contrato. Agora podemos ver o método decodificado que foi chamado no Sirato.
Envio de metadados não verificados
O serviço de verificação suporta o envio de metadados de contrato assinados como uma alternativa adicional aos metadados gerados por builds reproduzíveis. Por favor, observe que os metadados assinados não são verificados e o proprietário do código hash é confiável.
Essa funcionalidade responde a:
O suporte para dados de
build_info
está disponível apenas a partir docargo-contract
2.0.2.Ainda não há uma imagem ou procedimento oficial em relação a builds reproduzíveis.
No entanto, queremos expandir a utilidade do serviço nesse meio tempo.
Embora não seja a forma ideal de associar os metadados a um determinado código hash, isso impede a exploração trivial por meio de:
Verificar se a assinatura é do proprietário da conta do código hash.
Verificar se a mensagem assinada corresponde ao
sha256
dometadata.json
enviado + o código hash dobytecode
do contrato enviado.
Para fornecer metadados assinados, você precisará usar o endpoint /upload/{network}/{codeHash}
, que está documentado aqui.
No corpo da solicitação, você precisará assinar esta mensagem usando a conta que enviou o contrato. Você pode usar a ferramenta de assinatura e verificação no Polkadot.js.
Também é possível usar o Sirato para isso, você pode encontrar instruções aqui.
Last updated
Was this helpful?