diff options
author | Mission Liao <mission.liao@dexon.org> | 2018-10-02 15:45:29 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-02 15:45:29 +0800 |
commit | fb27745f2ca4eaf66f53f48740cbd148ee15bbdf (patch) | |
tree | 1b706c5a93a4f09f27d2bc729cf55c5d4f0b5aaa /core/consensus_test.go | |
parent | d7f6db871180b53548aed6a5450e1c5879c90b04 (diff) | |
download | dexon-consensus-fb27745f2ca4eaf66f53f48740cbd148ee15bbdf.tar.gz dexon-consensus-fb27745f2ca4eaf66f53f48740cbd148ee15bbdf.tar.zst dexon-consensus-fb27745f2ca4eaf66f53f48740cbd148ee15bbdf.zip |
core: replace reliable-broadcast with shard (#159)
Diffstat (limited to 'core/consensus_test.go')
-rw-r--r-- | core/consensus_test.go | 155 |
1 files changed, 62 insertions, 93 deletions
diff --git a/core/consensus_test.go b/core/consensus_test.go index 583a2e5..71163e7 100644 --- a/core/consensus_test.go +++ b/core/consensus_test.go @@ -67,18 +67,16 @@ type ConsensusTestSuite struct { } func (s *ConsensusTestSuite) prepareGenesisBlock( - proposerID types.NodeID, chainID uint32, con *Consensus) *types.Block { block := &types.Block{ - ProposerID: proposerID, Position: types.Position{ ChainID: chainID, }, } err := con.PrepareGenesisBlock(block, time.Now().UTC()) - s.Require().Nil(err) + s.Require().NoError(err) return block } @@ -103,12 +101,14 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { // o o o o <- genesis blocks // 0 1 2 3 <- index of node ID // - // This test case only works for Total Ordering with K=0. + // - This test case only works for Total Ordering with K=0. + // - Byzantine Agreement layer is not taken into consideration, every + // block is passed to shard module directly. var ( gov, err = test.NewGovernance(4, time.Second) - minInterval = gov.GetConfiguration(0).MinBlockInterval + minInterval = gov.Configuration(0).MinBlockInterval req = s.Require() - prvKeys = gov.GetPrivateKeys() + prvKeys = gov.PrivateKeys() nodes []types.NodeID ) s.Require().Nil(err) @@ -134,24 +134,22 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { } } // Genesis blocks - b00 := s.prepareGenesisBlock(nodes[0], 0, objs[nodes[0]].con) - b10 := s.prepareGenesisBlock(nodes[1], 1, objs[nodes[1]].con) - b20 := s.prepareGenesisBlock(nodes[2], 2, objs[nodes[2]].con) - b30 := s.prepareGenesisBlock(nodes[3], 3, objs[nodes[3]].con) + b00 := s.prepareGenesisBlock(0, objs[nodes[0]].con) + b10 := s.prepareGenesisBlock(1, objs[nodes[1]].con) + b20 := s.prepareGenesisBlock(2, objs[nodes[2]].con) + b30 := s.prepareGenesisBlock(3, objs[nodes[3]].con) broadcast(b00) broadcast(b10) broadcast(b20) broadcast(b30) // Setup b11. b11 := &types.Block{ - ProposerID: nodes[1], Position: types.Position{ ChainID: 1, }, } - b11.Hash, err = hashBlock(b11) - s.Require().Nil(err) - req.Nil(objs[nodes[1]].con.prepareBlock(b11, b10.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[1]].con.prepareBlock(b11, b10.Timestamp.Add(minInterval))) req.Len(b11.Acks, 4) req.Contains(b11.Acks, b00.Hash) req.Contains(b11.Acks, b10.Hash) @@ -160,37 +158,43 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { broadcast(b11) // Setup b01. b01 := &types.Block{ - ProposerID: nodes[0], Position: types.Position{ ChainID: 0, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[0]].con.prepareBlock(b01, b00.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[0]].con.prepareBlock(b01, b00.Timestamp.Add(minInterval))) req.Len(b01.Acks, 4) + req.Contains(b01.Acks, b00.Hash) req.Contains(b01.Acks, b11.Hash) + req.Contains(b01.Acks, b20.Hash) + req.Contains(b01.Acks, b30.Hash) // Setup b21. b21 := &types.Block{ - ProposerID: nodes[2], Position: types.Position{ ChainID: 2, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[2]].con.prepareBlock(b21, b20.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[2]].con.prepareBlock(b21, b20.Timestamp.Add(minInterval))) req.Len(b21.Acks, 4) + req.Contains(b21.Acks, b00.Hash) req.Contains(b21.Acks, b11.Hash) + req.Contains(b21.Acks, b20.Hash) + req.Contains(b21.Acks, b30.Hash) // Setup b31. b31 := &types.Block{ - ProposerID: nodes[3], Position: types.Position{ ChainID: 3, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[3]].con.prepareBlock(b31, b30.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[3]].con.prepareBlock(b31, b30.Timestamp.Add(minInterval))) req.Len(b31.Acks, 4) + req.Contains(b31.Acks, b00.Hash) req.Contains(b31.Acks, b11.Hash) + req.Contains(b31.Acks, b20.Hash) + req.Contains(b31.Acks, b30.Hash) // Broadcast other height=1 blocks. broadcast(b01) broadcast(b21) @@ -198,26 +202,24 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { // Setup height=2 blocks. // Setup b02. b02 := &types.Block{ - ProposerID: nodes[0], Position: types.Position{ ChainID: 0, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[0]].con.prepareBlock(b02, b01.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[0]].con.prepareBlock(b02, b01.Timestamp.Add(minInterval))) req.Len(b02.Acks, 3) req.Contains(b02.Acks, b01.Hash) req.Contains(b02.Acks, b21.Hash) req.Contains(b02.Acks, b31.Hash) // Setup b12. b12 := &types.Block{ - ProposerID: nodes[1], Position: types.Position{ ChainID: 1, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[1]].con.prepareBlock(b12, b11.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[1]].con.prepareBlock(b12, b11.Timestamp.Add(minInterval))) req.Len(b12.Acks, 4) req.Contains(b12.Acks, b01.Hash) req.Contains(b12.Acks, b11.Hash) @@ -225,26 +227,24 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { req.Contains(b12.Acks, b31.Hash) // Setup b22. b22 := &types.Block{ - ProposerID: nodes[2], Position: types.Position{ ChainID: 2, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[2]].con.prepareBlock(b22, b21.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[2]].con.prepareBlock(b22, b21.Timestamp.Add(minInterval))) req.Len(b22.Acks, 3) req.Contains(b22.Acks, b01.Hash) req.Contains(b22.Acks, b21.Hash) req.Contains(b22.Acks, b31.Hash) // Setup b32. b32 := &types.Block{ - ProposerID: nodes[3], Position: types.Position{ ChainID: 3, }, - Hash: common.NewRandomHash(), } - req.Nil(objs[nodes[3]].con.prepareBlock(b32, b31.Timestamp.Add(minInterval))) + req.NoError( + objs[nodes[3]].con.prepareBlock(b32, b31.Timestamp.Add(minInterval))) req.Len(b32.Acks, 3) req.Contains(b32.Acks, b01.Hash) req.Contains(b32.Acks, b21.Hash) @@ -269,7 +269,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { // Genesis blocks are delivered by total ordering as a set. delivered0 := common.Hashes{b00.Hash, b10.Hash, b20.Hash, b30.Hash} sort.Sort(delivered0) - req.Len(app.TotalOrdered, 2) + req.Len(app.TotalOrdered, 4) req.Equal(app.TotalOrdered[0].BlockHashes, delivered0) req.False(app.TotalOrdered[0].Early) // b11 is the sencond set delivered by total ordering. @@ -277,6 +277,16 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { sort.Sort(delivered1) req.Equal(app.TotalOrdered[1].BlockHashes, delivered1) req.False(app.TotalOrdered[1].Early) + // b01, b21, b31 are the third set delivered by total ordering. + delivered2 := common.Hashes{b01.Hash, b21.Hash, b31.Hash} + sort.Sort(delivered2) + req.Equal(app.TotalOrdered[2].BlockHashes, delivered2) + req.False(app.TotalOrdered[2].Early) + // b02, b12, b22, b32 are the fourth set delivered by total ordering. + delivered3 := common.Hashes{b02.Hash, b12.Hash, b22.Hash, b32.Hash} + sort.Sort(delivered3) + req.Equal(app.TotalOrdered[3].BlockHashes, delivered3) + req.False(app.TotalOrdered[3].Early) // Check generated timestamps. req.Contains(app.Delivered, b00.Hash) req.Contains(app.Delivered, b10.Hash) @@ -292,7 +302,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { timestamps[2] = b20.Timestamp timestamps[3] = b30.Timestamp t, err := getMedianTime(timestamps) - req.Nil(err) + req.NoError(err) req.Equal(t, app.Delivered[b11.Hash].ConsensusTime) } for _, obj := range objs { @@ -313,7 +323,7 @@ func (s *ConsensusTestSuite) TestPrepareBlock() { gov, err = test.NewGovernance(4, time.Second) req = s.Require() nodes []types.NodeID - prvKeys = gov.GetPrivateKeys() + prvKeys = gov.PrivateKeys() ) s.Require().Nil(err) // Setup core.Consensus and test.App. @@ -324,10 +334,10 @@ func (s *ConsensusTestSuite) TestPrepareBlock() { cons[nID] = con nodes = append(nodes, nID) } - b00 := s.prepareGenesisBlock(nodes[0], 0, cons[nodes[0]]) - b10 := s.prepareGenesisBlock(nodes[1], 1, cons[nodes[1]]) - b20 := s.prepareGenesisBlock(nodes[2], 2, cons[nodes[2]]) - b30 := s.prepareGenesisBlock(nodes[3], 3, cons[nodes[3]]) + b00 := s.prepareGenesisBlock(0, cons[nodes[0]]) + b10 := s.prepareGenesisBlock(1, cons[nodes[1]]) + b20 := s.prepareGenesisBlock(2, cons[nodes[2]]) + b30 := s.prepareGenesisBlock(3, cons[nodes[3]]) for _, con := range cons { req.Nil(con.processBlock(b00)) req.Nil(con.processBlock(b10)) @@ -335,74 +345,33 @@ func (s *ConsensusTestSuite) TestPrepareBlock() { req.Nil(con.processBlock(b30)) } b11 := &types.Block{ - ProposerID: nodes[1], + Position: types.Position{ChainID: b10.Position.ChainID}, } - interval := gov.GetConfiguration(0).MinBlockInterval + interval := gov.Configuration(0).MinBlockInterval req.Nil(cons[nodes[1]].prepareBlock(b11, b10.Timestamp.Add(interval))) for _, con := range cons { + req.Nil(con.preProcessBlock(b11)) req.Nil(con.processBlock(b11)) } b12 := &types.Block{ - ProposerID: nodes[1], + Position: types.Position{ChainID: b11.Position.ChainID}, } - req.Nil(cons[nodes[1]].prepareBlock(b12, b10.Timestamp.Add(interval))) + req.Nil(cons[nodes[1]].prepareBlock(b12, b11.Timestamp.Add(interval))) req.Len(b12.Acks, 1) req.Contains(b12.Acks, b11.Hash) } func (s *ConsensusTestSuite) TestPrepareGenesisBlock() { gov, err := test.NewGovernance(4, time.Second) - s.Require().Nil(err) - prvKey := gov.GetPrivateKeys()[0] + s.Require().NoError(err) + prvKey := gov.PrivateKeys()[0] _, con := s.prepareConsensus(gov, prvKey) block := &types.Block{ - ProposerID: types.NewNodeID(prvKey.PublicKey()), + Position: types.Position{ChainID: 0}, } - con.PrepareGenesisBlock(block, time.Now().UTC()) + s.Require().NoError(con.PrepareGenesisBlock(block, time.Now().UTC())) s.True(block.IsGenesis()) - s.Nil(con.sanityCheck(block)) -} - -func (s *ConsensusTestSuite) TestSanityCheck() { - gov, err := test.NewGovernance(4, time.Second) - s.Require().Nil(err) - prvKey := gov.GetPrivateKeys()[0] - _, con := s.prepareConsensus(gov, prvKey) - nID := types.NewNodeID(prvKey.PublicKey()) - b0 := s.prepareGenesisBlock(nID, 0, con) - s.Require().NoError(con.processBlock(b0)) - invalidChain := &types.Block{ - ProposerID: nID, - Position: types.Position{ - ChainID: 1000, - }, - } - s.Equal(ErrIncorrectBlockPosition, con.sanityCheck(invalidChain)) - invalidTimestamp := &types.Block{ - ProposerID: nID, - } - s.Require().NoError(con.prepareBlock(invalidTimestamp, b0.Timestamp)) - s.Equal(ErrIncorrectBlockTime, con.sanityCheck(invalidTimestamp)) - s.Require().NoError(con.prepareBlock(invalidTimestamp, b0.Timestamp.Add( - gov.GetConfiguration(0).MaxBlockInterval).Add(1*time.Second))) - s.Equal(ErrIncorrectBlockTime, con.sanityCheck(invalidTimestamp)) - - ts := b0.Timestamp.Add(gov.GetConfiguration(0).MinBlockInterval) - - invalidHash := &types.Block{ - ProposerID: nID, - } - s.Require().NoError(con.prepareBlock(invalidHash, ts)) - invalidHash.Hash = common.NewRandomHash() - s.Equal(ErrIncorrectHash, con.sanityCheck(invalidHash)) - - invalidSignature := &types.Block{ - ProposerID: nID, - } - s.Require().NoError(con.prepareBlock(invalidSignature, ts)) - invalidSignature.Signature, err = prvKey.Sign(common.NewRandomHash()) - s.Require().NoError(err) - s.Equal(ErrIncorrectSignature, con.sanityCheck(invalidSignature)) + s.NoError(con.preProcessBlock(block)) } func TestConsensus(t *testing.T) { |