cosmos / cosmos-sdk

:chains: A Framework for Building High Value Public Blockchains :sparkles:
https://cosmos.network/
Apache License 2.0
6.26k stars 3.62k forks source link

Simplify simulation packages #21774

Open julienrbrt opened 1 month ago

julienrbrt commented 1 month ago

Summary

We should converge to 2 simulation packages, one for app simulation and one for module simulations.

Problem Definition

Currently, we have 3 simulation packages.

Work Breakdown

We can do this simplification on main already. Once the simplification is completed, close the no more relevant issues: https://github.com/cosmos/cosmos-sdk/issues?q=is%3Aissue%20state%3Aopen%20simulation%20label%3AC%3ASimulations

LucasGarciaSI commented 1 month ago

package simulation

import ( "math/rand" "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/yourmodule/types" // Ajuste para seu módulo )

// SimulateApp é a função principal para simular operações no aplicativo func SimulateApp(r rand.Rand) simulation.Operation { return func(state simulation.State) { // Adicione a lógica de simulação para o aplicativo aqui // Por exemplo, simulando uma transação // Crie transações aleatórias ou estados de conta

    // Exemplo de transação aleatória
    amount := simulation.RandIntBetween(r, 1, 1000) // Montante aleatório
    addr := simulation.RandAddr(r)                 // Endereço aleatório

    // Criar uma simulação de transação
    tx := types.NewTransaction(addr, amount)

    // Adicionar a transação ao estado
    state.Transactions = append(state.Transactions, tx)
}

}

// SimulateModule simula operações de módulo específico func SimulateModule(r rand.Rand) simulation.Operation { return func(state simulation.State) { // Adicione a lógica de simulação para o módulo aqui

    // Exemplo de simulação de eventos do módulo
    event := simulation.RandomEvent(r) // Criar um evento aleatório
    state.Events = append(state.Events, event)

    // Log da simulação
    simulation.Log("Módulo simulado com evento:", event)
}

}

// GenerateGenesisState gera o estado inicial para o módulo de simulação func GenerateGenesisState(r *rand.Rand) types.GenesisState { // Gerar dados aleatórios para o estado inicial accounts := make([]types.Account, 0)

for i := 0; i < 10; i++ { // Criar 10 contas aleatórias
    addr := simulation.RandAddr(r)
    balance := simulation.RandIntBetween(r, 1000, 10000) // Saldo aleatório
    accounts = append(accounts, types.NewAccount(addr, balance))
}

return types.NewGenesisState(accounts)

}

// ValidateGenesis valida o estado inicial do módulo func ValidateGenesis(data types.GenesisState) error { // Verificar se os dados de genesis estão corretos for _, account := range data.Accounts { if account.Balance < 0 { return fmt.Errorf("account %s tem saldo negativo", account.Address) } } return nil }