|
|
- package example
-
- import (
- "encoding/binary"
- "sync"
-
- . "github.com/tendermint/go-common"
- "github.com/tendermint/tmsp/types"
- )
-
- type CounterApplication struct {
- mtx sync.Mutex
- hashCount int
- txCount int
- commitCount int
- }
-
- func NewCounterApplication() *CounterApplication {
- return &CounterApplication{}
- }
-
- func (app *CounterApplication) Open() types.AppContext {
- return &CounterAppContext{
- app: app,
- hashCount: app.hashCount,
- txCount: app.txCount,
- commitCount: app.commitCount,
- }
- }
-
- //--------------------------------------------------------------------------------
-
- type CounterAppContext struct {
- app *CounterApplication
- hashCount int
- txCount int
- commitCount int
- serial bool
- }
-
- func (appC *CounterAppContext) Echo(message string) string {
- return message
- }
-
- func (appC *CounterAppContext) Info() []string {
- return []string{Fmt("hash, tx, commit counts:%d, %d, %d", appC.hashCount, appC.txCount, appC.commitCount)}
- }
-
- func (appC *CounterAppContext) SetOption(key string, value string) types.RetCode {
- if key == "serial" && value == "on" {
- appC.serial = true
- }
- return 0
- }
-
- func (appC *CounterAppContext) AppendTx(tx []byte) ([]types.Event, types.RetCode) {
- if appC.serial {
- txValue, bz := binary.Varint(tx)
- if bz <= 0 {
- return nil, types.RetCodeInternalError
- }
- if txValue != int64(appC.txCount) {
- return nil, types.RetCodeInternalError
- }
- }
- appC.txCount += 1
- return nil, 0
- }
-
- func (appC *CounterAppContext) GetHash() ([]byte, types.RetCode) {
- appC.hashCount += 1
- if appC.txCount == 0 {
- return nil, 0
- } else {
- hash := make([]byte, 32)
- binary.PutVarint(hash, int64(appC.txCount))
- return hash, 0
- }
- }
-
- func (appC *CounterAppContext) Commit() types.RetCode {
- appC.commitCount += 1
-
- appC.app.mtx.Lock()
- appC.app.hashCount = appC.hashCount
- appC.app.txCount = appC.txCount
- appC.app.commitCount = appC.commitCount
- appC.app.mtx.Unlock()
- return 0
- }
-
- func (appC *CounterAppContext) Rollback() types.RetCode {
- appC.app.mtx.Lock()
- appC.hashCount = appC.app.hashCount
- appC.txCount = appC.app.txCount
- appC.commitCount = appC.app.commitCount
- appC.app.mtx.Unlock()
- return 0
- }
-
- func (appC *CounterAppContext) AddListener(key string) types.RetCode {
- return 0
- }
-
- func (appC *CounterAppContext) RemListener(key string) types.RetCode {
- return 0
- }
-
- func (appC *CounterAppContext) Close() error {
- return nil
- }
|