aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-07-31 22:39:05 +0800
committerGitHub <noreply@github.com>2018-07-31 22:39:05 +0800
commitea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c (patch)
tree19de3fe44b3c4822f78bd2405f99c07c1130cdd8
parent3778e956013cad171cd5954686831e2598de3045 (diff)
downloaddexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar.gz
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar.bz2
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar.lz
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar.xz
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.tar.zst
dexon-consensus-ea2d10b0c7874e6c1d3dd1cf2487ad2525ebb59c.zip
core: refine Application interface and add Governance interface (#24)
Add a new Governance interface for interaction with the governance contract. Also remove the ValidateBlock call in application interface as the application should validate it before putting it into the consensus module. A new BlockConverter interface is also added. The consensus module should accept the BlockConverter interface in future implementation, and use the Block() function to get the underlying block info.
-rw-r--r--core/application.go15
-rw-r--r--core/blocklattice.go2
-rw-r--r--core/blocklattice_test.go10
-rw-r--r--core/governance.go53
-rw-r--r--core/types/block.go6
-rw-r--r--simulation/app.go14
6 files changed, 84 insertions, 16 deletions
diff --git a/core/application.go b/core/application.go
index 7eca66e..edeb686 100644
--- a/core/application.go
+++ b/core/application.go
@@ -17,11 +17,20 @@
package core
-import "github.com/dexon-foundation/dexon-consensus-core/core/types"
+import (
+ "time"
+
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+ "github.com/dexon-foundation/dexon-consensus-core/core/types"
+)
// Application describes the application interface that interacts with DEXON
// consensus core.
type Application interface {
- ValidateBlock(b *types.Block) bool
- Deliver(blocks []*types.Block, early bool)
+ // TotalOrderingDeliver is called when the total ordering algorithm deliver
+ // a set of block.
+ TotalOrderingDeliver(blocks []*types.Block, early bool)
+
+ // DeliverBlock is called when a block is add to the compaction chain.
+ DeliverBlock(blockHash common.Hash, timestamp time.Time)
}
diff --git a/core/blocklattice.go b/core/blocklattice.go
index e4a76cc..1f12474 100644
--- a/core/blocklattice.go
+++ b/core/blocklattice.go
@@ -532,7 +532,7 @@ func (l *BlockLattice) totalOrdering(b *types.Block) {
sort.Sort(types.ByHash(output))
if len(output) > 0 {
- l.app.Deliver(output, earlyDelivery)
+ l.app.TotalOrderingDeliver(output, earlyDelivery)
}
// Rescan pending blocks to add into candidate set.
diff --git a/core/blocklattice_test.go b/core/blocklattice_test.go
index 0f78dc5..835c35e 100644
--- a/core/blocklattice_test.go
+++ b/core/blocklattice_test.go
@@ -20,6 +20,7 @@ package core
import (
"sort"
"testing"
+ "time"
"github.com/stretchr/testify/suite"
@@ -42,15 +43,14 @@ type TestApp struct {
Early bool
}
-func (a *TestApp) ValidateBlock(b *types.Block) bool {
- return true
-}
-
-func (a *TestApp) Deliver(blocks []*types.Block, early bool) {
+func (a *TestApp) TotalOrderingDeliver(blocks []*types.Block, early bool) {
a.Outputs = append(a.Outputs, blocks...)
a.Early = early
}
+func (a *TestApp) DeliverBlock(blockHashes common.Hash, timestamp time.Time) {
+}
+
func (a *TestApp) Clear() {
a.Outputs = nil
a.Early = false
diff --git a/core/governance.go b/core/governance.go
new file mode 100644
index 0000000..a3bc3af
--- /dev/null
+++ b/core/governance.go
@@ -0,0 +1,53 @@
+// Copyright 2018 The dexon-consensus-core Authors
+// This file is part of the dexon-consensus-core library.
+//
+// The dexon-consensus-core library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus-core library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package core
+
+import (
+ "github.com/cobinhood/decimal"
+
+ "github.com/dexon-foundation/dexon-consensus-core/core/types"
+)
+
+// MembershipActionType specifies the action of a membership event.
+type MembershipActionType int
+
+// Event enums.
+const (
+ MembershipActionAdd MembershipActionType = 0
+ MembershipActionDelete MembershipActionType = 1
+)
+
+// MembershipEvent specifies the event of membership changes.
+type MembershipEvent struct {
+ Epoch int
+ Action MembershipActionType
+}
+
+// Governance interface specifies interface to control the governance contract.
+// Note that there are a lot more methods in the governance contract, that this
+// interface only define those that are required to run the consensus algorithm.
+type Governance interface {
+ // Get the current validator set and it's corresponding stake.
+ GetValidatorSet() map[types.ValidatorID]decimal.Decimal
+
+ // Get block proposing interval (in milliseconds).
+ GetBlockProposingInterval() int
+
+ // Get membership events after a certain epoch.
+ GetMembershipEvents(epoch int) []MembershipEvent
+}
diff --git a/core/types/block.go b/core/types/block.go
index 61b6535..c445fd2 100644
--- a/core/types/block.go
+++ b/core/types/block.go
@@ -50,6 +50,12 @@ type Block struct {
Status Status `json:"-"`
}
+// BlockConverter interface define the interface for extracting block
+// information from an existing object.
+type BlockConverter interface {
+ Block() *Block
+}
+
func (b *Block) String() string {
return fmt.Sprintf("Block(%v)", b.Hash.String()[:6])
}
diff --git a/simulation/app.go b/simulation/app.go
index b6851f8..aea7acf 100644
--- a/simulation/app.go
+++ b/simulation/app.go
@@ -43,13 +43,9 @@ func NewSimApp(id types.ValidatorID, Network PeerServerNetwork) *SimApp {
}
}
-// ValidateBlock validates a given block.
-func (a *SimApp) ValidateBlock(b *types.Block) bool {
- return true
-}
-
-// Deliver is called when blocks are delivered by the total ordering algorithm.
-func (a *SimApp) Deliver(blocks []*types.Block, early bool) {
+// TotalOrderingDeliver is called when blocks are delivered by the total
+// ordering algorithm.
+func (a *SimApp) TotalOrderingDeliver(blocks []*types.Block, early bool) {
now := time.Now()
a.Outputs = blocks
a.Early = early
@@ -74,3 +70,7 @@ func (a *SimApp) Deliver(blocks []*types.Block, early bool) {
a.Network.DeliverBlocks(blockList)
a.DeliverID++
}
+
+// DeliverBlock is called when a block in compaction chain is delivered.
+func (a *SimApp) DeliverBlock(blockHash common.Hash, timestamp time.Time) {
+}