OSDN Git Service

fix bug for end to end test
[bytom/bytom.git] / blockchain / txdb / mainchain.go
1 package txdb
2
3 import (
4         "fmt"
5
6         "github.com/golang/protobuf/proto"
7         dbm "github.com/tendermint/tmlibs/db"
8
9         "github.com/bytom/blockchain/txdb/internal/storage"
10         "github.com/bytom/errors"
11         "github.com/bytom/protocol/bc"
12 )
13
14 func calcMainchainKey(hash *bc.Hash) []byte {
15         return []byte(fmt.Sprintf("MC:%v", hash.String()))
16 }
17
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")
23         }
24
25         mainchain := make(map[uint64]*bc.Hash)
26         for i, rawHash := range mainchainList.Hashs {
27                 h := &bc.Hash{}
28                 if err := h.UnmarshalJSON(rawHash.Key); err != nil {
29                         return nil, errors.Wrap(err, "unmarshaling Mainchain hash")
30                 }
31                 mainchain[uint64(i+1)] = h
32         }
33
34         return mainchain, nil
35 }
36
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)
42         }
43
44         b, err := proto.Marshal(&mainchainList)
45         if err != nil {
46                 return errors.Wrap(err, "marshaling Mainchain")
47         }
48
49         db.Set(calcMainchainKey(hash), b)
50         db.SetSync(nil, nil)
51         return nil
52 }
53
54 func getMainchain(db dbm.DB, hash *bc.Hash) (map[uint64]*bc.Hash, error) {
55         data := db.Get(calcMainchainKey(hash))
56         if data == nil {
57                 return nil, errors.New("no this Mainchain.")
58         }
59
60         mainchain, err := DecodeMainchain(data)
61         if err != nil {
62                 return nil, errors.Wrap(err, "decoding Mainchain")
63         }
64         return mainchain, nil
65 }