Exemple #1
0
func (db *LevelDb) ProcessEBlockMultiBatch(eblock *common.EBlock) error {
	if eblock == nil {
		return nil
	}

	if db.lbatch == nil {
		return fmt.Errorf("db.lbatch == nil")
	}

	if len(eblock.Body.EBEntries) < 1 {
		return errors.New("Empty eblock!")
	}

	binaryEblock, err := eblock.MarshalBinary()
	if err != nil {
		return err
	}

	// Insert the binary entry block
	var key []byte = []byte{byte(TBL_EB)}
	hash, err := eblock.Hash()
	if err != nil {
		return err
	}
	key = append(key, hash.Bytes()...)
	db.lbatch.Put(key, binaryEblock)

	// Insert the entry block merkle root cross reference
	key = []byte{byte(TBL_EB_MR)}
	keyMR, err := eblock.KeyMR()
	if err != nil {
		return err
	}
	key = append(key, keyMR.Bytes()...)
	eBlockHash, err := eblock.Hash()
	if err != nil {
		return err
	}
	binaryEBHash, err := eBlockHash.MarshalBinary()
	if err != nil {
		return err
	}
	db.lbatch.Put(key, binaryEBHash)

	// Insert the entry block number cross reference
	key = []byte{byte(TBL_EB_CHAIN_NUM)}
	key = append(key, eblock.Header.ChainID.Bytes()...)
	bytes := make([]byte, 4)
	binary.BigEndian.PutUint32(bytes, eblock.Header.EBSequence)
	key = append(key, bytes...)
	db.lbatch.Put(key, binaryEBHash)

	// Update the chain head reference
	key = []byte{byte(TBL_CHAIN_HEAD)}
	key = append(key, eblock.Header.ChainID.Bytes()...)
	keyMR, err = eblock.KeyMR()
	if err != nil {
		return err
	}
	db.lbatch.Put(key, keyMR.Bytes())

	return nil
}