github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/orgchain/validation/validate_block.go (about)

     1  package validation
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"sort"
     7  
     8  	"github.com/sixexorg/magnetic-ring/core/orgchain/types"
     9  	"github.com/sixexorg/magnetic-ring/errors"
    10  	"github.com/sixexorg/magnetic-ring/log"
    11  	"github.com/sixexorg/magnetic-ring/store/storelaw"
    12  )
    13  
    14  func ValidateBlock(block *types.Block, ledgerStore storelaw.Ledger4Validation) (blkInfo *storelaw.OrgBlockInfo, err error) {
    15  	sv := NewStateValidate(ledgerStore, block.Header.LeagueId)
    16  	txLen := block.Transactions.Len()
    17  	if txLen > 0 {
    18  		txsch := make(chan *types.Transaction, block.Transactions.Len())
    19  		txs := types.TxByNonce(block.Transactions)
    20  		sort.Sort(txs)
    21  		go func(txs types.TxByNonce) {
    22  			for k, _ := range txs {
    23  				txsch <- txs[k]
    24  			}
    25  		}(txs)
    26  		count := 0
    27  		breakCount := block.Transactions.Len() * block.Transactions.Len()
    28  
    29  		ii := 0
    30  		for ch := range txsch {
    31  			count++
    32  			re, _ := sv.VerifyTx(ch)
    33  			if re == 0 {
    34  				txTmp := ch
    35  				txsch <- txTmp
    36  			} else if re == -1 {
    37  				err = errors.ERR_BLOCK_ABNORMAL_TXS
    38  				return
    39  			} else if re == 1 {
    40  				ii++
    41  				if ii == block.Transactions.Len() {
    42  					close(txsch)
    43  				}
    44  			}
    45  			if count > breakCount {
    46  				err = errors.ERR_BLOCK_ABNORMAL_TXS
    47  				return
    48  			}
    49  		}
    50  		//to clear
    51  		if count > breakCount {
    52  			err = errors.ERR_BLOCK_ABNORMAL_TXS
    53  			return
    54  		}
    55  	}
    56  	blkInfo = sv.ExecuteOplogs()
    57  	/*	fmt.Printf("blockNew:\n txroot:%s\n receipt:%s\n account:%s\n league:%s\n",
    58  		blockNew.Header.TxRoot.String(),
    59  		blockNew.Header.ReceiptsRoot.String(),
    60  		blockNew.Header.StateRoot.String(),
    61  	)*/
    62  	/*	for k, v := range receipts {
    63  			fmt.Printf("num:%d, status:%t, txhash:%s, gasused:%d \n", k, v.Status, v.TxHash.String(), v.GasUsed)
    64  		}
    65  		fmt.Println("---------------------------root cmp-------------------------------")
    66  
    67  	*/
    68  	log.Info(fmt.Sprintf("root cmp blocknew: receipt:%s  state:%s\n", blkInfo.Block.Header.ReceiptsRoot.String(), blkInfo.Block.Header.StateRoot.String()))
    69  	log.Info(fmt.Sprintf("root cmp blockold: receipt:%s  state:%s\n", block.Header.ReceiptsRoot.String(), block.Header.StateRoot.String()))
    70  
    71  	if blkInfo.Block.Header.ReceiptsRoot != block.Header.ReceiptsRoot ||
    72  		blkInfo.Block.Header.StateRoot != block.Header.StateRoot {
    73  		err = errors.ERR_BLOCK_ABNORMAL_TXS
    74  	}
    75  	blkInfo.Block.Header.Difficulty = block.Header.Difficulty
    76  	blkInfo.Block.Header.Timestamp = block.Header.Timestamp
    77  	blkInfo.Block.Header.Coinbase = block.Header.Coinbase
    78  	blkInfo.Block.Header.Extra = block.Header.Extra
    79  	return
    80  }