-func (c *Chain) isIrreversible(blockNode *state.BlockNode) bool {
- consensusNodes, err := c.consensusNodeManager.getConsensusNodes(&blockNode.Parent.Hash)
+func (c *Chain) checkDoubleSign(bh *types.BlockHeader, xPub string) error {
+ blockHashes, err := c.store.GetBlockHashesByHeight(bh.Height)
+ if err != nil {
+ return err
+ }
+
+ for _, blockHash := range blockHashes {
+ if *blockHash == bh.Hash() {
+ continue
+ }
+
+ blockHeader, err := c.store.GetBlockHeader(blockHash)
+ if err != nil {
+ return err
+ }
+
+ consensusNode, err := c.getConsensusNode(&blockHeader.PreviousBlockHash, xPub)
+ if err == errNotFoundConsensusNode {
+ continue
+ } else if err != nil {
+ return err
+ }
+
+ if blockHeader.BlockWitness.Get(consensusNode.Order) != nil {
+ return errDoubleSignBlock
+ }
+ }
+ return nil
+}
+
+func (c *Chain) checkNodeSign(bh *types.BlockHeader, consensusNode *state.ConsensusNode, signature []byte) error {
+ if !consensusNode.XPub.Verify(bh.Hash().Bytes(), signature) {
+ return errInvalidSignature
+ }
+
+ return c.checkDoubleSign(bh, consensusNode.XPub.String())
+}
+
+func (c *Chain) isIrreversible(blockHeader *types.BlockHeader) bool {
+ consensusNodes, err := c.getConsensusNodes(&blockHeader.PreviousBlockHash)