aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-08-10 17:32:47 +0800
committerGitHub <noreply@github.com>2018-08-10 17:32:47 +0800
commitf4690458abc24a0a3877f4facb0947c31d29e8cb (patch)
tree34ab0f3e13d4360b911832bd2fc943a7a2d2736c /core
parent09a0ab086cdafcb27b74e6346efdc8e96ca8145d (diff)
downloaddexon-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.go24
-rw-r--r--core/consensus_test.go20
-rw-r--r--core/crypto.go2
-rw-r--r--core/crypto_test.go6
-rw-r--r--core/types/block.go12
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 {