tendermint/example/counter/counter.go

80 lines
1.9 KiB
Go
Raw Normal View History

2016-02-14 14:59:53 -08:00
package counter
2015-11-29 00:43:49 -08:00
import (
"encoding/binary"
"fmt"
2015-11-29 00:43:49 -08:00
. "github.com/tendermint/go-common"
"github.com/tendermint/tmsp/types"
)
type CounterApplication struct {
hashCount int
txCount int
serial bool
2015-11-29 00:43:49 -08:00
}
func NewCounterApplication(serial bool) *CounterApplication {
return &CounterApplication{serial: serial}
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) Info() (string, *types.TMSPInfo, *types.LastBlockInfo, *types.ConfigInfo) {
return Fmt("hashes:%v, txs:%v", app.hashCount, app.txCount), nil, nil, nil
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) SetOption(key string, value string) (log string) {
if key == "serial" && value == "on" {
app.serial = true
}
return ""
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) AppendTx(tx []byte) types.Result {
if app.serial {
tx8 := make([]byte, 8)
copy(tx8[len(tx8)-len(tx):], tx)
txValue := binary.BigEndian.Uint64(tx8)
if txValue != uint64(app.txCount) {
return types.Result{
Code: types.CodeType_BadNonce,
Data: nil,
Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue),
}
}
}
app.txCount += 1
2016-03-23 02:50:29 -07:00
return types.OK
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) CheckTx(tx []byte) types.Result {
if app.serial {
tx8 := make([]byte, 8)
copy(tx8[len(tx8)-len(tx):], tx)
txValue := binary.BigEndian.Uint64(tx8)
if txValue < uint64(app.txCount) {
return types.Result{
Code: types.CodeType_BadNonce,
Data: nil,
Log: fmt.Sprintf("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue),
}
}
}
2016-03-23 02:50:29 -07:00
return types.OK
}
2016-03-23 02:50:29 -07:00
func (app *CounterApplication) Commit() types.Result {
app.hashCount += 1
if app.txCount == 0 {
2016-03-23 02:50:29 -07:00
return types.OK
} else {
hash := make([]byte, 8)
binary.BigEndian.PutUint64(hash, uint64(app.txCount))
2016-03-23 02:50:29 -07:00
return types.NewResultOK(hash, "")
}
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) Query(query []byte) types.Result {
return types.NewResultOK(nil, fmt.Sprintf("Query is not supported"))
2015-11-29 00:43:49 -08:00
}