// Validate a dir block func validateDBlock(c *common.DChain, b *common.DirectoryBlock) (merkleRoot *common.Hash, dbHash *common.Hash, err error) { bodyMR, err := b.BuildBodyMR() if err != nil { return nil, nil, err } if !b.Header.BodyMR.IsSameAs(bodyMR) { return nil, nil, errors.New("Invalid body MR for dir block: " + string(b.Header.DBHeight)) } for _, dbEntry := range b.DBEntries { switch dbEntry.ChainID.String() { case ecchain.ChainID.String(): err := validateCBlockByMR(dbEntry.KeyMR) if err != nil { return nil, nil, err } case achain.ChainID.String(): err := validateABlockByMR(dbEntry.KeyMR) if err != nil { return nil, nil, err } case wire.FChainID.String(): err := validateFBlockByMR(dbEntry.KeyMR) if err != nil { return nil, nil, err } default: err := validateEBlockByMR(dbEntry.ChainID, dbEntry.KeyMR) if err != nil { return nil, nil, err } } } b.DBHash, _ = common.CreateHash(b) b.BuildKeyMerkleRoot() return b.KeyMR, b.DBHash, nil }