From 5bdd73f4a4a9485b31cd63e21e3e69a768599f36 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 18 Apr 2015 23:08:02 -0700 Subject: [PATCH] New genesis.json --- config/config.go | 32 +++++++++++++++++++++++++++++++- consensus/state.go | 21 ++++++++++++--------- state/execution.go | 2 ++ state/validator_set_test.go | 12 +++++++++++- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/config/config.go b/config/config.go index 00ae835fd..13da51449 100644 --- a/config/config.go +++ b/config/config.go @@ -68,10 +68,20 @@ var DefaultGenesis = `{ "Accounts": [ { "Address": "29BF3A0A13001A0D23533386BE03E74923AF1179", - "Amount": 2099900000000000 + "Amount": 2099600000000000 } ], "Validators": [ + { + "PubKey": [1, "1ED8C1E665B5035E62DDB3D6B8E7B4D728E13B5F571E687BB9C4B161C23D7686"], + "Amount": 100000000000, + "UnbondTo": [ + { + "Address": "32B472D2E90FD423ABB6942AB27434471F92D736", + "Amount": 100000000000 + } + ] + }, { "PubKey": [1, "3A2C5C341FFC1D5F7AB518519FF8289D3BFAB82DFD6E167B926FAD72C1BF10F8"], "Amount": 100000000000, @@ -81,6 +91,26 @@ var DefaultGenesis = `{ "Amount": 100000000000 } ] + }, + { + "PubKey": [1, "E9664351DC7C15F431E1ADBA5E135F171F67C85DFF64B689FC3359D62E437EEF"], + "Amount": 100000000000, + "UnbondTo": [ + { + "Address": "F1901AF1B2778DBB7939569A91CEB1FE72A7AB12", + "Amount": 100000000000 + } + ] + }, + { + "PubKey": [1, "5D56001CB46D67045FC78A431E844AC94E5780CCEE235B3D8E8666349F1BC1C2"], + "Amount": 100000000000, + "UnbondTo": [ + { + "Address": "E91C4F631EF6DAA25C3E658F72E152AD853EA221", + "Amount": 100000000000 + } + ] } ] }` diff --git a/consensus/state.go b/consensus/state.go index c1579c7e9..6374e7d7e 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -317,11 +317,10 @@ func (cs *ConsensusState) stepTransitionRoutine() { // For clarity, all state transitions that happen after some timeout are here. // Schedule the next action by pushing a RoundAction{} to cs.runActionCh. - scheduleNextAction := func() { + scheduleNextAction := func(rs *RoundState) { go func() { // NOTE: We can push directly to runActionCh because // we're running in a separate goroutine, which avoids deadlocks. - rs := cs.getRoundState() round, roundStartTime, RoundDuration, _, elapsedRatio := calcRoundInfo(rs.StartTime) log.Debug("Scheduling next action", "height", rs.Height, "round", round, "step", rs.Step, "roundStartTime", roundStartTime, "elapsedRatio", elapsedRatio) switch rs.Step { @@ -351,14 +350,14 @@ func (cs *ConsensusState) stepTransitionRoutine() { // There's nothing to scheudle, we're waiting for // ProposalBlockParts.IsComplete() && // Commits.HasTwoThirdsMajority() - panic("The next action from RoundStepCommit is not scheduled by time") + //panic("The next action from RoundStepCommit is not scheduled by time") default: panic("Should not happen") } }() } - scheduleNextAction() + scheduleNextAction(cs.getRoundState()) // NOTE: All ConsensusState.RunAction*() calls come from here. // Since only one routine calls them, it is safe to assume that @@ -397,7 +396,7 @@ ACTION_LOOP: continue ACTION_LOOP } cs.RunActionPropose(rs.Height, rs.Round) - scheduleNextAction() + scheduleNextAction(rs) continue ACTION_LOOP case RoundActionPrevote: @@ -405,7 +404,7 @@ ACTION_LOOP: continue ACTION_LOOP } cs.RunActionPrevote(rs.Height, rs.Round) - scheduleNextAction() + scheduleNextAction(rs) continue ACTION_LOOP case RoundActionPrecommit: @@ -413,7 +412,7 @@ ACTION_LOOP: continue ACTION_LOOP } cs.RunActionPrecommit(rs.Height, rs.Round) - scheduleNextAction() + scheduleNextAction(rs) continue ACTION_LOOP case RoundActionTryCommit: @@ -428,7 +427,7 @@ ACTION_LOOP: // Could not commit, move onto next round. cs.SetupNewRound(rs.Height, rs.Round+1) // cs.Step is now at RoundStepNewRound - scheduleNextAction() + scheduleNextAction(rs) continue ACTION_LOOP } @@ -450,7 +449,7 @@ ACTION_LOOP: cs.evsw.FireEvent(types.EventStringNewBlock(), newBlock) cs.evc.Flush() }() - scheduleNextAction() + scheduleNextAction(rs) continue ACTION_LOOP } else { // do not schedule next action. @@ -533,14 +532,18 @@ func (cs *ConsensusState) updateToState(state *sm.State, contiguous bool) { // After the call cs.Step becomes RoundStepNewRound. func (cs *ConsensusState) setupNewRound(round uint) { + // XXX Looks like this is just not called. // Sanity check if round == 0 { panic("setupNewRound() should never be called for round 0") } // Increment all the way to round. + log.Debug(Fmt("Validators prior to IncrementAccum: %v, %v-%v", cs.Validators.String(), + round, cs.Round)) validators := cs.Validators.Copy() validators.IncrementAccum(round - cs.Round) + log.Debug(Fmt("Validators after IncrementAccum: %v", validators.String())) cs.Round = round cs.Step = RoundStepNewRound diff --git a/state/execution.go b/state/execution.go index cf2843dbf..c34076314 100644 --- a/state/execution.go +++ b/state/execution.go @@ -151,7 +151,9 @@ func execBlock(s *State, block *types.Block, blockPartsHeader types.PartSetHeade } // Increment validator AccumPowers + log.Debug(Fmt("Bonded Validators prior to IncrementAccum: %v", s.BondedValidators.String())) s.BondedValidators.IncrementAccum(1) + log.Debug(Fmt("Bonded Validators after IncrementAccum: %v", s.BondedValidators.String())) s.LastBlockHeight = block.Height s.LastBlockHash = block.Hash() diff --git a/state/validator_set_test.go b/state/validator_set_test.go index 0153c1440..be108acf9 100644 --- a/state/validator_set_test.go +++ b/state/validator_set_test.go @@ -5,6 +5,7 @@ import ( . "github.com/tendermint/tendermint/common" "bytes" + "fmt" "testing" ) @@ -41,6 +42,15 @@ func TestCopy(t *testing.T) { } } +func TestProposerSelection(t *testing.T) { + vset := randValidatorSet(10) + for i := 0; i < 100; i++ { + val := vset.Proposer() + fmt.Printf("Proposer: %v\n", val) + vset.IncrementAccum(1) + } +} + func BenchmarkValidatorSetCopy(b *testing.B) { b.StopTimer() vset := NewValidatorSet([]*Validator{}) @@ -51,7 +61,7 @@ func BenchmarkValidatorSetCopy(b *testing.B) { PubKey: privAccount.PubKey.(account.PubKeyEd25519), } if !vset.Add(val) { - panic("Failde to add validator") + panic("Failed to add validator") } } b.StartTimer()