// Initialize Directory Block Chain from database func initDChain() { dchain = new(common.DChain) //Initialize the Directory Block Chain ID dchain.ChainID = new(common.Hash) barray := common.D_CHAINID dchain.ChainID.SetBytes(barray) // get all dBlocks from db dBlocks, _ := db.FetchAllDBlocks() sort.Sort(util.ByDBlockIDAccending(dBlocks)) dchain.Blocks = make([]*common.DirectoryBlock, len(dBlocks), len(dBlocks)+1) for i := 0; i < len(dBlocks); i = i + 1 { if dBlocks[i].Header.DBHeight != uint32(i) { panic("Error in initializing dChain:" + dchain.ChainID.String()) } dBlocks[i].Chain = dchain dBlocks[i].IsSealed = true dBlocks[i].IsSavedInDB = true dchain.Blocks[i] = &dBlocks[i] } // double check the block ids for i := 0; i < len(dchain.Blocks); i = i + 1 { if uint32(i) != dchain.Blocks[i].Header.DBHeight { panic(errors.New("BlockID does not equal index for chain:" + dchain.ChainID.String() + " block:" + fmt.Sprintf("%v", dchain.Blocks[i].Header.DBHeight))) } } //Create an empty block and append to the chain if len(dchain.Blocks) == 0 { dchain.NextDBHeight = 0 dchain.NextBlock, _ = common.CreateDBlock(dchain, nil, 10) } else { dchain.NextDBHeight = uint32(len(dchain.Blocks)) dchain.NextBlock, _ = common.CreateDBlock(dchain, dchain.Blocks[len(dchain.Blocks)-1], 10) // Update dir block height cache in db db.UpdateBlockHeightCache(dchain.NextDBHeight-1, dchain.NextBlock.Header.PrevLedgerKeyMR) } exportDChain(dchain) //Double check the sealed flag if dchain.NextBlock.IsSealed == true { panic("dchain.Blocks[dchain.NextBlockID].IsSealed for chain:" + dchain.ChainID.String()) } }
// Seals the current open block, store it in db and create the next open block func newDirectoryBlock(chain *common.DChain) *common.DirectoryBlock { procLog.Debug("**** new Dir Block") // acquire the last block block := chain.NextBlock if devNet { block.Header.NetworkID = common.NETWORK_ID_TEST } else { block.Header.NetworkID = common.NETWORK_ID_EB } // Create the block add a new block for new coming entries chain.BlockMutex.Lock() block.Header.BlockCount = uint32(len(block.DBEntries)) // Calculate Merkle Root for FBlock and store it in header if block.Header.BodyMR == nil { block.Header.BodyMR, _ = block.BuildBodyMR() // Factoid1 block not in the right place... } block.IsSealed = true chain.AddDBlockToDChain(block) chain.NextDBHeight++ chain.NextBlock, _ = common.CreateDBlock(chain, block, 10) chain.BlockMutex.Unlock() block.DBHash, _ = common.CreateHash(block) block.BuildKeyMerkleRoot() //Store the block in db db.ProcessDBlockBatch(block) // Initialize the dirBlockInfo obj in db db.InsertDirBlockInfo(common.NewDirBlockInfoFromDBlock(block)) anchor.UpdateDirBlockInfoMap(common.NewDirBlockInfoFromDBlock(block)) procLog.Info("DirectoryBlock: block" + strconv.FormatUint(uint64(block.Header.DBHeight), 10) + " created for directory block chain: " + chain.ChainID.String()) // To be improved in milestone 2 SignDirectoryBlock() return block }