Contratos Atualizáveis
Last updated
Was this helpful?
Last updated
Was this helpful?
Embora os contratos inteligentes sejam projetados para serem imutáveis, muitas vezes é necessário realizar uma atualização de um contrato inteligente.
O desenvolvedor pode precisar corrigir um bug crítico ou introduzir um novo recurso.
Para esse tipo de cenário, o ink! possui diferentes estratégias de atualização.
Este método depende da capacidade dos contratos de encaminhar chamadas para outros contratos.
Encaminha qualquer chamada que não corresponda a um seletor próprio para outro contrato.
O outro contrato precisa estar implantado na cadeia on-chain.
O estado é armazenado no armazenamento do contrato para o qual as chamadas são encaminhadas.
Nosso contrato de proxy terá esses 2 campos de armazenamento:
Então, precisamos de uma maneira de alterar o endereço de um contrato para o qual encaminhamos as chamadas e o seletor de mensagem real para encaminhar a chamada:
DICA: Dê uma olhada no padrão de seletor no atributo macro: ao declarar selector = _
, especificamos que todas as outras mensagens devem ser tratadas por este seletor de mensagem.
Usando esse padrão, você pode introduzir outras mensagens em seu contrato de proxy. Todas as mensagens que não forem correspondidas no contrato de proxy serão encaminhadas para o endereço de contrato especificado.
Atualiza o código do contrato usando set_code_hash()
. Isso efetivamente substitui o código que é executado para o endereço do contrato.
O outro contrato precisa estar implantado na cadeia on-chain.
O estado é armazenado no armazenamento do contrato originalmente instanciado.
Basta adicionar a seguinte função ao contrato que você deseja atualizar no futuro.
É responsabilidade do desenvolvedor garantir que o armazenamento do novo contrato seja compatível com o armazenamento do contrato que está sendo substituído.
CUIDADO: Você não deve alterar a ordem em que as variáveis de estado do contrato são declaradas, nem seu tipo!
Violar essa restrição não impedirá uma compilação bem-sucedida, mas resultará na mistura de valores ou na falha ao ler o armazenamento corretamente. Isso pode resultar em erros graves na aplicação que utiliza o contrato.
Se o armazenamento do seu contrato parece assim:
Os procedimentos listados abaixo tornarão o contrato inválido
Alterando a ordem das variáveis:
Removendo uma variável existente:
Alterando o tipo de uma variável:
Introduzindo uma nova variável antes de qualquer uma das existentes:
NOTA: Se o seu contrato utiliza essa abordagem, não é mais válido assumir que um endereço de contrato identifica um hash de código específico. Consulte a issue para obter mais detalhes.
Seguindo a filosofia de atualização da , o ink! também oferece uma maneira fácil de atualizar o código do seu contrato por meio da função especial .
Seguindo a filosofia de atualização de que é a mesma da Lunes, o ink! também oferece uma maneira fácil de atualizar o código do seu contrato por meio da função especial .
Exemplos de contratos atualizáveis podem ser encontrados no .