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 }