diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-08-10 17:32:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-10 17:32:47 +0800 |
commit | f4690458abc24a0a3877f4facb0947c31d29e8cb (patch) | |
tree | 34ab0f3e13d4360b911832bd2fc943a7a2d2736c /core | |
parent | 09a0ab086cdafcb27b74e6346efdc8e96ca8145d (diff) | |
download | dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar.gz dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar.bz2 dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar.lz dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar.xz dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.tar.zst dexon-consensus-f4690458abc24a0a3877f4facb0947c31d29e8cb.zip |
core: Modify Consensus interface (#45)
Diffstat (limited to 'core')
-rw-r--r-- | core/consensus.go | 24 | ||||
-rw-r--r-- | core/consensus_test.go | 20 | ||||
-rw-r--r-- | core/crypto.go | 2 | ||||
-rw-r--r-- | core/crypto_test.go | 6 | ||||
-rw-r--r-- | core/types/block.go | 12 |
5 files changed, 46 insertions, 18 deletions
diff --git a/core/consensus.go b/core/consensus.go index d668c9e..bc6a2d7 100644 --- a/core/consensus.go +++ b/core/consensus.go @@ -26,6 +26,16 @@ import ( "github.com/dexon-foundation/dexon-consensus-core/core/types" ) +// ErrMissingBlockInfo would be reported if some information is missing when +// calling PrepareBlock. It implements error interface. +type ErrMissingBlockInfo struct { + MissingField string +} + +func (e *ErrMissingBlockInfo) Error() string { + return "missing " + e.MissingField + " in block" +} + // Consensus implements DEXON Consensus algorithm. type Consensus struct { app Application @@ -67,7 +77,8 @@ func NewConsensus( } // ProcessBlock is the entry point to submit one block to a Consensus instance. -func (con *Consensus) ProcessBlock(b *types.Block) (err error) { +func (con *Consensus) ProcessBlock(blockConv types.BlockConverter) (err error) { + b := blockConv.Block() var ( deliveredBlocks []*types.Block earlyDelivered bool @@ -121,11 +132,18 @@ func (con *Consensus) ProcessBlock(b *types.Block) (err error) { } // PrepareBlock would setup header fields of block based on its ProposerID. -func (con *Consensus) PrepareBlock(b *types.Block) (err error) { +func (con *Consensus) PrepareBlock(blockConv types.BlockConverter, + proposeTime time.Time) (err error) { + b := blockConv.Block() + if (b.ProposerID == types.ValidatorID{}) { + err = &ErrMissingBlockInfo{MissingField: "ProposerID"} + return + } con.lock.RLock() defer con.lock.RUnlock() con.rbModule.prepareBlock(b) - b.Timestamps[b.ProposerID] = time.Now().UTC() + b.Timestamps[b.ProposerID] = proposeTime + blockConv.SetBlock(b) return } diff --git a/core/consensus_test.go b/core/consensus_test.go index beeb1a7..84542fd 100644 --- a/core/consensus_test.go +++ b/core/consensus_test.go @@ -123,7 +123,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[1], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[1]].con.PrepareBlock(b11)) + req.Nil(objs[validators[1]].con.PrepareBlock(b11, time.Now().UTC())) req.Len(b11.Acks, 4) req.Contains(b11.Acks, b00.Hash) req.Contains(b11.Acks, b10.Hash) @@ -136,7 +136,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[0], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[0]].con.PrepareBlock(b01)) + req.Nil(objs[validators[0]].con.PrepareBlock(b01, time.Now().UTC())) req.Len(b01.Acks, 4) req.Contains(b01.Acks, b11.Hash) // Setup b21. @@ -145,7 +145,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[2], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[2]].con.PrepareBlock(b21)) + req.Nil(objs[validators[2]].con.PrepareBlock(b21, time.Now().UTC())) req.Len(b21.Acks, 4) req.Contains(b21.Acks, b11.Hash) // Setup b31. @@ -154,7 +154,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[3], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[3]].con.PrepareBlock(b31)) + req.Nil(objs[validators[3]].con.PrepareBlock(b31, time.Now().UTC())) req.Len(b31.Acks, 4) req.Contains(b31.Acks, b11.Hash) // Broadcast other height=1 blocks. @@ -168,7 +168,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[0], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[0]].con.PrepareBlock(b02)) + req.Nil(objs[validators[0]].con.PrepareBlock(b02, time.Now().UTC())) req.Len(b02.Acks, 3) req.Contains(b02.Acks, b01.Hash) req.Contains(b02.Acks, b21.Hash) @@ -179,7 +179,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[1], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[1]].con.PrepareBlock(b12)) + req.Nil(objs[validators[1]].con.PrepareBlock(b12, time.Now().UTC())) req.Len(b12.Acks, 4) req.Contains(b12.Acks, b01.Hash) req.Contains(b12.Acks, b11.Hash) @@ -191,7 +191,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[2], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[2]].con.PrepareBlock(b22)) + req.Nil(objs[validators[2]].con.PrepareBlock(b22, time.Now().UTC())) req.Len(b22.Acks, 3) req.Contains(b22.Acks, b01.Hash) req.Contains(b22.Acks, b21.Hash) @@ -202,7 +202,7 @@ func (s *ConsensusTestSuite) TestSimpleDeliverBlock() { ProposerID: validators[3], Hash: common.NewRandomHash(), } - req.Nil(objs[validators[3]].con.PrepareBlock(b32)) + req.Nil(objs[validators[3]].con.PrepareBlock(b32, time.Now().UTC())) req.Len(b32.Acks, 3) req.Contains(b32.Acks, b01.Hash) req.Contains(b32.Acks, b21.Hash) @@ -284,7 +284,7 @@ func (s *ConsensusTestSuite) TestPrepareBlock() { } // Sleep to make sure 'now' is slower than b10's timestamp. time.Sleep(100 * time.Millisecond) - req.Nil(con.PrepareBlock(b11)) + req.Nil(con.PrepareBlock(b11, time.Now().UTC())) // Make sure we would assign 'now' to the timestamp belongs to // the proposer. req.True( @@ -295,7 +295,7 @@ func (s *ConsensusTestSuite) TestPrepareBlock() { ProposerID: validators[1], Hash: common.NewRandomHash(), } - req.Nil(con.PrepareBlock(b12)) + req.Nil(con.PrepareBlock(b12, time.Now().UTC())) req.Len(b12.Acks, 1) req.Contains(b12.Acks, b11.Hash) } diff --git a/core/crypto.go b/core/crypto.go index 3bf8aa8..abfc8fb 100644 --- a/core/crypto.go +++ b/core/crypto.go @@ -89,7 +89,7 @@ func hashBlock(blockConv types.BlockConverter) (common.Hash, error) { } } hashTimestamps := crypto.Keccak256Hash(binaryTimestamps...) - payloadHash := crypto.Keccak256Hash(blockConv.GetPayloads()...) + payloadHash := crypto.Keccak256Hash(blockConv.Payloads()...) hash := crypto.Keccak256Hash( block.ProposerID.Hash[:], diff --git a/core/crypto_test.go b/core/crypto_test.go index be130e2..06f4905 100644 --- a/core/crypto_test.go +++ b/core/crypto_test.go @@ -42,10 +42,14 @@ func (sb *simpleBlock) Block() *types.Block { return sb.block } -func (sb *simpleBlock) GetPayloads() [][]byte { +func (sb *simpleBlock) Payloads() [][]byte { return [][]byte{} } +func (sb *simpleBlock) SetBlock(block *types.Block) { + *sb.block = *block +} + func (s *CryptoTestSuite) prepareBlock(prevBlock *types.Block) *types.Block { acks := make(map[common.Hash]struct{}) timestamps := make(map[types.ValidatorID]time.Time) diff --git a/core/types/block.go b/core/types/block.go index 363de3a..9fd483e 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -78,16 +78,22 @@ func (b *Block) Block() *Block { return b } -// GetPayloads impelmemnts BlockConverter interface. -func (b *Block) GetPayloads() [][]byte { +// Payloads impelmemnts BlockConverter interface. +func (b *Block) Payloads() [][]byte { return [][]byte{} } +// SetBlock implments BlockConverter interface. +func (b *Block) SetBlock(block *Block) { + *b = *block +} + // BlockConverter interface define the interface for extracting block // information from an existing object. type BlockConverter interface { Block() *Block - GetPayloads() [][]byte + Payloads() [][]byte + SetBlock(block *Block) } func (b *Block) String() string { |