WEB3DEV

Cover image for Contratos inteligentes na Blockchain Sui
Rafael Ojeda
Rafael Ojeda

Posted on • Atualizado em

Contratos inteligentes na Blockchain Sui

Contratos inteligentes na Blockchain Sui

Image description

Neste tutorial, vamos implantar um contrato inteligente simples "Move" na blockchain Sui e interagir com ele através da CLI (Interface de Linha de Comando).

Instalação ⏳

1 .Vamos supor que você tenha o Rust instalado. Se não, instale-o através do seguinte comando em seu terminal:

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

2 .Instale a CLI da Sui

cargo install --locked --git https://github.com/MystenLabs/sui.git --branch devnet sui sui-node

Saiba que levou ~15mins no meu Mac M1

Se você estiver tendo problemas, é possível que você tenha que instalar algumas dependências, e eu lhe indicarei a documentação da Sui: https://docs.sui.io/build/install

CLI da Sui 💻

Vamos primeiro configurar o Cliente Sui:

sui client

Este comando deve lhe fazer duas perguntas, digite y e depois [enter] . O resultado deve gerar um arquivo Sui Config em ~/.sui/sui_config e direcionar a rede de desenvolvimento (devnet) para https://fullnode.devnet.sui.io:443

Em seguida, vamos gerar um novo endereço de carteira e depositar alguns tokens Sui..

1 .Gerar um novo endereço: sui client new-address ed25519

Isto gerará o endereço e uma frase mnemônica que você deve guardar e manter em segurança. Esta é essencialmente sua chave privada.

Você pode verificar seu endereço ativo via sui client active-address e mudar para um novo endereço via sui client switch --address [ADDRESS].

2 .Obtenha alguns tokens Sui para pagar o gas. Observação: Os tokens Sui são armazenados em Objetos de Gas. Entraremos no que são Objetos mais tarde.

O seguinte comando chegará à torneira (faucet) Sui da rede de desenvolvimento e transferirá alguns tokens:

curl --location --request POST 'https://faucet.devnet.sui.io/gas' \
--header 'Content-Type: application/json' \
--data-raw '{"FixedAmountRequest":{"recipient":"0x7d76f97e7ef402d769c14d37d50bd0ff5387054e"}}

Observação: Você precisará substituir o recipient pelo endereço que você gerou acima.

Você pode verificar seu saldo através do sui client gas que resultará em algo assim:

Object ID | Gas Value
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
0x87005db87b63122393bef1d096625005a958d4f6 | 49998362

Contratos Inteligentes 🔮

Vamos implantar um Contrato inteligente simples. A Sui usa sua própria versão da linguagem de programação Move. Move é baseada em rust. Você pode ler mais sobre a linguagem abaixo:

Image description

Este contrato simples criará objetos Sword (espada) e rastreia quantos são gerados através de um objeto Forge (forja). Vamos começar:

1 .Crie um novo pacote move: sui move new forge
Isto cria uma nova pasta com um arquivo de configuração Move.toml e uma pasta/sources vazia.

2 .Crie um novo arquivo na pasta sources sources/forge.move e copie o seguinte módulo para o novo arquivo:

// bifurcado a partir de
https://github.com/MystenLabs/sui/blob/main/sui_programmability/examples/move_tutorial/sources/my_module.move





module forge::forge {


   // Parte 1: importações


   use sui::object::{Self, UID};


   use sui::transfer;


   use sui::tx_context::{Self, TxContext};







   // Parte 2: definições estruturais


   struct Sword has key, store {


       id: UID,


       magic: u64,


       strength: u64,


   }







   struct Forge has key, store {


       id: UID,


       swords_created: u64,


   }







   // Parte 3: inicializador de módulo a ser executado quando este módulo for publicado


   fun init(ctx: &mut TxContext) {


       let admin = Forge {


           id: object::new(ctx),


           swords_created: 0,


       };


       // transferir o objeto de forja para o módulo/embalagem da editora


       transfer::transfer(admin, tx_context::sender(ctx));


   }







   // Parte 4: acessórios necessários para a leitura dos atributos estruturais 


   public fun magic(self: &Sword): u64 {


       self.magic


   }







   public fun strength(self: &Sword): u64 {


       self.strength


   }







   public fun swords_created(self: &Forge): u64 {


       self.swords_created


   }







   // parte 5: funções públicas/entradas (introduzidas mais tarde no tutorial)


