github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/orgchain/storages/block_ut.go (about)

     1  package storages
     2  
     3  import (
     4  	"math/big"
     5  
     6  	"encoding/binary"
     7  
     8  	"bytes"
     9  
    10  	"fmt"
    11  
    12  	"github.com/sixexorg/magnetic-ring/common/serialization"
    13  	"github.com/sixexorg/magnetic-ring/common/sink"
    14  	"github.com/sixexorg/magnetic-ring/store/db"
    15  	scom "github.com/sixexorg/magnetic-ring/store/orgchain/common"
    16  )
    17  
    18  type UTStore struct {
    19  	dbDir string           //Store file path
    20  	store *db.LevelDBStore //Store handler
    21  }
    22  
    23  func NewUTStore(dbDir string) (*UTStore, error) {
    24  	var err error
    25  	store, err := db.NewLevelDBStore(dbDir)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	utStore := &UTStore{
    30  		dbDir: dbDir,
    31  		store: store,
    32  	}
    33  	return utStore, nil
    34  }
    35  
    36  func (this *UTStore) GetUTByHeight(height uint64) *big.Int {
    37  	key := this.getKey(height)
    38  	iter := this.store.NewIterator(nil)
    39  	buff := bytes.NewBuffer(nil)
    40  	flag := true
    41  	if iter.Seek(key) {
    42  		if bytes.Compare(iter.Key(), key) == 0 {
    43  			buff.Write(iter.Value())
    44  			flag = false
    45  		}
    46  	}
    47  	if flag && iter.Prev() {
    48  		buff.Write(iter.Value())
    49  	}
    50  	iter.Release()
    51  	err := iter.Error()
    52  	if err != nil {
    53  		return big.NewInt(0)
    54  	}
    55  	cp, err := serialization.ReadComplex(buff)
    56  	if err != nil {
    57  		return big.NewInt(0)
    58  	}
    59  	bg, _ := cp.ComplexToBigInt()
    60  	return bg
    61  }
    62  func (this *UTStore) Save(height uint64, ut *big.Int) error {
    63  	fmt.Printf("⛔️league ut save height:%d ut:%v\n", height, ut)
    64  	key := this.getKey(height)
    65  	sk := sink.NewZeroCopySink(nil)
    66  	cp, _ := sink.BigIntToComplex(ut)
    67  	sk.WriteComplex(cp)
    68  	return this.store.Put(key, sk.Bytes())
    69  }
    70  
    71  func (this *UTStore) getKey(height uint64) []byte {
    72  	buff := make([]byte, 9)
    73  	buff[0] = byte(scom.ST_VOTE_STATE)
    74  	binary.LittleEndian.PutUint64(buff[1:], height)
    75  	return buff
    76  }