1 // Package account stores and tracks accounts within a Bytom Core.
7 log "github.com/sirupsen/logrus"
10 // ImageSlice record info of single account
11 type ImageSlice struct {
12 Account *Account `json:"account"`
13 ContractIndex uint64 `json:"contract_index"`
16 // Image is the struct for hold export account data
18 Slice []*ImageSlice `json:"slices"`
21 // Backup export all the account info into image
22 func (m *Manager) Backup() (*Image, error) {
24 defer m.accountMu.Unlock()
27 Slice: []*ImageSlice{},
30 accountIter := m.db.IteratorPrefix(accountPrefix)
31 defer accountIter.Release()
32 for accountIter.Next() {
34 if err := json.Unmarshal(accountIter.Value(), a); err != nil {
38 image.Slice = append(image.Slice, &ImageSlice{
40 ContractIndex: m.GetContractIndex(a.ID),
46 // Restore import the accountImages into account manage
47 func (m *Manager) Restore(image *Image) error {
49 defer m.accountMu.Unlock()
51 storeBatch := m.db.NewBatch()
52 for _, slice := range image.Slice {
53 if existed := m.db.Get(Key(slice.Account.ID)); existed != nil {
54 log.WithFields(log.Fields{
55 "alias": slice.Account.Alias,
56 "id": slice.Account.ID,
57 }).Warning("skip restore account due to already existed")
60 if existed := m.db.Get(aliasKey(slice.Account.Alias)); existed != nil {
61 return ErrDuplicateAlias
64 rawAccount, err := json.Marshal(slice.Account)
66 return ErrMarshalAccount
69 storeBatch.Set(Key(slice.Account.ID), rawAccount)
70 storeBatch.Set(aliasKey(slice.Account.Alias), []byte(slice.Account.ID))
75 for _, slice := range image.Slice {
76 for i := uint64(1); i <= slice.ContractIndex; i++ {
77 if _, err := m.createAddress(slice.Account, false); err != nil {