🪶Definições de Trait
Através da macro #[ink::trait_definition], agora é possível definir suas próprias definições de trait que podem ser implementadas por contratos inteligentes ink!.
Isso permite definir interfaces compartilhadas de contratos inteligentes para diferentes implementações concretas. Observe que essa definição de trait ink! pode ser definida em qualquer lugar, até mesmo em outra crate!
Veja nosso contrato de exemplo ERC20-Trait para um exemplo detalhado que utiliza definições de trait.
Exemplo
Definido no módulo base_erc20.rs.
#[ink::trait_definition]
pub trait BaseErc20 {
/// Creates a new ERC-20 contract and initializes it with the initial supply for the instantiator.
#[ink(constructor)]
fn new(initial_supply: Balance) -> Self;
/// Returns the total supply.
#[ink(message)]
fn total_supply(&self) -> Balance;
/// Transfers `amount` from caller to `to`.
#[ink(message, payable)]
fn transfer(&mut self, to: AccountId, amount: Balance);
}Uma definição de contrato inteligente ink! pode implementar essa definição de trait da seguinte forma:
Chamar a implementação do trait acima do Erc20 explicitamente pode ser feito da mesma forma que o código Rust normal:
Ainda existem várias limitações nas definições de trait e implementações de trait do ink!. Por exemplo, não é possível definir constantes ou tipos associados ou ter métodos implementados por padrão. Essas limitações existem devido a complexidades técnicas, no entanto, espere que muitas delas sejam abordadas em futuras versões do ink!.
Marcas especiais para definições de trait ink! como definições de trait do ink!.
Existem algumas restrições que se aplicam às definições de trait do ink! que essa macro verifica. Além disso, as definições de trait do ink! devem ter uma estrutura especializada para que a macro #[ink::contract] possa gerar corretamente o código para suas implementações.
Exemplo: Definição
Exemplo: Implementação
Dada a definição de trait acima, você pode implementá-la da seguinte forma:
Last updated
Was this helpful?