6 "github.com/golang/protobuf/proto"
7 dbm "github.com/tendermint/tmlibs/db"
9 "github.com/bytom/blockchain/txdb/internal/storage"
10 "github.com/bytom/errors"
11 "github.com/bytom/protocol/bc"
14 func calcMainchainKey(hash *bc.Hash) []byte {
15 return []byte(fmt.Sprintf("MC:%v", hash.String()))
18 // DecodeMainchain decodes a Mainchain from bytes
19 func DecodeMainchain(data []byte) (map[uint64]*bc.Hash, error) {
20 var mainchainList storage.Mainchain
21 if err := proto.Unmarshal(data, &mainchainList); err != nil {
22 return nil, errors.Wrap(err, "unmarshaling Mainchain proto")
25 mainchain := make(map[uint64]*bc.Hash)
26 for i, rawHash := range mainchainList.Hashs {
28 if err := h.UnmarshalJSON(rawHash.Key); err != nil {
29 return nil, errors.Wrap(err, "unmarshaling Mainchain hash")
31 mainchain[uint64(i+1)] = h
37 func saveMainchain(db dbm.DB, mainchain map[uint64]*bc.Hash, hash *bc.Hash) error {
38 var mainchainList storage.Mainchain
39 for i := 1; i <= len(mainchain); i++ {
40 rawHash := &storage.Mainchain_Hash{Key: mainchain[uint64(i)].Bytes()}
41 mainchainList.Hashs = append(mainchainList.Hashs, rawHash)
44 b, err := proto.Marshal(&mainchainList)
46 return errors.Wrap(err, "marshaling Mainchain")
49 db.Set(calcMainchainKey(hash), b)
54 func getMainchain(db dbm.DB, hash *bc.Hash) (map[uint64]*bc.Hash, error) {
55 data := db.Get(calcMainchainKey(hash))
57 return nil, errors.New("no this Mainchain.")
60 mainchain, err := DecodeMainchain(data)
62 return nil, errors.Wrap(err, "decoding Mainchain")