mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-03 03:35:19 +00:00
* Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
104 lines
2.9 KiB
Go
104 lines
2.9 KiB
Go
package counter
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
|
|
"github.com/tendermint/tendermint/abci/example/code"
|
|
"github.com/tendermint/tendermint/abci/types"
|
|
)
|
|
|
|
type Application struct {
|
|
types.BaseApplication
|
|
|
|
hashCount int
|
|
txCount int
|
|
serial bool
|
|
}
|
|
|
|
func NewApplication(serial bool) *Application {
|
|
return &Application{serial: serial}
|
|
}
|
|
|
|
func (app *Application) Info(req types.RequestInfo) types.ResponseInfo {
|
|
return types.ResponseInfo{Data: fmt.Sprintf("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)}
|
|
}
|
|
|
|
func (app *Application) SetOption(req types.RequestSetOption) types.ResponseSetOption {
|
|
key, value := req.Key, req.Value
|
|
if key == "serial" && value == "on" {
|
|
app.serial = true
|
|
} else {
|
|
/*
|
|
TODO Panic and have the ABCI server pass an exception.
|
|
The client can call SetOptionSync() and get an `error`.
|
|
return types.ResponseSetOption{
|
|
Error: fmt.Sprintf("Unknown key (%s) or value (%s)", key, value),
|
|
}
|
|
*/
|
|
return types.ResponseSetOption{}
|
|
}
|
|
|
|
return types.ResponseSetOption{}
|
|
}
|
|
|
|
func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx {
|
|
if app.serial {
|
|
if len(req.Tx) > 8 {
|
|
return types.ResponseDeliverTx{
|
|
Code: code.CodeTypeEncodingError,
|
|
Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx))}
|
|
}
|
|
tx8 := make([]byte, 8)
|
|
copy(tx8[len(tx8)-len(req.Tx):], req.Tx)
|
|
txValue := binary.BigEndian.Uint64(tx8)
|
|
if txValue != uint64(app.txCount) {
|
|
return types.ResponseDeliverTx{
|
|
Code: code.CodeTypeBadNonce,
|
|
Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)}
|
|
}
|
|
}
|
|
app.txCount++
|
|
return types.ResponseDeliverTx{Code: code.CodeTypeOK}
|
|
}
|
|
|
|
func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx {
|
|
if app.serial {
|
|
if len(req.Tx) > 8 {
|
|
return types.ResponseCheckTx{
|
|
Code: code.CodeTypeEncodingError,
|
|
Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx))}
|
|
}
|
|
tx8 := make([]byte, 8)
|
|
copy(tx8[len(tx8)-len(req.Tx):], req.Tx)
|
|
txValue := binary.BigEndian.Uint64(tx8)
|
|
if txValue < uint64(app.txCount) {
|
|
return types.ResponseCheckTx{
|
|
Code: code.CodeTypeBadNonce,
|
|
Log: fmt.Sprintf("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue)}
|
|
}
|
|
}
|
|
return types.ResponseCheckTx{Code: code.CodeTypeOK}
|
|
}
|
|
|
|
func (app *Application) Commit() (resp types.ResponseCommit) {
|
|
app.hashCount++
|
|
if app.txCount == 0 {
|
|
return types.ResponseCommit{}
|
|
}
|
|
hash := make([]byte, 8)
|
|
binary.BigEndian.PutUint64(hash, uint64(app.txCount))
|
|
return types.ResponseCommit{Data: hash}
|
|
}
|
|
|
|
func (app *Application) Query(reqQuery types.RequestQuery) types.ResponseQuery {
|
|
switch reqQuery.Path {
|
|
case "hash":
|
|
return types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.hashCount))}
|
|
case "tx":
|
|
return types.ResponseQuery{Value: []byte(fmt.Sprintf("%v", app.txCount))}
|
|
default:
|
|
return types.ResponseQuery{Log: fmt.Sprintf("Invalid query path. Expected hash or tx, got %v", reqQuery.Path)}
|
|
}
|
|
}
|