WEB3DEV

Cover image for Desenvolvimento de Contrato Inteligente no Protocolo NEAR com Rust
Adriano P. Araujo
Adriano P. Araujo

Posted on

Desenvolvimento de Contrato Inteligente no Protocolo NEAR com Rust

Desvendando as joias do Protocolo NEAR e do Rust

O Protocolo NEAR surge como uma blockchain de ponta, com fragmentação e prova de participação, conquistando seu espaço no mundo das Aplicações Descentralizadas (DApps). Seu ponto de venda exclusivo é a integração com Rust, uma linguagem de programação de sistemas conhecida por seu foco incansável na segurança de memória e concorrência, tornando-se uma candidata ideal para as exigências do desenvolvimento de contratos inteligentes.

Revolucionando Códigos de Contratos Inteligentes

Os princípios de design do Rust priorizam abstrações sem custo, semântica de movimentação e segurança de memória garantida, estabelecendo um alto padrão no domínio do desenvolvimento blockchain. Seu sistema de verificador de empréstimos (borrow checker) e modelo de propriedade são fatores decisivos na prevenção de corridas de dados e garantia de segurança de threads, elementos críticos no mundo imutável e transparente dos contratos inteligentes.

Ferramentas e SDK: A Base da NEAR e do Desenvolvimento em Rust

Desenvolvedores embarcando nessa jornada precisam dominar a ferramenta Rust e as complexidades do CLI e SDK da NEAR.


O NEAR CLI oferece uma variedade de opções ao ser inicializado.
 

Esta caixa de ferramentas não se trata apenas de escrever código Rust; trata-se de entender como transpilar isso para WebAssembly (Wasm) — o bytecode que roda na blockchain NEAR. Esse processo envolve alavancar o poder do cargo, o gerenciador de pacotes e sistema de construção do Rust, e integrar com as bibliotecas específicas da blockchain NEAR fornecidas no SDK.

Configuração da Ferramenta Rust e Wasm

Para começar a desenvolver contratos inteligentes no Protocolo NEAR usando Rust, o primeiro passo envolve configurar o ambiente Rust e a ferramenta WebAssembly (Wasm). A ferramenta Wasm é essencial, pois os contratos inteligentes que você desenvolve serão compilados para Wasm para serem executados na blockchain NEAR. Para usuários do Linux ou MacOS, o processo de configuração é iniciado via linha de comando usando:


curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh   

source $HOME/.cargo/env

Enter fullscreen mode Exit fullscreen mode

Em seguida, a ferramenta wasm32-unknown-unknown é adicionada:


rustup target add wasm32-unknown-unknown

Enter fullscreen mode Exit fullscreen mode

Essa configuração forma a base para o desenvolvimento e implantação de contratos inteligentes baseados em Rust na NEAR.

Inicialização do Projeto: Aplicativo NEAR e SDK Rust

Criar um novo aplicativo NEAR com um front-end integrado pode ser eficientemente feito usando a ferramenta create-near-app. Essa ferramenta simplifica o processo, especialmente ao inicializar com o SDK Rust. O comando abaixo demonstra como iniciar um projeto com o SDK Rust e sem um framework de front-endespecífico (o padrão sendo HTML puro):


npx create-near-app my-project --contract rust --frontend none --tests rust

Enter fullscreen mode Exit fullscreen mode

Para desenvolvedores focados exclusivamente no desenvolvimento e implantação de contratos Rust, é altamente recomendado utilizar o  status message example ou a ferramenta cargo-generate.

Configuração Avançada do Projeto com cargo-generate

Para uma configuração mais personalizada, o cargo-generate é uma ferramenta inestimável. Permite a criação de um novo modelo de projeto, especialmente adaptado para contratos NEAR baseados em Rust. Para inicializar um projeto com o cargo-generate, os seguintes comandos são usados:


cargo install cargo-generate --features vendored-openssl   

cargo generate --git https://github.com/near-examples/rust-status-message --name my-project

cd my-project

Enter fullscreen mode Exit fullscreen mode

