aboutsummaryrefslogtreecommitdiffstats
path: root/core/types
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-07-16 00:12:17 +0800
committerWei-Ning Huang <w@cobinhood.com>2018-07-16 11:06:14 +0800
commitaed24cf020bd11c3b20a7011b96c02e41894fa32 (patch)
tree720bc1542dd1edb7308c124a5265e21b3c01d08b /core/types
downloaddexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.gz
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.bz2
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.lz
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.xz
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.zst
dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.zip
Initial implementation of DEXON consensus algorithm
Diffstat (limited to 'core/types')
-rw-r--r--core/types/block.go89
-rw-r--r--core/types/validator.go37
2 files changed, 126 insertions, 0 deletions
diff --git a/core/types/block.go b/core/types/block.go
new file mode 100644
index 0000000..265d32f
--- /dev/null
+++ b/core/types/block.go
@@ -0,0 +1,89 @@
+// 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 Pubic License as
+// pubished 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 Pubic License for more details.
+//
+// You should have received a copy of the GNU Lesser General Pubic License
+// along with the dexon-consensus-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package types
+
+import (
+ "bytes"
+ "fmt"
+ "time"
+
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+)
+
+// State represent the block process state.
+type State int
+
+// Block Status.
+const (
+ BlockStatusInit State = iota
+ BlockStatusAcked
+ BlockStatusToTo
+ BlockStatusFinal
+)
+
+// Block represents a single event broadcasted on the network.
+type Block struct {
+ ProposerID ValidatorID
+ ParentHash common.Hash
+ Hash common.Hash
+ Height uint64
+ Timestamps map[ValidatorID]time.Time
+ Acks map[common.Hash]struct{}
+
+ IndirectAcks map[common.Hash]struct{}
+ AckedBy map[common.Hash]bool // bool: direct
+ State State
+}
+
+func (b *Block) String() string {
+ return fmt.Sprintf("Block(%v)", b.Hash.String()[:6])
+}
+
+// Clone returns a deep copy of a block.
+func (b *Block) Clone() *Block {
+ bcopy := &Block{
+ ProposerID: b.ProposerID,
+ ParentHash: b.ParentHash,
+ Hash: b.Hash,
+ Height: b.Height,
+ Timestamps: make(map[ValidatorID]time.Time),
+ Acks: make(map[common.Hash]struct{}),
+ }
+ for k, v := range b.Timestamps {
+ bcopy.Timestamps[k] = v
+ }
+ for k, v := range b.Acks {
+ bcopy.Acks[k] = v
+ }
+ return bcopy
+}
+
+// ByHash is the helper type for sorting slice of blocks by hash.
+type ByHash []*Block
+
+func (b ByHash) Len() int {
+ return len(b)
+}
+
+func (b ByHash) Less(i int, j int) bool {
+ return bytes.Compare([]byte(b[i].Hash[:]), []byte(b[j].Hash[:])) == -1
+}
+
+func (b ByHash) Swap(i int, j int) {
+ b[i], b[j] = b[j], b[i]
+}
diff --git a/core/types/validator.go b/core/types/validator.go
new file mode 100644
index 0000000..5d424e8
--- /dev/null
+++ b/core/types/validator.go
@@ -0,0 +1,37 @@
+// 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 types
+
+import (
+ "bytes"
+ "encoding/hex"
+
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+)
+
+// ValidatorID is the ID type for validators.
+type ValidatorID common.Hash
+
+func (v ValidatorID) String() string {
+ return hex.EncodeToString([]byte(v[:]))[:6]
+}
+
+// Equal check if two validator IDs are the same.
+func (v ValidatorID) Equal(v2 ValidatorID) bool {
+ return bytes.Compare([]byte(v[:]), []byte(v2[:])) == 0
+}