Contratos Atualizáveis
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.
Encaminhamento por Proxy
Este método depende da capacidade dos contratos de encaminhar chamadas para outros contratos.
Propiedades
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.
Substituindo o Código do Contrato por set_code_hash()
set_code_hash()
Seguindo a filosofia de atualização da runtime 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 set_code_hash()
.
Seguindo a filosofia de atualização de tempo de execução do Substrate 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 set_code_hash()
.
Propriedades
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.
Compatibilidade de Armazenamento
É 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:
Uma pequena observação sobre a determinismo dos endereços de contrato.
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.
Exemplos
Exemplos de contratos atualizáveis podem ser encontrados no repositório do ink!.
Last updated