From 0e82a1377226f34fd652943e138fb06f0b985134 Mon Sep 17 00:00:00 2001 From: Paladz Date: Wed, 27 Nov 2019 19:04:21 +0800 Subject: [PATCH] init version for edit sign process (#454) * init version for edit sign process * eleagent the code * elegant the code --- proposal/proposal.go | 7 +++++-- protocol/bbft.go | 42 +++++++++++++++++++++++++++++++++--------- protocol/block.go | 23 +++++++++-------------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/proposal/proposal.go b/proposal/proposal.go index 847017b4..7809067a 100644 --- a/proposal/proposal.go +++ b/proposal/proposal.go @@ -182,8 +182,11 @@ func (b *blockBuilder) build() (*types.Block, error) { return nil, err } - _, err := b.chain.SignBlock(b.block) - return b.block, err + if err := b.chain.SignBlockHeader(&b.block.BlockHeader); err != nil { + return nil, err + } + + return b.block, nil } func (b *blockBuilder) calcBlockCommitment() (err error) { diff --git a/protocol/bbft.go b/protocol/bbft.go index a6a6debb..fa58664f 100644 --- a/protocol/bbft.go +++ b/protocol/bbft.go @@ -199,27 +199,51 @@ func (c *Chain) ProcessBlockSignature(signature, xPub []byte, blockHash *bc.Hash return c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: *blockHash, Signature: signature, XPub: xPub}) } -// SignBlock signing the block if current node is consensus node -func (c *Chain) SignBlock(block *types.Block) ([]byte, error) { +// SignBlockHeader signing the block if current node is consensus node +func (c *Chain) SignBlockHeader(blockHeader *types.BlockHeader) error { + _, err := c.signBlockHeader(blockHeader) + return err +} + +func (c *Chain) applyBlockSign(blockHeader *types.BlockHeader) error { + signature, err := c.signBlockHeader(blockHeader) + if err != nil { + return err + } + + if len(signature) == 0 { + return nil + } + + if err := c.store.SaveBlockHeader(blockHeader); err != nil { + return err + } + + xpub := config.CommonConfig.PrivateKey().XPub() + return c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: blockHeader.Hash(), Signature: signature, XPub: xpub[:]}) +} + +func (c *Chain) signBlockHeader(blockHeader *types.BlockHeader) ([]byte, error) { xprv := config.CommonConfig.PrivateKey() - xpubStr := xprv.XPub().String() - node, err := c.getConsensusNode(&block.PreviousBlockHash, xpubStr) + xpub := xprv.XPub() + node, err := c.getConsensusNode(&blockHeader.PreviousBlockHash, xpub.String()) if err == errNotFoundConsensusNode { return nil, nil } else if err != nil { return nil, err } - if err := c.checkDoubleSign(&block.BlockHeader, node.XPub.String()); err == errDoubleSignBlock { + if err := c.checkDoubleSign(blockHeader, node.XPub.String()); err == errDoubleSignBlock { return nil, nil } else if err != nil { return nil, err } - signature := block.Get(node.Order) - if len(signature) == 0 { - signature = xprv.Sign(block.Hash().Bytes()) - block.Set(node.Order, signature) + if signature := blockHeader.Get(node.Order); len(signature) != 0 { + return nil, nil } + + signature := xprv.Sign(blockHeader.Hash().Bytes()) + blockHeader.Set(node.Order, signature) return signature, nil } diff --git a/protocol/block.go b/protocol/block.go index e9b2746b..3b08fbd5 100644 --- a/protocol/block.go +++ b/protocol/block.go @@ -3,9 +3,7 @@ package protocol import ( log "github.com/sirupsen/logrus" - "github.com/vapor/config" "github.com/vapor/errors" - "github.com/vapor/event" "github.com/vapor/protocol/bc" "github.com/vapor/protocol/bc/types" "github.com/vapor/protocol/state" @@ -120,6 +118,10 @@ func (c *Chain) connectBlock(block *types.Block) (err error) { } } + if err := c.applyBlockSign(&block.BlockHeader); err != nil { + return err + } + irrBlockHeader := c.lastIrrBlockHeader if c.isIrreversible(&block.BlockHeader) && block.Height > irrBlockHeader.Height { irrBlockHeader = &block.BlockHeader @@ -231,6 +233,10 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { consensusResults = append(consensusResults, consensusResult.Fork()) } + if err := c.applyBlockSign(attachBlockHeader); err != nil { + return err + } + if c.isIrreversible(attachBlockHeader) && attachBlockHeader.Height > irrBlockHeader.Height { irrBlockHeader = attachBlockHeader } @@ -309,22 +315,11 @@ func (c *Chain) saveBlock(block *types.Block) error { } } - signature, err := c.SignBlock(block) - if err != nil { - return errors.Sub(ErrBadBlock, err) - } - if err := c.store.SaveBlock(block, bcBlock.TransactionStatus); err != nil { return err } - c.orphanManage.Delete(&bcBlock.ID) - if len(signature) != 0 { - xPub := config.CommonConfig.PrivateKey().XPub() - if err := c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: block.Hash(), Signature: signature, XPub: xPub[:]}); err != nil { - return err - } - } + c.orphanManage.Delete(&bcBlock.ID) return nil } -- 2.11.0