rpc: /commit

This commit is contained in:
Ethan Buchman
2017-02-09 22:44:43 -05:00
parent ac971c1a19
commit e229c8c3d7
4 changed files with 42 additions and 1 deletions

View File

@ -44,3 +44,26 @@ func Block(height int) (*ctypes.ResultBlock, error) {
block := blockStore.LoadBlock(height) block := blockStore.LoadBlock(height)
return &ctypes.ResultBlock{blockMeta, block}, nil return &ctypes.ResultBlock{blockMeta, block}, nil
} }
//-----------------------------------------------------------------------------
func Commit(height int) (*ctypes.ResultCommit, error) {
if height == 0 {
return nil, fmt.Errorf("Height must be greater than 0")
}
storeHeight := blockStore.Height()
if height > storeHeight {
return nil, fmt.Errorf("Height must be less than or equal to the current blockchain height")
}
// If the next block has not been committed yet,
// use a non-canonical commit
if height == storeHeight+1 {
commit := blockStore.LoadSeenCommit(height)
return &ctypes.ResultCommit{commit, false}, nil
}
// Return the canonical commit (comes from the block at height+1)
commit := blockStore.LoadBlockCommit(height)
return &ctypes.ResultCommit{commit, true}, nil
}

View File

@ -5,10 +5,10 @@ import (
"github.com/tendermint/go-crypto" "github.com/tendermint/go-crypto"
"github.com/tendermint/go-p2p" "github.com/tendermint/go-p2p"
abci "github.com/tendermint/abci/types"
"github.com/tendermint/tendermint/consensus" "github.com/tendermint/tendermint/consensus"
"github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/proxy"
"github.com/tendermint/tendermint/types" "github.com/tendermint/tendermint/types"
abci "github.com/tendermint/abci/types"
) )
//----------------------------------------------------- //-----------------------------------------------------
@ -19,6 +19,8 @@ type BlockStore interface {
Height() int Height() int
LoadBlockMeta(height int) *types.BlockMeta LoadBlockMeta(height int) *types.BlockMeta
LoadBlock(height int) *types.Block LoadBlock(height int) *types.Block
LoadSeenCommit(height int) *types.Commit
LoadBlockCommit(height int) *types.Commit
} }
type Consensus interface { type Consensus interface {

View File

@ -18,6 +18,7 @@ var Routes = map[string]*rpc.RPCFunc{
"blockchain": rpc.NewRPCFunc(BlockchainInfoResult, "minHeight,maxHeight"), "blockchain": rpc.NewRPCFunc(BlockchainInfoResult, "minHeight,maxHeight"),
"genesis": rpc.NewRPCFunc(GenesisResult, ""), "genesis": rpc.NewRPCFunc(GenesisResult, ""),
"block": rpc.NewRPCFunc(BlockResult, "height"), "block": rpc.NewRPCFunc(BlockResult, "height"),
"commit": rpc.NewRPCFunc(CommitResult, "height"),
"validators": rpc.NewRPCFunc(ValidatorsResult, ""), "validators": rpc.NewRPCFunc(ValidatorsResult, ""),
"dump_consensus_state": rpc.NewRPCFunc(DumpConsensusStateResult, ""), "dump_consensus_state": rpc.NewRPCFunc(DumpConsensusStateResult, ""),
"unconfirmed_txs": rpc.NewRPCFunc(UnconfirmedTxsResult, ""), "unconfirmed_txs": rpc.NewRPCFunc(UnconfirmedTxsResult, ""),
@ -107,6 +108,14 @@ func BlockResult(height int) (ctypes.TMResult, error) {
} }
} }
func CommitResult(height int) (ctypes.TMResult, error) {
if r, err := Commit(height); err != nil {
return nil, err
} else {
return r, nil
}
}
func ValidatorsResult() (ctypes.TMResult, error) { func ValidatorsResult() (ctypes.TMResult, error) {
if r, err := Validators(); err != nil { if r, err := Validators(); err != nil {
return nil, err return nil, err

View File

@ -23,6 +23,11 @@ type ResultBlock struct {
Block *types.Block `json:"block"` Block *types.Block `json:"block"`
} }
type ResultCommit struct {
Commit *types.Commit `json:"commit"`
Canonical bool `json:"canonical"`
}
type ResultStatus struct { type ResultStatus struct {
NodeInfo *p2p.NodeInfo `json:"node_info"` NodeInfo *p2p.NodeInfo `json:"node_info"`
PubKey crypto.PubKey `json:"pub_key"` PubKey crypto.PubKey `json:"pub_key"`
@ -106,6 +111,7 @@ const (
ResultTypeGenesis = byte(0x01) ResultTypeGenesis = byte(0x01)
ResultTypeBlockchainInfo = byte(0x02) ResultTypeBlockchainInfo = byte(0x02)
ResultTypeBlock = byte(0x03) ResultTypeBlock = byte(0x03)
ResultTypeCommit = byte(0x04)
// 0x2 bytes are for the network // 0x2 bytes are for the network
ResultTypeStatus = byte(0x20) ResultTypeStatus = byte(0x20)
@ -148,6 +154,7 @@ var _ = wire.RegisterInterface(
wire.ConcreteType{&ResultGenesis{}, ResultTypeGenesis}, wire.ConcreteType{&ResultGenesis{}, ResultTypeGenesis},
wire.ConcreteType{&ResultBlockchainInfo{}, ResultTypeBlockchainInfo}, wire.ConcreteType{&ResultBlockchainInfo{}, ResultTypeBlockchainInfo},
wire.ConcreteType{&ResultBlock{}, ResultTypeBlock}, wire.ConcreteType{&ResultBlock{}, ResultTypeBlock},
wire.ConcreteType{&ResultCommit{}, ResultTypeCommit},
wire.ConcreteType{&ResultStatus{}, ResultTypeStatus}, wire.ConcreteType{&ResultStatus{}, ResultTypeStatus},
wire.ConcreteType{&ResultNetInfo{}, ResultTypeNetInfo}, wire.ConcreteType{&ResultNetInfo{}, ResultTypeNetInfo},
wire.ConcreteType{&ResultDialSeeds{}, ResultTypeDialSeeds}, wire.ConcreteType{&ResultDialSeeds{}, ResultTypeDialSeeds},