From 3ca432320904e1b71b947cc76349108a32598fcd Mon Sep 17 00:00:00 2001 From: Vini Black Date: Tue, 23 Jul 2024 19:09:38 -0300 Subject: [PATCH] Improving section 3 text --- .../pt-BR/Section_3/Lesson_1_Generic_Types.md | 28 +++---- .../pt-BR/Section_3/Lesson_2_Num_Crate.md | 10 +-- .../Lesson_3_Make_Balances_Pallet_Generic.md | 61 +++++++------- .../Lesson_4_Make_System_Pallet_Generic.md | 57 ++++++------- .../Lesson_5_Make_System_Configurable.md | 80 ++++++++++--------- .../Lesson_6_Make_Balances_Configurable.md | 47 ++++++----- .../Section_3/Lesson_7_Tight_Coupling.md | 43 +++++----- 7 files changed, 168 insertions(+), 158 deletions(-) diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_1_Generic_Types.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_1_Generic_Types.md index 3eba43c1..f881abee 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_1_Generic_Types.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_1_Generic_Types.md @@ -44,19 +44,19 @@ No `balances.rs`: use std::collections::BTreeMap; /* - TODO: Defina os tipos comuns usados ​​nesta palete: - - `ID da conta` - - `Equilíbrio` + TODO: Defina os tipos comuns usados ​​nesta pallet: + - `AccountId` + - `Balance` Em seguida, atualize esta paleta para usar esses tipos comuns. */ /// Este é o Módulo de Saldos. -/// É um módulo simples que monitora quanto saldo cada conta tem neste máquina de estado. +/// É um módulo simples que monitora quanto saldo cada conta tem nesta máquina de estado. #[derive(Debug)] pub struct Pallet { - // Um ​​mapeamento simples de armazenamento de contas (`String`) para seus saldos (`u128`). - balances: BTreeMap, + // Um mapeamento simples de armazenamento de contas (`String`) para seus saldos (`u128`). + balances: BTreeMap, } ``` No `system.rs`: @@ -64,20 +64,20 @@ No `system.rs`: use std::collections::BTreeMap; /* - TODO: Defina os tipos comuns usados ​​nesta palete: - - `AccountID` - - `BlockNumber` - - `Nonce` + TODO: Defina os tipos comuns usados ​​nesta pallet: + - `AccountId` + - `BlockNumber` + - `Nonce` - Em seguida, atualize esta paleta para usar esses tipos comuns. + Em seguida, atualize esta paleta para usar esses tipos comuns. */ -/// Este é o Palete do Sistema. +/// Este é o Pallet do Sistema. /// Ele lida com o estado de baixo nível necessário para seu blockchain. #[derive(Debug)] pub struct Pallet { - /// O número do bloco atual. - block_number: u32, + /// O número do bloco atual. + block_number: u32, /// Um ​​mapa de uma conta para seu nonce. nonce: BTreeMap, } diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_2_Num_Crate.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_2_Num_Crate.md index 751ed598..2791d5c9 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_2_Num_Crate.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_2_Num_Crate.md @@ -6,20 +6,20 @@ Você pode encontrar a [solução para a etapa anterior aqui](https://gist.githu Rust é projetado para ser muito leve e fornece muito pouco pronto para uso. -Dentro do ecossistema, muitas funções e recursos que você poderia esperar ser incluídos no Rust `std` ou `core` são na verdade delegados para pequenos crates bem conhecidos e amplamente utilizados. +Dentro do ecossistema, muitas funções e recursos que você poderia esperar ser incluídos no Rust `std` ou `core` são na verdade delegados para pequenos crates bem conhecidos e amplamente utilizados. Para nosso próximo passo, queremos acessar traits para operações numéricas básicas como: -- `CheckedAdd` - Um tipo que suporta `checked_add` -- `CheckedSub` - Um tipo que suporta `checked_sub` +- `CheckedAdd` - Um tipo que suporta `checked_add` +- `CheckedSub` - Um tipo que suporta `checked_sub` - `Zero` - Um tipo que pode retornar o valor zero ao chamar `zero()` -- `One` - Um tipo que pode retornar o valor um ao chamar `one()` +- `One` - Um tipo que pode retornar o valor um ao chamar `one()` Para acessar essas traits, precisaremos importar um novo crate em nosso projeto. ## Cargo.toml -Quando inicializamos nosso projeto, um arquivo `Cargo.toml` foi gerado para nós. +Quando inicializamos nosso projeto, um arquivo `Cargo.toml` foi gerado para nós. Como mencionado antes, é muito semelhante a um arquivo `package.json` que você esperaria encontrar em um projeto Node.js. diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_3_Make_Balances_Pallet_Generic.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_3_Make_Balances_Pallet_Generic.md index 703d80ca..c27d2704 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_3_Make_Balances_Pallet_Generic.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_3_Make_Balances_Pallet_Generic.md @@ -26,7 +26,7 @@ Se quisermos tornar nosso `Pallet` genérico, ele pareceria algo assim: ```rust pub struct Pallet { - balances: BTreeMap, + balances: BTreeMap, } ``` @@ -34,7 +34,7 @@ E implementar funções em `Pallet` pareceria assim: ```rust impl Pallet { - // funções que usam esses tipos + // funções que usam esses tipos } ``` @@ -59,10 +59,10 @@ Isso parecerá assim: ```rust impl Pallet where - AccountId: Ord, - Balance: Zero + CheckedSub + CheckedAdd + Copy, + AccountId: Ord, + Balance: Zero + CheckedSub + CheckedAdd + Copy, { - // functions which use these types and have access to the traits specified + // functions which use these types and have access to the traits specified } ``` @@ -109,13 +109,11 @@ No `balances.rs`: ```rust /* TODO: Você pode precisar importar algumas coisas para este passo. */ use std::collections::BTreeMap; +use num::traits::{CheckedAdd, CheckedSub, Zero}; -type AccountId = String; -type Balance = u128; - -/* - TODO: - Atualize a struct `Pallet` para ser genérica em relação aos tipos `AccountId` e `Balance`. +/* + TODO: + Atualize a struct `Pallet` para ser genérica em relação aos tipos `AccountId` e `Balance`. Você não precisará das definições de tipo abaixo depois de concluir. Os tipos agora serão definidos em `main.rs`. Veja os TODOs lá. @@ -126,14 +124,14 @@ type Balance = u128; #[derive(Debug)] pub struct Pallet { // Um armazenamento simples mapeando contas para seus saldos. - balances: BTreeMap, + balances: BTreeMap, } /* TODO: Os tipos genéricos precisam satisfazer certas características para serem usados ​​nas funções abaixo. - - ID da conta: pedido - - Saldo: Zero + CheckedSub + CheckedAdd + Copiar + - AccountId: Ord + - Balance: Zero + CheckedSub + CheckedAdd + Copy Você pode descobrir essas características deixando o compilador dizer o que está faltando. @@ -144,31 +142,34 @@ pub struct Pallet { #[cfg(test)] mod tests { - #[test] - fn init_balances() { + use super::*; + + #[test] + fn init_balances() { /* TODO: Ao criar uma instância de `Pallet`, você deve definir explicitamente os tipos que usa. */ - let mut balances = super::Pallet::new(); + let mut balances = super::Pallet::new(); - /// ...código anterior. - } + /// ...código anterior. + } - #[test] - fn transfer_balance() { - /* + #[test] + fn transfer_balance() { + /* TODO: Ao criar uma instância de `Pallet`, você deve definir explicitamente os tipos que usa. */ let mut balances = super::Pallet::new(); - /// ...código anterior. - } + /// ...código anterior. + } } ``` No `main.rs`: + ```rust mod balances; mod system; @@ -177,20 +178,20 @@ mod system; // Os módulos são configurados diretamente para esses tipos e satisfazem todos os nossos // requisitos de característica. mod types { - /* + /* TODO: Mova suas definições de tipo para `AccountId` e `Balance` aqui. */ } // Este é o nosso Runtime principal. -// Acumula todos os diferentes paletes que queremos utilizar. +// Acumula todos os diferentes pallets que queremos utilizar. #[derive(Debug)] pub struct Runtime { - system: system::Pallet, - /* TODO: Use suas definições de tipo para seus novos `balances::Pallet` genéricos. */ - balances: balances::Pallet, + system: system::Pallet, + /* TODO: Use suas definições de tipo para seus novos `balances::Pallet` genéricos. */ + balances: balances::Pallet, } ``` Tornar o Balances Pallet genérico é uma habilidade crucial para a criação de soluções blockchain flexíveis e escaláveis. Ótimo trabalho ao concluir esta lição! 🌟 -Poste uma captura de tela em [#progress](https://discord.com/channels/898706705779687435/980906289968345128) mostrando seu tempo de execução com o novo Balances Pallet genérico em ação. É melhor ainda não estar usando &'static str! \ No newline at end of file +Poste uma captura de tela em [#progress](https://discord.com/channels/898706705779687435/980906289968345128) mostrando seu runtime com o novo Balances Pallet genérico em ação. É melhor ainda não estar usando `&'static str`! \ No newline at end of file diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_4_Make_System_Pallet_Generic.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_4_Make_System_Pallet_Generic.md index 97f0c257..d5eb4789 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_4_Make_System_Pallet_Generic.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_4_Make_System_Pallet_Generic.md @@ -32,18 +32,18 @@ mod system; // Módulos são configurados diretamente para esses tipos e eles satisfazem todos os nossos // requisitos de traits. mod types { - pub type AccountId = String; - pub type Balance = u128; - /* TODO: Mova suas definições de tipo para `BlockNumber` e `Nonce` aqui. */ + pub type AccountId = String; + pub type Balance = u128; + /* TODO: Mova suas definições de tipo para `BlockNumber` e `Nonce` aqui. */ } // Este é o nosso Runtime principal. -// Acumula todos os diferentes paletes que queremos utilizar. +// Acumula todos os diferentes pallets que queremos utilizar. #[derive(Debug)] pub struct Runtime { - /* TODO: Use suas definições de tipo para seu novo `system::Pallet` genérico */ - system: system::Pallet, - balances: balances::Pallet, + /* TODO: Use suas definições de tipo para seu novo `system::Pallet` genérico */ + system: system::Pallet, + balances: balances::Pallet, } ``` @@ -57,43 +57,46 @@ type BlockNumber = u32; type Nonce = u32; /* - TODO: - Atualize a estrutura `Pallet` para ser genérica sobre os tipos `AccountId`, `BlockNumber` e `Nonce`. - Você não precisará das definições de tipo acima depois de terminar. - Os tipos agora serão definidos em `main.rs`. Veja os TODOs lá. + TODO: + Atualize a estrutura `Pallet` para ser genérica sobre os tipos `AccountId`, `BlockNumber` e `Nonce`. + Você não precisará das definições de tipo acima depois de terminar. + Os tipos agora serão definidos em `main.rs`. Veja os TODOs lá. */ -/// Este é o Palete do Sistema. +/// Este é o Pallet do Sistema. /// Ele lida com o estado de baixo nível necessário para seu blockchain. #[derive(Debug)] pub struct Pallet { - /// O número do bloco atual. - block_number: BlockNumber, - /// Um ​​mapa de uma conta para seu nonce. - nonce: BTreeMap, + /// O número do bloco atual. + block_number: BlockNumber, + /// Um ​​mapa de uma conta para seu nonce. + nonce: BTreeMap, } /* - TODO: - Os tipos genéricos precisam satisfazer certas características para serem usados ​​nas funções abaixo. - Veja se você consegue descobri-los sozinho. + TODO: + Os tipos genéricos precisam satisfazer certas características para serem usados ​​nas funções abaixo. + Veja se você consegue descobri-los sozinho. - NOTA: Pode ser necessário ajustar algumas das funções abaixo para satisfazer o verificador de empréstimo. + NOTA: Pode ser necessário ajustar algumas das funções abaixo para satisfazer o verificador de empréstimo. */ /// ...código anterior. #[cfg(test)] mod test { - #[test] - fn init_system() { - /* + #[test] + fn init_system() { + /* TODO: Ao criar uma instância de `Pallet`, você deve definir explicitamente os tipos que usa. */ - let mut system = super::Pallet::new(); - + let mut system = super::Pallet::::new(); + /// ...código anterior. - } + } } -``` \ No newline at end of file +``` + +Tornar o Pallet de Sistema genérico é uma habilidade crucial para a criação de soluções blockchain flexíveis e escaláveis. Ótimo trabalho ao concluir esta lição! 🌟 +Poste uma captura de tela em [#progress](https://discord.com/channels/898706705779687435/980906289968345128) mostrando seu runtime com o novo Sistema Pallet genérico em ação. \ No newline at end of file diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_5_Make_System_Configurable.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_5_Make_System_Configurable.md index beb2770a..f899d800 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_5_Make_System_Configurable.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_5_Make_System_Configurable.md @@ -33,7 +33,7 @@ Você poderia criar uma trait `GetName`: ```rust pub trait GetName { - fn name() -> String; + fn name() -> String; } ``` @@ -42,9 +42,9 @@ Então, você poderia implementar essa trait para qualquer objeto. ```rust struct Shawn; impl GetName for Shawn { - fn name() -> String { - return "shawn".to_string(); - } + fn name() -> String { + return "shawn".to_string(); + } } ``` @@ -52,7 +52,7 @@ E então chamar essa função no objeto que a implementa. ```rust fn main() { - println!("{}", Shawn::name()); + println!("{}", Shawn::name()); } ``` @@ -72,7 +72,7 @@ Por exemplo: ```rust pub struct Pallet { - // um monte de coisas + // um monte de coisas } ``` @@ -82,10 +82,10 @@ Para isso, usaremos uma trait com um monte de tipos associados: ```rust pub trait Config { - type AccountId: Ord; - type BlockNumber: Zero + One + AddAssign + Copy; - type Nonce: Zero + One + Copy; - // e mais, se necessário + type AccountId: Ord; + type BlockNumber: Zero + One + AddAssign + Copy; + type Nonce: Zero + One + Copy; + // e mais, se necessário } ``` @@ -93,8 +93,8 @@ Então, podemos definir nosso tipo genérico usando um único parâmetro genéri ```rust pub struct Pallet { - block_number: T::BlockNumber, - nonce: BTreeMap, + block_number: T::BlockNumber, + nonce: BTreeMap, } ``` @@ -102,7 +102,7 @@ e implementar funções usando: ```rust impl Pallet { - // funções usando tipos de T aqui + // funções usando tipos de T aqui } ``` @@ -111,9 +111,9 @@ Vamos tentar entender essa sintaxe rapidamente. 1. Há um tipo genérico `T`. `T` não tem um nome significativo porque representa um monte de coisas, e isso é a convenção mais comumente usada em Rust. 2. `T` é obrigado a implementar a trait `Config`, que definimos anteriormente. 3. Porque `T` implementa `Config`, e `Config` tem os tipos associados `AccountId`, `BlockNumber`, e `Nonce`, podemos acessar esses tipos assim: - - `T::AccountId` - - `T::BlockNumber` - - `T::Nonce` + - `T::AccountId` + - `T::BlockNumber` + - `T::Nonce` Não há diferença significativa entre o que tínhamos antes com 3 parâmetros genéricos e um único parâmetro genérico representado por uma trait `Config`, mas certamente torna tudo mais escalável, fácil de ler e fácil de configurar. @@ -127,17 +127,17 @@ Assim como antes, precisamos de algum objeto que implemente essa trait. No nosso ```rust impl system::Config for Runtime { - type AccountId = String; - type BlockNumber = u32; - type Nonce = u32; + type AccountId = String; + type BlockNumber = u32; + type Nonce = u32; } ``` -Então, ao definir o `system::Pallet` dentro do `Runtime`, podemos usar a seguinte sintaxe: +Então, ao definir o `system::Pallet` dentro do `Runtime`, podemos usar a seguinte sintaxe: ```rust pub struct Runtime { - system: system::Pallet, + system: system::Pallet, } ``` @@ -177,23 +177,23 @@ mod system; // Os módulos são configurados diretamente para esses tipos e satisfazem todos os nossos // requisitos de característica. mod types { - pub type AccountId = String; - pub type Balance = u128; - pub type BlockNumber = u32; - pub type Nonce = u32; + pub type AccountId = String; + pub type Balance = u128; + pub type BlockNumber = u32; + pub type Nonce = u32; } /* - TODO: - Implemente a característica `system::Config` que você criou em seu `Runtime`. - Use `Self` para satisfazer o parâmetro genérico necessário para `system::Pallet`. + TODO: + Implemente a característica `system::Config` que você criou em seu `Runtime`. + Use `Self` para satisfazer o parâmetro genérico necessário para `system::Pallet`. */ // Este é o nosso Runtime principal. -// Acumula todos os diferentes paletes que queremos utilizar. +// Acumula todos os diferentes pallets que queremos utilizar. ``` -On `system.rs`: +No `system.rs`: ```rust use core::ops::AddAssign; @@ -201,22 +201,24 @@ use num::traits::{One, Zero}; use std::collections::BTreeMap; /* - TODO: Combine todos os tipos genéricos e seus limites de características em um único `pub trait Config`. - Quando terminar, seu `Pallet` pode simplesmente ser definido com `Pallet`. + TODO: Combine todos os tipos genéricos e seus limites de características em um único `pub trait Config`. + Quando terminar, seu `Pallet` pode simplesmente ser definido com `Pallet`. */ -/// Este é o Palete do Sistema. +/// Este é o Pallet do Sistema. /// Ele lida com o estado de baixo nível necessário para seu blockchain. #[derive(Debug)] -pub struct Pallet { - /// O número do bloco atual. - block_number: BlockNumber, - /// Um mapa de uma conta até seu nonce. - nonce: BTreeMap, +pub struct Pallet + + { + /// O número do bloco atual. + block_number: BlockNumber, + /// Um mapa de uma conta até seu nonce. + nonce: BTreeMap, } /* - TODO: Atualize todas essas funções para usar seu novo traço de configuração. + TODO: Atualize todas essas funções para usar seu novo traço de configuração. */ /// ...código anterior. diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_6_Make_Balances_Configurable.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_6_Make_Balances_Configurable.md index 8ae3ba13..a3dd3338 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_6_Make_Balances_Configurable.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_6_Make_Balances_Configurable.md @@ -2,6 +2,8 @@ Você pode encontrar a [solução para a etapa anterior aqui](https://gist.githu # Tornando o Pallet de Saldos Configurável +[Youtube](https://youtu.be/Fgk4lCiAw6s?si=NnucDWZFlDYhMbHc) + Não há nada novo para aprender nesta etapa, apenas repetindo o mesmo processo que fizemos para o Pallet de Sistema no Pallet de Saldos. Neste caso, nossa trait `Config` terá apenas dois tipos associados: `AccountId` e `Balance`. @@ -32,53 +34,54 @@ mod system; // Os módulos são configurados diretamente para esses tipos e satisfazem todos os nossos // requisitos de característica. mod types { - pub type AccountId = String; - pub type Balance = u128; - pub type BlockNumber = u32; - pub type Nonce = u32; + pub type AccountId = String; + pub type Balance = u128; + pub type BlockNumber = u32; + pub type Nonce = u32; } // Este é o nosso Runtime principal. -// Acumula todos os diferentes paletes que queremos utilizar. +// Acumula todos os diferentes pallets que queremos utilizar. #[derive(Debug)] pub struct Runtime { - system: system::Pallet, - balances: balances::Pallet, + system: system::Pallet, + balances: balances::Pallet, } impl system::Config for Runtime { - type AccountId = types::AccountId; - type BlockNumber = types::BlockNumber; - type Nonce = types::Nonce; + type AccountId = types::AccountId; + type BlockNumber = types::BlockNumber; + type Nonce = types::Nonce; } /* - TODO: - Implemente o trait `balances::Config` que você criou em seu `Runtime`. - Use `Self` para satisfazer o parâmetro genérico necessário para `balances::Pallet`. + TODO: + Implemente o trait `balances::Config` que você criou em seu `Runtime`. + Use `Self` para satisfazer o parâmetro genérico necessário para `balances::Pallet`. */ + impl Runtime { - // Crie uma nova instância do Runtime principal, criando uma nova instância de cada palete. - fn new() -> Self { - Self { system: system::Pallet::new(), balances: balances::Pallet::new() } - } + // Crie uma nova instância do Runtime principal, criando uma nova instância de cada pallet. + fn new() -> Self { + Self { system: system::Pallet::new(), balances: balances::Pallet::new() } + } } ``` -On `balances.rs`: +No `balances.rs`: ```rust use num::traits::{CheckedAdd, CheckedSub, Zero}; use std::collections::BTreeMap; /* - TODO: Combine todos os tipos genéricos e seus limites de características em um único `pub trait Config`. - Quando terminar, seu `Pallet` pode simplesmente ser definido com `Pallet`. + TODO: Combine todos os tipos genéricos e seus limites de características em um único `pub trait Config`. + Quando terminar, seu `Pallet` pode simplesmente ser definido com `Pallet`. */ /// Este é o Módulo de Saldos. -/// É um módulo simples que monitora quanto saldo cada conta tem neste máquina de estado. +/// É um módulo simples que monitora quanto saldo cada conta tem nesta máquina de estados. #[derive(Debug)] pub struct Pallet { // Um mapeamento simples de armazenamento de contas para seus saldos. @@ -86,7 +89,7 @@ pub struct Pallet { } /* - TODO: Atualize todas essas funções para usar seu novo traço de configuração. + TODO: Atualize todas essas funções para usar seu novo traço de configuração. */ /// ...código anterior. diff --git a/Rust_State_Machine/pt-BR/Section_3/Lesson_7_Tight_Coupling.md b/Rust_State_Machine/pt-BR/Section_3/Lesson_7_Tight_Coupling.md index 5a3dc4a6..9f59ade3 100644 --- a/Rust_State_Machine/pt-BR/Section_3/Lesson_7_Tight_Coupling.md +++ b/Rust_State_Machine/pt-BR/Section_3/Lesson_7_Tight_Coupling.md @@ -18,18 +18,17 @@ Vamos ver alguns exemplos. Podemos estender nosso exemplo anterior para mostrar o que a herança de traits faz com as funções: - ```rust pub trait GetName { - // retorna uma string representando o nome do objeto - fn name() -> String; + // retorna uma string representando o nome do objeto + fn name() -> String; } pub trait SayName: GetName { - // imprimirá o nome de `name()` no console - fn say_name() { - println!("{}", Self::name()); - } + // imprimirá o nome de `name()` no console + fn say_name() { + println!("{}", Self::name()); + } } ``` @@ -40,9 +39,9 @@ Então, quando implementamos essas traits, fica assim: ```rust struct Shawn; impl GetName for Shawn { - fn name() -> String { - return "shawn".to_string(); - } + fn name() -> String { + return "shawn".to_string(); + } } impl SayName for Shawn {} @@ -52,13 +51,14 @@ Poderíamos escolher implementar nossa própria versão da função `SayName`, p ```rust impl SayName for Shawn { - fn say_name() { - println!("My name is {}!", Self::name()); - } + fn say_name() { + println!("My name is {}!", Self::name()); + } } ``` Mas não precisamos fazer isso. O que precisamos fazer é garantir que `GetName` esteja implementado para `Shawn` ou não será possível usar a trait `SayName`. Novamente, não usaremos isso em nosso tutorial, mas é bom ver exemplos de como isso pode ser usado. + ### Tipos Associados Em vez de redefinir `type AccountId` em cada Pallet que precisa dele, e se o definíssemos apenas em `system::Config`, e herdássemos esse tipo em outras configurações de Pallet? @@ -67,7 +67,7 @@ Vamos ver como isso ficaria: ```rust pub trait Config: crate::system::Config { - type Balance: Zero + CheckedSub + CheckedAdd + Copy; + type Balance: Zero + CheckedSub + CheckedAdd + Copy; } ``` @@ -92,15 +92,15 @@ No `main.rs`: /// ...código anterior. impl balances::Config for Runtime { - /* TODO: Depois de herdar do trait `system::Config`, você não precisará de `AccountId` aqui. */ + /* TODO: Depois de herdar do trait `system::Config`, você não precisará de `AccountId` aqui. */ type AccountId = types::AccountId; - type Balance = types::Balance; + type Balance = types::Balance; } /// ...código anterior. ``` -On `balances.rs`: +No `balances.rs`: ```rust use num::traits::{CheckedAdd, CheckedSub, Zero}; @@ -109,9 +109,9 @@ use std::collections::BTreeMap; /// A característica de configuração do Módulo Balances. /// Contém os tipos básicos necessários para lidar com saldos. /* - TODO: - Acople firmemente os saldos ao palete do sistema, herdando a característica `system::Config`. - Depois disso, você não precisará redefinir o tipo `AccountId` aqui. + TODO: + Acople firmemente os saldos ao pallet do sistema, herdando a característica `system::Config`. + Depois disso, você não precisará redefinir o tipo `AccountId` aqui. */ pub trait Config { /// Um ​​tipo que pode identificar uma conta em nossa máquina de estado. @@ -126,7 +126,7 @@ pub trait Config { #[cfg(test)] mod tests { - struct TestConfig; + struct TestConfig; /* TODO: Implemente `crate::system::Config` para `TestConfig` para fazer seus testes funcionarem novamente. */ @@ -141,6 +141,7 @@ mod tests { ``` ### 🌟 Você é uma estrela + VOCÊ CONSEGUIU. Você completou com sucesso a seção 3! Trabalho fantástico :). \ No newline at end of file