func exportFctBlock(block block.IFBlock) { if block == nil || procLog.Level() < factomlog.Info { return } data, err := block.MarshalBinary() if err != nil { panic(err) } strChainID := block.GetChainID().String() if fileNotExists(dataStorePath + strChainID) { err := os.MkdirAll(dataStorePath+strChainID, 0777) if err == nil { procLog.Info("Created directory " + dataStorePath + strChainID) } else { procLog.Error(err) } } err = ioutil.WriteFile(fmt.Sprintf(dataStorePath+strChainID+"/store.%09d.block", block.GetDBHeight()), data, 0777) if err != nil { panic(err) } }
// When we are playing catchup, adding the transaction block is a pretty // useful feature. func (fs *FactoidState) AddTransactionBlock(blk block.IFBlock) error { if err := blk.Validate(); err != nil { return err } transactions := blk.GetTransactions() for _, trans := range transactions { err := fs.UpdateTransaction(trans) if err != nil { return err } } fs.currentBlock = blk fs.SetFactoshisPerEC(blk.GetExchRate()) cp.CP.AddUpdate( "FAddBlk", // tag "status", // Category fmt.Sprintf("Added Factoid Block %d", blk.GetDBHeight()), // Title "", // message 60) // sixty seconds should be enough return nil }
// ProcessFBlockBatch inserts the factoid block func (db *LevelDb) ProcessFBlockBatch(block block.IFBlock) error { if block != nil { if db.lbatch == nil { db.lbatch = new(leveldb.Batch) } defer db.lbatch.Reset() binaryBlock, err := block.MarshalBinary() if err != nil { return err } scHash := block.GetHash() // Insert the binary factom block var key []byte = []byte{byte(TBL_SC)} key = append(key, scHash.Bytes()...) db.lbatch.Put(key, binaryBlock) // Insert the sc block number cross reference key = []byte{byte(TBL_SC_NUM)} key = append(key, block.GetChainID().Bytes()...) bytes := make([]byte, 4) binary.BigEndian.PutUint32(bytes, block.GetDBHeight()) key = append(key, bytes...) db.lbatch.Put(key, scHash.Bytes()) // Update the chain head reference key = []byte{byte(TBL_CHAIN_HEAD)} key = append(key, common.FACTOID_CHAINID...) db.lbatch.Put(key, scHash.Bytes()) err = db.lDb.Write(db.lbatch, db.wo) if err != nil { log.Println("batch failed %v\n", err) return err } } return nil }
// Add DBEntry from an SC Block func (c *DChain) AddFBlockToDBEntry(b block.IFBlock) (err error) { dbEntry := &DBEntry{} dbEntry.ChainID = new(Hash) dbEntry.ChainID.SetBytes(b.GetChainID().Bytes()) dbEntry.KeyMR = new(Hash) dbEntry.KeyMR.SetBytes(b.GetHash().Bytes()) if len(c.NextBlock.DBEntries) < 3 { panic("3 DBEntries not initialized properly for block: " + string(c.NextDBHeight)) } c.BlockMutex.Lock() // Ablock is always at the first entry // First three entries are ABlock, CBlock, FBlock c.NextBlock.DBEntries[2] = dbEntry c.BlockMutex.Unlock() return nil }
func (db *LevelDb) ProcessFBlockMultiBatch(block block.IFBlock) error { if block == nil { return nil } if db.lbatch == nil { return fmt.Errorf("db.lbatch == nil") } binaryBlock, err := block.MarshalBinary() if err != nil { return err } scHash := block.GetHash() // Insert the binary factom block var key = []byte{byte(TBL_SC)} key = append(key, scHash.Bytes()...) db.lbatch.Put(key, binaryBlock) // Insert the sc block number cross reference key = []byte{byte(TBL_SC_NUM)} key = append(key, common.FACTOID_CHAINID...) bytes := make([]byte, 4) binary.BigEndian.PutUint32(bytes, block.GetDBHeight()) key = append(key, bytes...) db.lbatch.Put(key, scHash.Bytes()) // Update the chain head reference key = []byte{byte(TBL_CHAIN_HEAD)} key = append(key, common.FACTOID_CHAINID...) db.lbatch.Put(key, scHash.Bytes()) return nil }