- package kvstore
-
- import (
- "bytes"
-
- dbm "github.com/tendermint/tm-db"
-
- "github.com/tendermint/tendermint/abci/types"
- "github.com/tendermint/tendermint/libs/log"
- cryptoproto "github.com/tendermint/tendermint/proto/tendermint/crypto"
- ptypes "github.com/tendermint/tendermint/proto/tendermint/types"
- )
-
- const (
- ValidatorSetChangePrefix string = "val:"
- )
-
- //-----------------------------------------
-
- var _ types.Application = (*PersistentKVStoreApplication)(nil)
-
- type PersistentKVStoreApplication struct {
- *Application
- }
-
- func NewPersistentKVStoreApplication(logger log.Logger, dbDir string) *PersistentKVStoreApplication {
- db, err := dbm.NewGoLevelDB("kvstore", dbDir)
- if err != nil {
- panic(err)
- }
-
- return &PersistentKVStoreApplication{
- Application: &Application{
- valAddrToPubKeyMap: make(map[string]cryptoproto.PublicKey),
- state: loadState(db),
- logger: logger,
- },
- }
- }
-
- func (app *PersistentKVStoreApplication) OfferSnapshot(req types.RequestOfferSnapshot) types.ResponseOfferSnapshot {
- return types.ResponseOfferSnapshot{Result: types.ResponseOfferSnapshot_ABORT}
- }
-
- func (app *PersistentKVStoreApplication) ApplySnapshotChunk(req types.RequestApplySnapshotChunk) types.ResponseApplySnapshotChunk {
- return types.ResponseApplySnapshotChunk{Result: types.ResponseApplySnapshotChunk_ABORT}
- }
-
- func (app *PersistentKVStoreApplication) ExtendVote(req types.RequestExtendVote) types.ResponseExtendVote {
- return types.ResponseExtendVote{VoteExtension: ConstructVoteExtension(req.Vote.ValidatorAddress)}
- }
-
- func (app *PersistentKVStoreApplication) VerifyVoteExtension(req types.RequestVerifyVoteExtension) types.ResponseVerifyVoteExtension {
- return types.RespondVerifyVoteExtension(app.verifyExtension(req.Vote.ValidatorAddress, req.Vote.VoteExtension))
- }
-
- // -----------------------------
-
- func ConstructVoteExtension(valAddr []byte) *ptypes.VoteExtension {
- return &ptypes.VoteExtension{
- AppDataToSign: valAddr,
- AppDataSelfAuthenticating: valAddr,
- }
- }
-
- func (app *PersistentKVStoreApplication) verifyExtension(valAddr []byte, ext *ptypes.VoteExtension) bool {
- if ext == nil {
- return false
- }
- canonical := ConstructVoteExtension(valAddr)
- if !bytes.Equal(canonical.AppDataToSign, ext.AppDataToSign) {
- return false
- }
- if !bytes.Equal(canonical.AppDataSelfAuthenticating, ext.AppDataSelfAuthenticating) {
- return false
- }
- return true
- }
|