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 }