diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-08-14 23:48:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-14 23:48:40 +0800 |
commit | c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368 (patch) | |
tree | b6eb1a43c11f796cbcdd6267298d7f41ac4dad1b /core/consensus.go | |
parent | 763404d4158c917297012cf06634eb1697b459d6 (diff) | |
download | tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar.gz tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar.bz2 tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar.lz tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar.xz tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.tar.zst tangerine-consensus-c4bfb69724f5fb777fbf5fc272dc65a0f9d1f368.zip |
core: Prepare Genesis block. (#54)
Diffstat (limited to 'core/consensus.go')
-rw-r--r-- | core/consensus.go | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/core/consensus.go b/core/consensus.go index c8b10a0..9b95e56 100644 --- a/core/consensus.go +++ b/core/consensus.go @@ -42,10 +42,11 @@ func (e *ErrMissingBlockInfo) Error() string { return "missing " + e.MissingField + " in block" } -// Errors for sanity check error. +// Errors for consensus core. var ( - ErrIncorrectHash = fmt.Errorf("hash of block is incorrect") - ErrIncorrectSignature = fmt.Errorf("signature of block is incorrect") + ErrIncorrectHash = fmt.Errorf("hash of block is incorrect") + ErrIncorrectSignature = fmt.Errorf("signature of block is incorrect") + ErrGenesisBlockNotEmpty = fmt.Errorf("genesis block should be empty") ) // Consensus implements DEXON Consensus algorithm. @@ -103,8 +104,6 @@ func (con *Consensus) sanityCheck(blockConv types.BlockConverter) (err error) { return ErrIncorrectHash } - /* Disable these check before the implmentation of the signature for - * genesis block is finished. // Check the signer. pubKey, err := con.sigToPub(b.Hash, b.Signature) if err != nil { @@ -113,7 +112,6 @@ func (con *Consensus) sanityCheck(blockConv types.BlockConverter) (err error) { if !b.ProposerID.Equal(crypto.Keccak256Hash(pubKey.Bytes())) { return ErrIncorrectSignature } - */ return nil } @@ -176,12 +174,20 @@ func (con *Consensus) ProcessBlock(blockConv types.BlockConverter) (err error) { return } +func (con *Consensus) checkPrepareBlock( + b *types.Block, proposeTime time.Time) (err error) { + if (b.ProposerID == types.ValidatorID{}) { + err = &ErrMissingBlockInfo{MissingField: "ProposerID"} + return + } + return +} + // PrepareBlock would setup header fields of block based on its ProposerID. func (con *Consensus) PrepareBlock(blockConv types.BlockConverter, proposeTime time.Time) (err error) { b := blockConv.Block() - if (b.ProposerID == types.ValidatorID{}) { - err = &ErrMissingBlockInfo{MissingField: "ProposerID"} + if err = con.checkPrepareBlock(b, proposeTime); err != nil { return } con.lock.RLock() @@ -200,3 +206,34 @@ func (con *Consensus) PrepareBlock(blockConv types.BlockConverter, blockConv.SetBlock(b) return } + +// PrepareGenesisBlock would setup header fields for genesis block. +func (con *Consensus) PrepareGenesisBlock(blockConv types.BlockConverter, + proposeTime time.Time) (err error) { + b := blockConv.Block() + if err = con.checkPrepareBlock(b, proposeTime); err != nil { + return + } + if len(b.Payloads()) != 0 { + err = ErrGenesisBlockNotEmpty + return + } + b.Height = 0 + b.ParentHash = common.Hash{} + b.Acks = make(map[common.Hash]struct{}) + b.Timestamps = make(map[types.ValidatorID]time.Time) + for vID := range con.gov.GetValidatorSet() { + b.Timestamps[vID] = time.Time{} + } + b.Timestamps[b.ProposerID] = proposeTime + b.Hash, err = hashBlock(b) + if err != nil { + return + } + b.Signature, err = con.prvKey.Sign(b.Hash) + if err != nil { + return + } + blockConv.SetBlock(b) + return +} |