Ao gerar manualmente um novo crate com cargo new --lib <nome-da-caixa>, é crucial incluir configurações específicas no arquivo Cargo.toml. Essas configurações garantem a configuração adequada para a compatibilidade com o NEAR SDK, otimização para um tamanho de código pequeno e verificações de segurança em operações aritméticas:


[dependencies]  

near-sdk = "4.0.0"

[lib]  

crate-type = ["cdylib"]  

[profile.release]  

codegen-units = 1  

opt-level = "z"  

lto = true   

debug = false   

panic = "abort"  

overflow-checks = true

Enter fullscreen mode Exit fullscreen mode

Essas configurações no Cargo.toml otimizam o código Rust para execução eficiente no ambiente da blockchain NEAR, garantindo não apenas desempenho, mas também conformidade com padrões de segurança.

Programação Assíncrona e Gerenciamento de Estado em Rust na NEAR

  • Manipulação de Padrões Async/Await: em Rust, gerenciar operações assíncronas envolve dominar a sintaxe async/await, crucial para operações de E/S não bloqueantes — um cenário comum no desenvolvimento de DApps.

  • Contratos Inteligentes Estaduais: quando se trata de gerenciamento de estado em contratos inteligentes na NEAR, entender a abordagem sutil do Rust para alocação de memória e serialização/desserialização de dados é fundamental. O sistema de tipos rigoroso do Rust, combinado com suas poderosas capacidades de macro, permite aos desenvolvedores lidar eficientemente com mudanças de estado e gerenciamento de armazenamento em um ambiente de blockchain.

  • Chamadas e Retornos Entre Contratos: mua investigação aprofundada nas chamadas assíncronas entre contratos da NEAR revela uma interação complexa entre os futuros do Rust e os mecanismos de tratamento de erros. Isso requer um entendimento sofisticado do modelo de simultaneidade do Rust, especialmente em como ele se integra ao ambiente de execução da NEAR e trata padrões de retorno de chamada.

Paradigmas de Segurança em Rust para Aplicações Blockchain

O desenvolvimento em Rust para blockchain exige uma compreensão abrangente das melhores práticas de segurança.

Isso inclui ser habilidoso em aproveitar a segurança de tipos e tratamento de erros do Rust para prevenir vulnerabilidades comuns, como ataques de reentrância, overflows de inteiros e acesso não autorizado — todos muito comuns em ambientes de programação menos rigorosos.

Recursos Avançados do Rust para Contratos Inteligentes Otimizados

Embora os recursos do Rust não previnam automaticamente essas vulnerabilidades lógicas, eles podem contribuir para torná-las menos prováveis:

  • Modelo de Propriedade e Empréstimo: o sistema de propriedade do Rust pode ajudar a gerenciar o estado com mais segurança. Ao impor regras estritas sobre como os dados são acessados e mutados, o Rust pode garantir que o estado não seja alterado inesperadamente durante a execução.

  • Segurança de Tipo e Clareza: o sistema de tipos e os requisitos para  tratamento explícito de possíveis condições de erro tornam mais fácil escrever código claro e compreensível, onde o programador deve considerar casos extremos e vulnerabilidades potenciais.

  • Gestão de Simultaneidade: aproveite o modelo avançado de simultaneidade do Rust, incluindo threads e canais, para criar contratos inteligentes de alto desempenho e escaláveis que possam lidar com cálculos complexos e alta taxa de transferência. As fortes garantias do Rust sobre concorrência podem ajudar em cenários em que as chamadas de contrato são assíncronas, mas isso não se traduz diretamente na prevenção de ataques.

Conclusão: Traçando o Futuro com NEAR e Rust

Esta exploração destaca a combinação formidável do Protocolo NEAR e Rust no ecossistema blockchain.

Como desenvolvedor neste espaço, dominar essas ferramentas e conceitos não se trata apenas de escrever código. Trata-se de abraçar um novo paradigma na computação descentralizada, onde eficiência, segurança e escalabilidade não são apenas ideais, mas pré-requisitos.

A fusão da tecnologia blockchain de ponta da NEAR com as robustas capacidades de programação do Rust representa a vanguarda do desenvolvimento de contratos inteligentes, pavimentando o caminho para uma nova geração de DApps seguros, eficientes e escaláveis.


Este artigo foi escrito por M. Kuck e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Top comments (0)