tendermint/example/counter/counter.go

84 lines
2.2 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"
2017-01-12 12:47:55 -08:00
"github.com/tendermint/abci/types"
2017-03-03 15:39:10 -08:00
cmn "github.com/tendermint/go-common"
2015-11-29 00:43:49 -08:00
)
type CounterApplication struct {
2017-02-13 15:48:59 -08:00
types.BaseApplication
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
}
2016-12-26 17:44:36 -08:00
func (app *CounterApplication) Info() types.ResponseInfo {
2017-03-03 15:39:10 -08:00
return types.ResponseInfo{Data: cmn.Fmt("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)}
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
}
2017-01-12 12:27:08 -08:00
func (app *CounterApplication) DeliverTx(tx []byte) types.Result {
if app.serial {
2016-11-23 15:22:22 -08:00
if len(tx) > 8 {
2017-03-03 15:39:10 -08:00
return types.ErrEncodingError.SetLog(cmn.Fmt("Max tx size is 8 bytes, got %d", len(tx)))
2016-11-23 15:22:22 -08:00
}
tx8 := make([]byte, 8)
copy(tx8[len(tx8)-len(tx):], tx)
txValue := binary.BigEndian.Uint64(tx8)
if txValue != uint64(app.txCount) {
2017-03-03 15:39:10 -08:00
return types.ErrBadNonce.SetLog(cmn.Fmt("Invalid nonce. Expected %v, got %v", app.txCount, txValue))
}
}
2017-01-17 00:26:32 -08:00
app.txCount++
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 {
2016-11-23 15:22:22 -08:00
if len(tx) > 8 {
2017-03-03 15:39:10 -08:00
return types.ErrEncodingError.SetLog(cmn.Fmt("Max tx size is 8 bytes, got %d", len(tx)))
2016-11-23 15:22:22 -08:00
}
tx8 := make([]byte, 8)
copy(tx8[len(tx8)-len(tx):], tx)
txValue := binary.BigEndian.Uint64(tx8)
if txValue < uint64(app.txCount) {
2017-03-03 15:39:10 -08:00
return types.ErrBadNonce.SetLog(cmn.Fmt("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 {
2017-01-17 00:26:32 -08:00
app.hashCount++
if app.txCount == 0 {
2016-03-23 02:50:29 -07:00
return types.OK
}
2017-01-17 00:26:32 -08:00
hash := make([]byte, 8)
binary.BigEndian.PutUint64(hash, uint64(app.txCount))
return types.NewResultOK(hash, "")
2015-11-29 00:43:49 -08:00
}
func (app *CounterApplication) Query(reqQuery types.RequestQuery) types.ResponseQuery {
switch reqQuery.Path {
2016-12-22 15:24:45 -08:00
case "hash":
2017-03-03 15:39:10 -08:00
return types.ResponseQuery{Value: []byte(cmn.Fmt("%v", app.hashCount))}
2016-12-22 15:24:45 -08:00
case "tx":
2017-03-03 15:39:10 -08:00
return types.ResponseQuery{Value: []byte(cmn.Fmt("%v", app.txCount))}
2017-01-27 22:27:32 -08:00
default:
2017-03-03 15:39:10 -08:00
return types.ResponseQuery{Log: cmn.Fmt("Invalid query path. Expected hash or tx, got %v", reqQuery.Path)}
2016-12-22 15:24:45 -08:00
}
2015-11-29 00:43:49 -08:00
}