   public entry fun sword_create(forge: &mut Forge, magic: u64, strength: u64, recipient: address, ctx: &mut TxContext) {


       // crie uma espada


       let sword = Sword {


           id: object::new(ctx),


           magic: magic,


           strength: strength,


       };


       forge.swords_created = forge.swords_created + 1;


       transfer::transfer(sword, recipient);


   }
```


3 .Publique o contrato para a rede de desenvolvimento da Sui 


`sui client publish --gas-budget 1000`


>Observação: certifique-se de estar na pasta forge

Se tudo correu bem, você deve notar um resultado semelhante ao seguinte: 

`Created Objects:
- ID: 0x040db4f46d7b794b60376c9ee5fd00bbb537d395 , Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )
- ID: 0x1579b045da6ff20009585ce5728200643f9df2e2 , Owner: Immutable
Mutated Objects:
- ID: 0x87005db87b63122393bef1d096625005a958d4f6 , Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )`


Há *dois* objetos criados e *um* objeto modificado.


O primeiro objeto criado: 0x040db4f46d7b794b60376c9ee5fd00bbb537d395 é o objeto Forge da linha 15 no código acima. Note que o Proprietário deve ser seu endereço atual.

O segundo objeto criado: 0x1579b045da6ff20009585ce5728200643f9df2e2 é o próprio contrato. Você pode dizer isso, uma vez que o Proprietário é *imutável* neste caso.

O objeto modificado: 0x87005db87b63122393bef1d096625005a958d4f6 é o objeto *Gas* que é onde seus *tokens* Sui são armazenados.

Podemos dar uma olhada nos objetos em profundidade usando a linha de  comando Sui. Vamos inspecionar o objeto Forge em 0x040db4f46d7b794b60376c9ee5fd00bbb537d395.


`sui client object --id 0x040db4f46d7b794b60376c9ee5fd00bbb537d395`


>Observação: seu ID de objeto será diferente

Você deverá notar 0 espadas relatadas, uma vez que ainda não criamos uma espada.

`Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )
Version: 1
Storage Rebate: 13
Previous Transaction: j/bA5u/3EvrK7EeZvgIzCgPVCDJCl8tDL6T9RQ7Rjyk=
----- Data -----
type: 0xd6d0f74d35ec593f568fd41561c732c83c729ff0::forge::Forge
id: 0x20e20e01f402f6c44cf2e9f7419f76d0c79efade
swords_created: 0`


Interação 🖱️

A seguir, vamos tentar interagir com o contrato. Vamos criar uma espada chamando a função *sword_create* na linha 44 do contrato inteligente:


`sui client call --package 0x1579b045da6ff20009585ce5728200643f9df2e2 --module "forge" --function "sword_create" --args 0x040db4f46d7b794b60376c9ee5fd00bbb537d395 5 5 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa --gas-budget 1000`


>Observação: todos os IDs de objetos serão diferentes para você, consulte o *output* de implantação

vamos desempacotar os parâmetros desse método 

*package*: a identificação do objeto do contrato inteligente que foi publicado. Este era o objeto com o proprietário **imutável**.

*module*: o nome do módulo de contrato inteligente - **forge**

*function*: o método do contrato inteligente que estamos visando - **sword_create**

*args*: os argumentos da função que podem ser encontrados na assinatura da função 


Observe que o primeiro argumento no parâmetro args é um ID de objeto, ou seja, o ID de objeto forge que foi criado durante a inicialização do contrato.

Esta é uma pequena nuance, pois a função está esperando uma estrutura de tipo forge, mas estamos passando em um identificador hexadecimal para um objeto que representa um tipo forge.

Uma vez executado o comando de chamada acima, o output deve ser algo parecido com isto:

`Created Objects:
- ID: 0xf3f4442701620b8c7b3dda8f05d6944f0405ac5b , Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )
Mutated Objects:
- ID: 0x040db4f46d7b794b60376c9ee5fd00bbb537d395 , Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )
- ID: 0x87005db87b63122393bef1d096625005a958d4f6 , Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )`

Você pode deduzir que o objeto criado é um Objeto Sword e que os dois objetos modificados são o objeto **Forge** e o objeto **Gas**, respectivamente.

Vamos inspecionar o objeto Forge e verificar se o número de espadas foi aumentado.

`sui client object --id 0x040db4f46d7b794b60376c9ee5fd00bbb537d395`

O output deve seguir: 


`Owner: Account Address ( 0xa088d03329cfb26ad95cd2c5620065d7d7fbdbfa )
Version: 2
Storage Rebate: 13
Previous Transaction: Ld2hOPy8XHnAXDfiT2WT7K7lzhPTx+dtFh82hOIhkXM=
----- Data -----
type: 0x1579b045da6ff20009585ce5728200643f9df2e2::forge::Forge
id: 0x040db4f46d7b794b60376c9ee5fd00bbb537d395
swords_created: 1`


Legal, parece que foi criada uma espada.


Fantástico! Isso é tudo por esta leve introdução aos contratos inteligentes Sui.

Se houver interesse, posso entrar mais na linguagem de programação Move, testar e implantar contratos inteligentes mais complexos.

Saúde!


Entre em contato 📱

Se você tiver alguma dúvida, sinta-se à vontade para deixar comentários ou me seguir no Twitter em [https://twitter.com/ultrasoundchad.](https://twitter.com/ultrasoundchad)


Este artigo foi escrito por [gmchad.eth](https://medium.com/@ultrasoundchad?source=post_page-----2e4608028bf7--------------------------------) e traduzido para o português por Rafael Ojeda

Você encontra o artigo original em inglês [aqui](https://medium.com/@ultrasoundchad/smart-contracts-on-the-sui-blockchain-2e4608028bf7)



































Enter fullscreen mode Exit fullscreen mode

Top comments (0)