Uma biblioteca Rust para um smart contract na blockchain Stellar (Soroban) focado em uma aplicação social e de estudo da Bíblia Sagrada.
- Linguagem: Rust (Edição 2021)
- Blockchain: Stellar (Futurenet)
- Plataforma de Smart Contracts: Soroban
- SDK:
soroban-sdk - Ferramenta de Linha de Comando:
stellar-cli
✅ Autenticidade de Textos: Verificação da integridade de textos bíblicos usando hashes SHA-256.
✅ Prova de Leitura: Sistema de registro de progresso de leitura na blockchain.
✅ Sistema de Recompensas: Rastreia o progresso de leitura e emite eventos (via backend) para a distribuição de tokens (TAL) quando um livro é concluído.
✅ Reflexões Pessoais: Usuários podem escrever e armazenar reflexões (públicas ou privadas) sobre passagens.
✅ Engajamento Social: Sistema de curtidas e comentários para promover a interação comunitária.
✅ Gerenciamento de Comentários: Usuários podem adicionar e remover seus próprios comentários.
✅ Moderação: Sistema de status para gerenciamento e moderação de reflexões.
✅ Testes Abrangentes: Cobertura de testes unitários para todas as principais funcionalidades.
✅ Documentação e Tipagem Segura: Código totalmente documentado e com tipos de dados bem definidos.
Siga os passos abaixo para compilar, implantar e interagir com este contrato.
Antes de começar, garanta que você tenha as seguintes ferramentas instaladas:
- Rust Toolchain: https://www.rust-lang.org/tools/install
- WASM Target:
rustup target add wasm32-unknown-unknown- Stellar CLI:
npm install -g stellar-cliClone este repositório:
git clone https://github.com/josiasdev/contrato_biblia
cd contrato_bibliaPara compilar o contrato para WASM, execute:
stellar contract buildEste comando criará o arquivo contrato_biblia.wasm no diretório target/wasm32-unknown-unknown/release/.
Para implantar o contrato, você precisará de uma conta na rede de testes futurenet.
-
Crie e Funde uma Conta:
# Crie uma identidade como admin stellar keys generate admin --network testnet --fund # Obtenha o endereço público ADMIN_ADDRESS=$(stellar keys address admin)
-
Implante o Contrato:
stellar contract deploy \ --wasm target/wasm32-unknown-unknown/release/contrato_biblia.wasm \ --source-account admin \ --network futurenet \ --alias contrato_bibliaGuarde o ID do Contrato (ex:
C...) retornado por este comando.
Após a implantação, o contrato precisa ser inicializado com o endereço do administrador.
# Substitua as variáveis pelos seus valores
ID_DO_CONTRATO="C..."
ADMIN_ADDRESS=$(stellar keys address admin)
stellar contract invoke \
--id $ID_DO_CONTRATO \
--source-account admin \
--network futurenet \
-- \
initialize \
--admin $ADMIN_ADDRESSNota Importante: Este contrato usa uma struct IdTexto para identificar versículos. Ao invocar pela CLI, devemos passar um JSON.
# Helper: JSON para Gênesis 1:1 (Livro 1, Cap 1, Verso 1)
ID_TEXTO_JSON='{"livro":1,"capitulo":1,"versiculo":1}'O administrador pode registrar o hash de Gênesis 1:1.
ID_DO_CONTRATO="..."
HASH_GEN_1_1="f2e9a224a50ee5118533e4544253966a348003183a69620596323145f15a201b"
stellar contract invoke \
--id $ID_DO_CONTRATO \
--source-account meu_admin \
--network futurenet \
-- \
registrar_hash \
--id_texto $ID_TEXTO_JSON \
--hash $HASH_GEN_1_1Um usuário (com uma conta leitor_josias fundada) pode marcar Gênesis 1:1 como lido.
stellar keys generate leitor --network futurenet
LEITOR_ADDRESS=$(stellar keys address leitor)
ID_DO_CONTRATO="..."
LEITOR_ADDRESS=$(stellar keys address leitor)
stellar contract invoke \
--id $ID_DO_CONTRATO \
--source leitor \
--network futurenet \
-- \
marcar_lido \
-- leitor $LEITOR_ADDRESS \
--id_texto $ID_TEXTO_JSONO resultado esperado é: "Leitura registrada e progresso atualizado!"
Qualquer pessoa pode verificar se leitor leu o versículo.
ID_DO_CONTRATO="..."
LEITOR_ADDRESS=$(stellar keys address leitor)
stellar contract invoke \
--id $ID_DO_CONTRATO \
--source admin \
--network futurenet \
-- \
verificar_leitura \
--leitor $LEITOR_ADDRESS \
--id_texto $ID_TEXTO_JSONO resultado esperado no terminal será uma String descritiva:
"Leitura confirmada!"Ou, caso o registro não exista:
"Registro de leitura não encontrado."O leitor_josias adiciona uma reflexão sobre Gênesis 1:1.
stellar contract invoke \
--id $CONTRACT_ID \
--source leitor_josias \
--network futurenet \
-- \
adicionar_reflexao \
--leitor $LEITOR_ADDRESS \
--id_texto $ID_TEXTO_JSON \
--conteudo "Esta passagem é a base de tudo." \
--publica trueUm segundo usuário (leitora_ana) curte a reflexão do Josias.
# 1. Crie e funde a conta da 'leitora_ana'
stellar keys generate leitora_ana --network futurenet
# ... use o Friendbot
# 2. Invoque a função curtir_reflexao
stellar contract invoke \
--id $CONTRACT_ID \
--source leitora_ana \
--network futurenet \
-- \
curtir_reflexao \
--curtidor $(stellar keys address leitora_ana) \
--id_texto $ID_TEXTO_JSON \
--autor_reflexao $LEITOR_ADDRESSA leitora_ana também deixa um comentário.
stellar contract invoke \
--id $CONTRACT_ID \
--source leitora_ana \
--network futurenet \
-- \
comentar_reflexao \
--comentarista $(stellar keys address leitora_ana) \
--id_texto $ID_TEXTO_JSON \
--autor_reflexao $LEITOR_ADDRESS \
--conteudo "Concordo plenamente! Ótima reflexão."Qualquer pessoa pode listar as reflexões públicas de uma passagem (com paginação).
stellar contract invoke \
--id $CONTRACT_ID \
--network futurenet \
-- \
listar_reflexoes_publicas \
--id_texto $ID_TEXTO_JSON \
--limite 10 \
--offset 0O resultado será um vetor (Vec) contendo a estrutura completa da reflexão do leitor_josias.
O admin define quantos versículos um livro tem para que o contrato saiba quando a leitura foi concluída.
# Exemplo: Definindo Gênesis (livro 1) com 1533 versículos
stellar contract invoke \
--id $CONTRACT_ID \
--source admin \
--network futurenet \
-- \
registrar_meta_livro \
--livro_id 1 \
--total_versiculos 1533Após ler todos os versículos (ex: 1533 de Gênesis), o usuário chama esta função. Ela não envia o token, mas emite um evento que um backend off-chain deve ouvir.
stellar contract invoke \
--id $CONTRACT_ID \
--source leitor_josias \
--network testnet \
-- \
reivindicar_recompensa_livro \
--leitor $LEITOR_ADDRESS \
--livro_id 1Se for bem-sucedido, a transação será concluída e o evento RecompensaReivindicada será emitido na blockchain para o backend processar o pagamento do token TAL.
Este projeto é distribuído sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.