blockchain and node pkgs

This commit is contained in:
Marko Baricevic
2021-02-04 12:17:19 +01:00
parent f7c42922e1
commit e6d95c4ef8
12 changed files with 322 additions and 322 deletions
+4 -4
View File
@@ -213,7 +213,7 @@ func TestReactor_AbruptDisconnect(t *testing.T) {
defer os.RemoveAll(config.RootDir)
genDoc, privVals := randGenesisDoc(config, 1, false, 30)
maxBlockHeight := int64(64)
maxBlockHeight := uint64(64)
testSuites := []*reactorTestSuite{
setup(t, genDoc, privVals, maxBlockHeight, 0),
setup(t, genDoc, privVals, 0, 0),
@@ -260,7 +260,7 @@ func TestReactor_NoBlockResponse(t *testing.T) {
defer os.RemoveAll(config.RootDir)
genDoc, privVals := randGenesisDoc(config, 1, false, 30)
maxBlockHeight := int64(65)
maxBlockHeight := uint64(65)
testSuites := []*reactorTestSuite{
setup(t, genDoc, privVals, maxBlockHeight, 0),
setup(t, genDoc, privVals, 0, 0),
@@ -283,7 +283,7 @@ func TestReactor_NoBlockResponse(t *testing.T) {
}
testCases := []struct {
height int64
height uint64
existent bool
}{
{maxBlockHeight + 2, false},
@@ -320,7 +320,7 @@ func TestReactor_BadBlockStopsPeer(t *testing.T) {
config := cfg.ResetTestRoot("blockchain_reactor_test")
defer os.RemoveAll(config.RootDir)
maxBlockHeight := int64(48)
maxBlockHeight := uint64(48)
genDoc, privVals := randGenesisDoc(config, 1, false, 30)
testSuites := []*reactorTestSuite{
+2 -2
View File
@@ -37,14 +37,14 @@ func randGenesisDoc(
}, privValidators
}
func makeTxs(height int64) (txs []types.Tx) {
func makeTxs(height uint64) (txs []types.Tx) {
for i := 0; i < 10; i++ {
txs = append(txs, types.Tx([]byte{byte(height), byte(i)}))
}
return txs
}
func makeBlock(height int64, state sm.State, lastCommit *types.Commit) *types.Block {
func makeBlock(height uint64, state sm.State, lastCommit *types.Commit) *types.Block {
block, _ := state.MakeBlock(height, makeTxs(height), lastCommit, nil, state.Validators.GetProposer().Address)
return block
}
+6 -6
View File
@@ -15,10 +15,10 @@ var (
)
type iIO interface {
sendBlockRequest(peer p2p.Peer, height int64) error
sendBlockRequest(peer p2p.Peer, height uint64) error
sendBlockToPeer(block *types.Block, peer p2p.Peer) error
sendBlockNotFound(height int64, peer p2p.Peer) error
sendStatusResponse(base, height int64, peer p2p.Peer) error
sendBlockNotFound(height uint64, peer p2p.Peer) error
sendStatusResponse(base, height uint64, peer p2p.Peer) error
sendStatusRequest(peer p2p.Peer) error
broadcastStatusRequest() error
@@ -47,7 +47,7 @@ type consensusReactor interface {
SwitchToConsensus(state state.State, skipWAL bool)
}
func (sio *switchIO) sendBlockRequest(peer p2p.Peer, height int64) error {
func (sio *switchIO) sendBlockRequest(peer p2p.Peer, height uint64) error {
msgProto := &bcproto.Message{
Sum: &bcproto.Message_BlockRequest{
BlockRequest: &bcproto.BlockRequest{
@@ -68,7 +68,7 @@ func (sio *switchIO) sendBlockRequest(peer p2p.Peer, height int64) error {
return nil
}
func (sio *switchIO) sendStatusResponse(base int64, height int64, peer p2p.Peer) error {
func (sio *switchIO) sendStatusResponse(base, height uint64, peer p2p.Peer) error {
msgProto := &bcproto.Message{
Sum: &bcproto.Message_StatusResponse{
StatusResponse: &bcproto.StatusResponse{
@@ -120,7 +120,7 @@ func (sio *switchIO) sendBlockToPeer(block *types.Block, peer p2p.Peer) error {
return nil
}
func (sio *switchIO) sendBlockNotFound(height int64, peer p2p.Peer) error {
func (sio *switchIO) sendBlockNotFound(height uint64, peer p2p.Peer) error {
msgProto := &bcproto.Message{
Sum: &bcproto.Message_NoBlockResponse{
NoBlockResponse: &bcproto.NoBlockResponse{
+5 -5
View File
@@ -12,7 +12,7 @@ import (
// block execution failure, event will indicate the peer(s) that caused the error
type pcBlockVerificationFailure struct {
priorityNormal
height int64
height uint64
firstPeerID p2p.NodeID
secondPeerID p2p.NodeID
}
@@ -25,7 +25,7 @@ func (e pcBlockVerificationFailure) String() string {
// successful block execution
type pcBlockProcessed struct {
priorityNormal
height int64
height uint64
peerID p2p.NodeID
}
@@ -49,7 +49,7 @@ type queueItem struct {
peerID p2p.NodeID
}
type blockQueue map[int64]queueItem
type blockQueue map[uint64]queueItem
type pcState struct {
// blocks waiting to be processed
@@ -95,7 +95,7 @@ func (state *pcState) synced() bool {
return len(state.queue) <= 1
}
func (state *pcState) enqueue(peerID p2p.NodeID, block *types.Block, height int64) {
func (state *pcState) enqueue(peerID p2p.NodeID, block *types.Block, height uint64) {
if item, ok := state.queue[height]; ok {
panic(fmt.Sprintf(
"duplicate block %d (%X) enqueued by processor (sent by %v; existing block %X from %v)",
@@ -105,7 +105,7 @@ func (state *pcState) enqueue(peerID p2p.NodeID, block *types.Block, height int6
state.queue[height] = queueItem{block: block, peerID: peerID}
}
func (state *pcState) height() int64 {
func (state *pcState) height() uint64 {
return state.context.tmState().LastBlockHeight
}
+5 -5
View File
@@ -9,7 +9,7 @@ import (
type processorContext interface {
applyBlock(blockID types.BlockID, block *types.Block) error
verifyCommit(chainID string, blockID types.BlockID, height int64, commit *types.Commit) error
verifyCommit(chainID string, blockID types.BlockID, height uint64, commit *types.Commit) error
saveBlock(block *types.Block, blockParts *types.PartSet, seenCommit *types.Commit)
tmState() state.State
setState(state.State)
@@ -43,7 +43,7 @@ func (pc *pContext) setState(state state.State) {
pc.state = state
}
func (pc pContext) verifyCommit(chainID string, blockID types.BlockID, height int64, commit *types.Commit) error {
func (pc pContext) verifyCommit(chainID string, blockID types.BlockID, height uint64, commit *types.Commit) error {
return pc.state.Validators.VerifyCommitLight(chainID, blockID, height, commit)
}
@@ -70,7 +70,7 @@ func newMockProcessorContext(
func (mpc *mockPContext) applyBlock(blockID types.BlockID, block *types.Block) error {
for _, h := range mpc.applicationBL {
if h == block.Height {
if uint64(h) == block.Height {
return fmt.Errorf("generic application error")
}
}
@@ -78,9 +78,9 @@ func (mpc *mockPContext) applyBlock(blockID types.BlockID, block *types.Block) e
return nil
}
func (mpc *mockPContext) verifyCommit(chainID string, blockID types.BlockID, height int64, commit *types.Commit) error {
func (mpc *mockPContext) verifyCommit(chainID string, blockID types.BlockID, height uint64, commit *types.Commit) error {
for _, h := range mpc.verificationBL {
if h == height {
if uint64(h) == height {
return fmt.Errorf("generic verification error")
}
}
+4 -4
View File
@@ -13,12 +13,12 @@ import (
// pcBlock is a test helper structure with simple types. Its purpose is to help with test readability.
type pcBlock struct {
pid string
height int64
height uint64
}
// params is a test structure used to create processor state.
type params struct {
height int64
height uint64
items []pcBlock
blocksSynced int
verBL []int64
@@ -27,7 +27,7 @@ type params struct {
}
// makePcBlock makes an empty block.
func makePcBlock(height int64) *types.Block {
func makePcBlock(height uint64) *types.Block {
return &types.Block{Header: types.Header{Height: height}}
}
@@ -48,7 +48,7 @@ func makeState(p *params) *pcState {
return state
}
func mBlockResponse(peerID p2p.NodeID, height int64) scBlockReceived {
func mBlockResponse(peerID p2p.NodeID, height uint64) scBlockReceived {
return scBlockReceived{
peerID: peerID,
block: makePcBlock(height),
+6 -6
View File
@@ -96,7 +96,7 @@ func (r *BlockchainReactor) SetSwitch(sw *p2p.Switch) {
}
}
func (r *BlockchainReactor) setMaxPeerHeight(height int64) {
func (r *BlockchainReactor) setMaxPeerHeight(height uint64) {
r.mtx.Lock()
defer r.mtx.Unlock()
if height > r.maxPeerHeight {
@@ -104,14 +104,14 @@ func (r *BlockchainReactor) setMaxPeerHeight(height int64) {
}
}
func (r *BlockchainReactor) setSyncHeight(height int64) {
func (r *BlockchainReactor) setSyncHeight(height uint64) {
r.mtx.Lock()
defer r.mtx.Unlock()
r.syncHeight = height
}
// SyncHeight returns the height to which the BlockchainReactor has synced.
func (r *BlockchainReactor) SyncHeight() int64 {
func (r *BlockchainReactor) SyncHeight() uint64 {
r.mtx.RLock()
defer r.mtx.RUnlock()
return r.syncHeight
@@ -226,7 +226,7 @@ type bcNoBlockResponse struct {
priorityNormal
time time.Time
peerID p2p.NodeID
height int64
height uint64
}
func (resp bcNoBlockResponse) String() string {
@@ -239,8 +239,8 @@ type bcStatusResponse struct {
priorityNormal
time time.Time
peerID p2p.NodeID
base int64
height int64
base uint64
height uint64
}
func (resp bcStatusResponse) String() string {
+12 -12
View File
@@ -61,14 +61,14 @@ func (mp mockPeer) Get(string) interface{} { return struct{}{} }
//nolint:unused
type mockBlockStore struct {
blocks map[int64]*types.Block
blocks map[uint64]*types.Block
}
func (ml *mockBlockStore) Height() int64 {
return int64(len(ml.blocks))
}
func (ml *mockBlockStore) LoadBlock(height int64) *types.Block {
func (ml *mockBlockStore) LoadBlock(height uint64) *types.Block {
return ml.blocks[height]
}
@@ -82,7 +82,7 @@ type mockBlockApplier struct {
// XXX: Add whitelist/blacklist?
func (mba *mockBlockApplier) ApplyBlock(
state sm.State, blockID types.BlockID, block *types.Block,
) (sm.State, int64, error) {
) (sm.State, uint64, error) {
state.LastBlockHeight++
return state, 0, nil
}
@@ -98,11 +98,11 @@ type mockSwitchIo struct {
var _ iIO = (*mockSwitchIo)(nil)
func (sio *mockSwitchIo) sendBlockRequest(_ p2p.Peer, _ int64) error {
func (sio *mockSwitchIo) sendBlockRequest(_ p2p.Peer, _ uint64) error {
return nil
}
func (sio *mockSwitchIo) sendStatusResponse(_, _ int64, _ p2p.Peer) error {
func (sio *mockSwitchIo) sendStatusResponse(_, _ uint64, _ p2p.Peer) error {
sio.mtx.Lock()
defer sio.mtx.Unlock()
sio.numStatusResponse++
@@ -116,7 +116,7 @@ func (sio *mockSwitchIo) sendBlockToPeer(_ *types.Block, _ p2p.Peer) error {
return nil
}
func (sio *mockSwitchIo) sendBlockNotFound(_ int64, _ p2p.Peer) error {
func (sio *mockSwitchIo) sendBlockNotFound(_ uint64, _ p2p.Peer) error {
sio.mtx.Lock()
defer sio.mtx.Unlock()
sio.numNoBlockResponse++
@@ -145,7 +145,7 @@ type testReactorParams struct {
logger log.Logger
genDoc *types.GenesisDoc
privVals []types.PrivValidator
startHeight int64
startHeight uint64
mockA bool
}
@@ -201,7 +201,7 @@ func newTestReactor(p testReactorParams) *BlockchainReactor {
// type testEvent struct {
// evType string
// peer string
// height int64
// height uint64
// }
// tests := []struct {
@@ -469,14 +469,14 @@ func TestReactorSetSwitchNil(t *testing.T) {
//----------------------------------------------
// utility funcs
func makeTxs(height int64) (txs []types.Tx) {
func makeTxs(height uint64) (txs []types.Tx) {
for i := 0; i < 10; i++ {
txs = append(txs, types.Tx([]byte{byte(height), byte(i)}))
}
return txs
}
func makeBlock(height int64, state sm.State, lastCommit *types.Commit) *types.Block {
func makeBlock(height uint64, state sm.State, lastCommit *types.Commit) *types.Block {
block, _ := state.MakeBlock(height, makeTxs(height), lastCommit, nil, state.Validators.GetProposer().Address)
return block
}
@@ -511,7 +511,7 @@ func randGenesisDoc(chainID string, numValidators int, randPower bool, minPower
func newReactorStore(
genDoc *types.GenesisDoc,
privVals []types.PrivValidator,
maxBlockHeight int64) (*store.BlockStore, sm.State, *sm.BlockExecutor) {
maxBlockHeight uint64) (*store.BlockStore, sm.State, *sm.BlockExecutor) {
if len(privVals) != 1 {
panic("only support one validator")
}
@@ -540,7 +540,7 @@ func newReactorStore(
}
// add blocks in
for blockHeight := int64(1); blockHeight <= maxBlockHeight; blockHeight++ {
for blockHeight := uint64(1); blockHeight <= maxBlockHeight; blockHeight++ {
lastCommit := types.NewCommit(blockHeight-1, 0, types.BlockID{}, nil)
if blockHeight > 1 {
lastBlockMeta := blockStore.LoadBlockMeta(blockHeight - 1)
+30 -30
View File
@@ -27,7 +27,7 @@ func (e scFinishedEv) String() string {
type scBlockRequest struct {
priorityNormal
peerID p2p.NodeID
height int64
height uint64
}
func (e scBlockRequest) String() string {
@@ -132,8 +132,8 @@ type scPeer struct {
// updated to Removed when peer is removed
state peerState
base int64 // updated when statusResponse is received
height int64 // updated when statusResponse is received
base uint64 // updated when statusResponse is received
height uint64 // updated when statusResponse is received
lastTouched time.Time
lastRate int64 // last receive rate in bytes
}
@@ -147,8 +147,8 @@ func newScPeer(peerID p2p.NodeID) *scPeer {
return &scPeer{
peerID: peerID,
state: peerStateNew,
base: -1,
height: -1,
base: 0,
height: 0,
lastTouched: time.Time{},
}
}
@@ -180,16 +180,16 @@ type scheduler struct {
targetPending int
// a list of blocks to be scheduled (New), Pending or Received. Its length should be
// smaller than targetPending.
blockStates map[int64]blockState
blockStates map[uint64]blockState
// a map of heights to the peer we are waiting a response from
pendingBlocks map[int64]p2p.NodeID
pendingBlocks map[uint64]p2p.NodeID
// the time at which a block was put in blockStatePending
pendingTime map[int64]time.Time
pendingTime map[uint64]time.Time
// a map of heights to the peers that put the block in blockStateReceived
receivedBlocks map[int64]p2p.NodeID
receivedBlocks map[uint64]p2p.NodeID
}
func (sc scheduler) String() string {
@@ -203,11 +203,11 @@ func newScheduler(initHeight uint64, startTime time.Time) *scheduler {
lastAdvance: startTime,
syncTimeout: 60 * time.Second,
height: initHeight,
blockStates: make(map[int64]blockState),
blockStates: make(map[uint64]blockState),
peers: make(map[p2p.NodeID]*scPeer),
pendingBlocks: make(map[int64]p2p.NodeID),
pendingTime: make(map[int64]time.Time),
receivedBlocks: make(map[int64]p2p.NodeID),
pendingBlocks: make(map[uint64]p2p.NodeID),
pendingTime: make(map[uint64]time.Time),
receivedBlocks: make(map[uint64]p2p.NodeID),
targetPending: 10, // TODO - pass as param
peerTimeout: 15 * time.Second, // TODO - pass as param
minRecvRate: 0, // int64(7680), TODO - pass as param
@@ -264,7 +264,7 @@ func (sc *scheduler) removePeer(peerID p2p.NodeID) {
// remove the blocks from blockStates if the peer removal causes the max peer height to be lower.
peer.state = peerStateRemoved
maxPeerHeight := int64(0)
maxPeerHeight := uint64(0)
for _, otherPeer := range sc.peers {
if otherPeer.state != peerStateReady {
continue
@@ -288,7 +288,7 @@ func (sc *scheduler) addNewBlocks() {
return
}
for i := sc.height; i < int64(sc.targetPending)+sc.height; i++ {
for i := sc.height; i < uint64(sc.targetPending)+sc.height; i++ {
if i > sc.maxHeight() {
break
}
@@ -298,7 +298,7 @@ func (sc *scheduler) addNewBlocks() {
}
}
func (sc *scheduler) setPeerRange(peerID p2p.NodeID, base int64, height int64) error {
func (sc *scheduler) setPeerRange(peerID p2p.NodeID, base, height uint64) error {
peer := sc.ensurePeer(peerID)
if peer.state == peerStateRemoved {
@@ -323,7 +323,7 @@ func (sc *scheduler) setPeerRange(peerID p2p.NodeID, base int64, height int64) e
return nil
}
func (sc *scheduler) getStateAtHeight(height int64) blockState {
func (sc *scheduler) getStateAtHeight(height uint64) blockState {
if height < sc.height {
return blockStateProcessed
} else if state, ok := sc.blockStates[height]; ok {
@@ -333,7 +333,7 @@ func (sc *scheduler) getStateAtHeight(height int64) blockState {
}
}
func (sc *scheduler) getPeersWithHeight(height int64) []p2p.NodeID {
func (sc *scheduler) getPeersWithHeight(height uint64) []p2p.NodeID {
peers := make([]p2p.NodeID, 0)
for _, peer := range sc.peers {
if peer.state != peerStateReady {
@@ -361,12 +361,12 @@ func (sc *scheduler) prunablePeers(peerTimout time.Duration, minRecvRate int64,
return prunable
}
func (sc *scheduler) setStateAtHeight(height int64, state blockState) {
func (sc *scheduler) setStateAtHeight(height uint64, state blockState) {
sc.blockStates[height] = state
}
// CONTRACT: peer exists and in Ready state.
func (sc *scheduler) markReceived(peerID p2p.NodeID, height int64, size int64, now time.Time) error {
func (sc *scheduler) markReceived(peerID p2p.NodeID, height uint64, size int64, now time.Time) error {
peer := sc.peers[peerID]
if state := sc.getStateAtHeight(height); state != blockStatePending || sc.pendingBlocks[height] != peerID {
@@ -390,7 +390,7 @@ func (sc *scheduler) markReceived(peerID p2p.NodeID, height int64, size int64, n
return nil
}
func (sc *scheduler) markPending(peerID p2p.NodeID, height int64, time time.Time) error {
func (sc *scheduler) markPending(peerID p2p.NodeID, height uint64, time time.Time) error {
state := sc.getStateAtHeight(height)
if state != blockStateNew {
return fmt.Errorf("block %d should be in blockStateNew but is %s", height, state)
@@ -422,7 +422,7 @@ func (sc *scheduler) markPending(peerID p2p.NodeID, height int64, time time.Time
return nil
}
func (sc *scheduler) markProcessed(height int64) error {
func (sc *scheduler) markProcessed(height uint64) error {
// It is possible that a peer error or timeout is handled after the processor
// has processed the block but before the scheduler received this event, so
// when pcBlockProcessed event is received, the block had been requested
@@ -445,7 +445,7 @@ func (sc *scheduler) allBlocksProcessed() bool {
}
// returns max peer height or the last processed block, i.e. sc.height
func (sc *scheduler) maxHeight() int64 {
func (sc *scheduler) maxHeight() uint64 {
max := sc.height - 1
for _, peer := range sc.peers {
if peer.state != peerStateReady {
@@ -459,21 +459,21 @@ func (sc *scheduler) maxHeight() int64 {
}
// lowest block in sc.blockStates with state == blockStateNew or -1 if no new blocks
func (sc *scheduler) nextHeightToSchedule() int64 {
var min int64 = math.MaxInt64
func (sc *scheduler) nextHeightToSchedule() uint64 {
var min uint64 = math.MaxUint64
for height, state := range sc.blockStates {
if state == blockStateNew && height < min {
min = height
}
}
if min == math.MaxInt64 {
min = -1
min = 0 //todo: see if this changes logic
}
return min
}
func (sc *scheduler) pendingFrom(peerID p2p.NodeID) []int64 {
var heights []int64
func (sc *scheduler) pendingFrom(peerID p2p.NodeID) []uint64 {
var heights []uint64
for height, pendingPeerID := range sc.pendingBlocks {
if pendingPeerID == peerID {
heights = append(heights, height)
@@ -482,7 +482,7 @@ func (sc *scheduler) pendingFrom(peerID p2p.NodeID) []int64 {
return heights
}
func (sc *scheduler) selectPeer(height int64) (p2p.NodeID, error) {
func (sc *scheduler) selectPeer(height uint64) (p2p.NodeID, error) {
peers := sc.getPeersWithHeight(height)
if len(peers) == 0 {
return "", fmt.Errorf("cannot find peer for height %d", height)
@@ -651,7 +651,7 @@ func (sc *scheduler) handleTrySchedule(event rTrySchedule) (Event, error) {
}
nextHeight := sc.nextHeightToSchedule()
if nextHeight == -1 {
if nextHeight == 0 { // todo: see if this changes logic
return noOp, nil
}
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -42,8 +42,8 @@ func SetEnvironment(e *Environment) {
type Consensus interface {
GetState() sm.State
GetValidators() (int64, []*types.Validator)
GetLastHeight() int64
GetValidators() (uint64, []*types.Validator)
GetLastHeight() uint64
GetRoundStateJSON() ([]byte, error)
GetRoundStateSimpleJSON() ([]byte, error)
}
+1 -1
View File
@@ -504,7 +504,7 @@ func (cs *State) GetState() sm.State {
// GetLastHeight returns the last height committed.
// If there were no blocks, returns 0.
func (cs *State) GetLastHeight() int64 {
func (cs *State) GetLastHeight() uint64 {
cs.mtx.RLock()
defer cs.mtx.RUnlock()
return cs.RoundState.Height - 1