StoreApp just the queries, BaseApp with handler/ticker Ticker now defined top level, as an interface, with context Name for info taken as parameter, start cmd uses commandline name Cleaner compisition of apps.
176 lines
4.8 KiB
Go
176 lines
4.8 KiB
Go
package sdk
|
|
|
|
import (
|
|
abci "github.com/tendermint/abci/types"
|
|
"github.com/tendermint/go-wire/data"
|
|
"github.com/tendermint/tmlibs/log"
|
|
|
|
"github.com/cosmos/cosmos-sdk/state"
|
|
)
|
|
|
|
// Handler is anything that processes a transaction
|
|
type Handler interface {
|
|
// Checker verifies there are valid fees and estimates work
|
|
Checker
|
|
// Deliver performs the tx once it makes it in the block
|
|
Deliver
|
|
// InitStater sets state from the genesis file
|
|
InitStater
|
|
// InitValidater sets the initial validator set
|
|
InitValidater
|
|
// Named ensures there is a name for the item
|
|
Named
|
|
|
|
// TODO????
|
|
// BeginBlock(store state.SimpleDB, hash []byte, header *abci.Header)
|
|
}
|
|
|
|
// Ticker can be executed every block
|
|
type Ticker interface {
|
|
Tick(Context, state.SimpleDB) ([]*abci.Validator, error)
|
|
}
|
|
|
|
// TickerFunc allows a function to implement the interface
|
|
type TickerFunc func(Context, state.SimpleDB) ([]*abci.Validator, error)
|
|
|
|
func (t TickerFunc) Tick(ctx Context, store state.SimpleDB) ([]*abci.Validator, error) {
|
|
return t(ctx, store)
|
|
}
|
|
|
|
// Named ensures there is a name for the item
|
|
type Named interface {
|
|
Name() string
|
|
}
|
|
|
|
// Checker verifies there are valid fees and estimates work
|
|
type Checker interface {
|
|
CheckTx(ctx Context, store state.SimpleDB, tx Tx) (CheckResult, error)
|
|
}
|
|
|
|
// CheckerFunc (like http.HandlerFunc) is a shortcut for making wrappers
|
|
type CheckerFunc func(Context, state.SimpleDB, Tx) (CheckResult, error)
|
|
|
|
func (c CheckerFunc) CheckTx(ctx Context, store state.SimpleDB, tx Tx) (CheckResult, error) {
|
|
return c(ctx, store, tx)
|
|
}
|
|
|
|
// Deliver performs the tx once it makes it in the block
|
|
type Deliver interface {
|
|
DeliverTx(ctx Context, store state.SimpleDB, tx Tx) (DeliverResult, error)
|
|
}
|
|
|
|
// DeliverFunc (like http.HandlerFunc) is a shortcut for making wrappers
|
|
type DeliverFunc func(Context, state.SimpleDB, Tx) (DeliverResult, error)
|
|
|
|
func (c DeliverFunc) DeliverTx(ctx Context, store state.SimpleDB, tx Tx) (DeliverResult, error) {
|
|
return c(ctx, store, tx)
|
|
}
|
|
|
|
// InitStater sets state from the genesis file
|
|
type InitStater interface {
|
|
InitState(l log.Logger, store state.SimpleDB, module, key, value string) (string, error)
|
|
}
|
|
|
|
// InitStateFunc (like http.HandlerFunc) is a shortcut for making wrappers
|
|
type InitStateFunc func(log.Logger, state.SimpleDB, string, string, string) (string, error)
|
|
|
|
func (c InitStateFunc) InitState(l log.Logger, store state.SimpleDB, module, key, value string) (string, error) {
|
|
return c(l, store, module, key, value)
|
|
}
|
|
|
|
// InitValidater sets the initial validator set
|
|
type InitValidater interface {
|
|
InitValidate(log log.Logger, store state.SimpleDB, vals []*abci.Validator)
|
|
}
|
|
|
|
// InitValidateFunc (like http.HandlerFunc) is a shortcut for making wrappers
|
|
type InitValidateFunc func(log.Logger, state.SimpleDB, []*abci.Validator)
|
|
|
|
func (c InitValidateFunc) InitValidate(l log.Logger, store state.SimpleDB, vals []*abci.Validator) {
|
|
c(l, store, vals)
|
|
}
|
|
|
|
//---------- results and some wrappers --------
|
|
|
|
// Result is a common interface of CheckResult and GetResult
|
|
type Result interface {
|
|
GetData() data.Bytes
|
|
GetLog() string
|
|
}
|
|
|
|
func ToABCI(r Result) abci.Result {
|
|
return abci.Result{
|
|
Data: r.GetData(),
|
|
Log: r.GetLog(),
|
|
}
|
|
}
|
|
|
|
// CheckResult captures any non-error abci result
|
|
// to make sure people use error for error cases
|
|
type CheckResult struct {
|
|
Data data.Bytes
|
|
Log string
|
|
// GasAllocated is the maximum units of work we allow this tx to perform
|
|
GasAllocated uint64
|
|
// GasPayment is the total fees for this tx (or other source of payment)
|
|
GasPayment uint64
|
|
}
|
|
|
|
// NewCheck sets the gas used and the response data but no more info
|
|
// these are the most common info needed to be set by the Handler
|
|
func NewCheck(gasAllocated uint64, log string) CheckResult {
|
|
return CheckResult{
|
|
GasAllocated: gasAllocated,
|
|
Log: log,
|
|
}
|
|
}
|
|
|
|
var _ Result = CheckResult{}
|
|
|
|
func (r CheckResult) GetData() data.Bytes {
|
|
return r.Data
|
|
}
|
|
|
|
func (r CheckResult) GetLog() string {
|
|
return r.Log
|
|
}
|
|
|
|
// DeliverResult captures any non-error abci result
|
|
// to make sure people use error for error cases
|
|
type DeliverResult struct {
|
|
Data data.Bytes
|
|
Log string
|
|
Diff []*abci.Validator
|
|
GasUsed uint64
|
|
}
|
|
|
|
var _ Result = DeliverResult{}
|
|
|
|
func (r DeliverResult) GetData() data.Bytes {
|
|
return r.Data
|
|
}
|
|
|
|
func (r DeliverResult) GetLog() string {
|
|
return r.Log
|
|
}
|
|
|
|
// placeholders
|
|
// holders
|
|
type NopCheck struct{}
|
|
|
|
func (_ NopCheck) CheckTx(Context, state.SimpleDB, Tx) (r CheckResult, e error) { return }
|
|
|
|
type NopDeliver struct{}
|
|
|
|
func (_ NopDeliver) DeliverTx(Context, state.SimpleDB, Tx) (r DeliverResult, e error) { return }
|
|
|
|
type NopInitState struct{}
|
|
|
|
func (_ NopInitState) InitState(log.Logger, state.SimpleDB, string, string, string) (string, error) {
|
|
return "", nil
|
|
}
|
|
|
|
type NopInitValidate struct{}
|
|
|
|
func (_ NopInitValidate) InitValidate(log log.Logger, store state.SimpleDB, vals []*abci.Validator) {}
|