Contratos inteligentes na Blockchain Sui
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:
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)
Latest comments (0)