aboutsummaryrefslogtreecommitdiffstats
path: root/core/consensus.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-08-12 00:40:29 +0800
committerWei-Ning Huang <aitjcize@gmail.com>2018-08-12 00:40:29 +0800
commita57a1c2392f6f150d2127cc28236ca74f338dd7e (patch)
tree1d295e5d43688b3346504068b2f0038faf574dd1 /core/consensus.go
parent08c208c21f93d55bf3275610cbaf3ee6a545956a (diff)
downloadtangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar.gz
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar.bz2
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar.lz
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar.xz
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.tar.zst
tangerine-consensus-a57a1c2392f6f150d2127cc28236ca74f338dd7e.zip
core: Hash block in Consensus.PrepareBlock. (#46)
* Add hash to block * Check block hash in Consensus.sanityCheck * Add hashBlockFn in block generator.go
Diffstat (limited to 'core/consensus.go')
-rw-r--r--core/consensus.go22
1 files changed, 22 insertions, 0 deletions
diff --git a/core/consensus.go b/core/consensus.go
index bc6a2d7..b1b1973 100644
--- a/core/consensus.go
+++ b/core/consensus.go
@@ -18,6 +18,7 @@
package core
import (
+ "fmt"
"sync"
"time"
@@ -36,6 +37,11 @@ func (e *ErrMissingBlockInfo) Error() string {
return "missing " + e.MissingField + " in block"
}
+// Errors for sanity check error.
+var (
+ ErrIncorrectHash = fmt.Errorf("hash of block is incorrect")
+)
+
// Consensus implements DEXON Consensus algorithm.
type Consensus struct {
app Application
@@ -76,8 +82,23 @@ func NewConsensus(
}
}
+// sanityCheck checks if the block is a valid block
+func (con *Consensus) sanityCheck(blockConv types.BlockConverter) (err error) {
+ b := blockConv.Block()
+ // Check the hash of block.
+ hash, err := hashBlock(blockConv)
+ if err != nil || hash != b.Hash {
+ return ErrIncorrectHash
+ }
+
+ return nil
+}
+
// ProcessBlock is the entry point to submit one block to a Consensus instance.
func (con *Consensus) ProcessBlock(blockConv types.BlockConverter) (err error) {
+ if err := con.sanityCheck(blockConv); err != nil {
+ return err
+ }
b := blockConv.Block()
var (
deliveredBlocks []*types.Block
@@ -144,6 +165,7 @@ func (con *Consensus) PrepareBlock(blockConv types.BlockConverter,
con.rbModule.prepareBlock(b)
b.Timestamps[b.ProposerID] = proposeTime
+ b.Hash, err = hashBlock(b)
blockConv.SetBlock(b)
return
}