VerifyBlock checks whether the block is valid
(block *types.Block, ld *ledger.Ledger, completely bool)
| 33 | |
| 34 | // VerifyBlock checks whether the block is valid |
| 35 | func VerifyBlock(block *types.Block, ld *ledger.Ledger, completely bool) error { |
| 36 | header := block.Header |
| 37 | if header.Height == 0 { |
| 38 | return nil |
| 39 | } |
| 40 | |
| 41 | m := len(header.Bookkeepers) - (len(header.Bookkeepers)-1)/3 |
| 42 | hash := block.Hash() |
| 43 | err := signature.VerifyMultiSignature(hash[:], header.Bookkeepers, m, header.SigData) |
| 44 | if err != nil { |
| 45 | return err |
| 46 | } |
| 47 | |
| 48 | prevHeader, err := ld.GetHeaderByHash(block.Header.PrevBlockHash) |
| 49 | if err != nil { |
| 50 | return fmt.Errorf("[BlockValidator], can not find prevHeader: %s", err) |
| 51 | } |
| 52 | |
| 53 | err = VerifyHeader(block.Header, prevHeader) |
| 54 | if err != nil { |
| 55 | return err |
| 56 | } |
| 57 | |
| 58 | //verfiy block's transactions |
| 59 | if completely { |
| 60 | /* |
| 61 | //TODO: NextBookkeeper Check. |
| 62 | bookkeeperaddress, err := ledger.GetBookkeeperAddress(ld.Blockchain.GetBookkeepersByTXs(block.Transactions)) |
| 63 | if err != nil { |
| 64 | return errors.New(fmt.Sprintf("GetBookkeeperAddress Failed.")) |
| 65 | } |
| 66 | if block.Header.NextBookkeeper != bookkeeperaddress { |
| 67 | return errors.New(fmt.Sprintf("Bookkeeper is not validate.")) |
| 68 | } |
| 69 | */ |
| 70 | for _, txVerify := range block.Transactions { |
| 71 | if errCode := VerifyTransaction(txVerify); errCode != ontErrors.ErrNoError { |
| 72 | return errors.New(fmt.Sprintf("VerifyTransaction failed when verifiy block")) |
| 73 | } |
| 74 | |
| 75 | if errCode := VerifyTransactionWithLedger(txVerify, ld); errCode != ontErrors.ErrNoError { |
| 76 | return errors.New(fmt.Sprintf("VerifyTransaction failed when verifiy block")) |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | return nil |
| 82 | } |
| 83 | |
| 84 | func VerifyHeader(header, prevHeader *types.Header) error { |
| 85 | if header.Height == 0 { |
nothing calls this directly
no test coverage detected