📧#[ink(message)]

Aplicável a métodos.

Marca um método da struct de armazenamento ink! como mensagem, tornando-o disponível para a API para chamar o contrato.

Observe que todas as funções públicas devem usar o atributo #[ink(message)].

Deve haver pelo menos um método #[ink(message)] definido.

Métodos marcados com #[ink(message)] são especiais, pois são despacháveis ao chamar o contrato. O conjunto de mensagens ink! definidas para um contrato inteligente ink! define sua interface de programação de aplicativos (API), por meio da qual os usuários podem interagir.

Um contrato inteligente ink! pode ter várias mensagens ink! definidas.

Uma mensagem ink! com um receptor &self só pode ler o estado, enquanto uma mensagem ink! com um receptor &mut self pode modificar o armazenamento do contrato.

#[ink(message)]
pub fn purely_reading(&self, from: AccountId) {
    // actual implementation
}

#[ink(message)]
pub fn mutates_storage(&mut self, from: AccountId) {
    // actual implementation
}

Valor de Retorno das Mensagens

O valor de retorno de uma mensagem precisa implementar scale::Encode.

É importante observar que as coleções sob ink_storage, como Vec ou HashMap, não implementam scale::Encode. Isso significa que você não pode simplesmente retornar um Vec de uma mensagem ink!. Essa restrição é intencional - retornar uma estrutura de dados completa com um conteúdo potencialmente ilimitado é um anti-padrão para contratos inteligentes. Basta pensar nos custos de gás imprevisíveis.

Se realmente for absolutamente necessário retornar uma estrutura de dados na sua totalidade, então utilize aquelas fornecidas pelo ink_prelude (por exemplo, ink_prelude::vec::Vec). Essas implementam scale::Encode.

Exemplo

Dada a definição do contrato Flipper acima, adicionamos algumas definições #[ink(message)] da seguinte forma:

#[ink::contract]
mod flipper {
    #[ink(storage)]
    pub struct Flipper {
        value: bool,
    }

    impl Flipper {

        #[ink(constructor)]
        pub fn new(initial_value: bool) -> Self {
            Flipper { value: false }
        }

        /// Flips the current value.
        #[ink(message)]
        pub fn flip(&mut self) {
            self.value = !self.value;
        }

        /// Returns the current value.
        #[ink(message)]
        pub fn get(&self) -> bool {
            self.value
        }
    }
}

Last updated

Was this helpful?