Skip to content

Commit

Permalink
fix old mint data store
Browse files Browse the repository at this point in the history
  • Loading branch information
vanessaviolet committed Jul 7, 2023
1 parent 7b6ad77 commit 967269d
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 2 deletions.
5 changes: 5 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,11 @@ func kernelCmd(c *cli.Context) error {
}
defer store.Close()

err = store.OneTimeFixMintPrefix()
if err != nil {
return err
}

addr := fmt.Sprintf(":%d", c.Int("port"))
node, err := kernel.SetupNode(custom, store, cache, addr, c.String("dir"))
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion storage/badger_graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const (
graphPrefixGhost = "GHOST" // each output key should only be used once
graphPrefixUTXO = "UTXO" // unspent outputs, including first consumed transaction hash
graphPrefixDeposit = "DEPOSIT"
graphPrefixMint = "MINT"
graphPrefixMint = "MINTUNIVERSAL"
graphPrefixTransaction = "TRANSACTION" // raw transaction, may not be finalized yet, if finalized with first finalized snapshot hash
graphPrefixFinalization = "FINALIZATION" // transaction finalization hack
graphPrefixUnique = "UNIQUE" // unique transaction in one node
Expand Down
2 changes: 1 addition & 1 deletion storage/badger_mint.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (s *BadgerStore) ReadMintDistributions(offset, count uint64) ([]*common.Min
defer it.Close()

it.Seek(graphMintKey(offset))
for ; it.Valid() && uint64(len(mints)) < count; it.Next() {
for ; it.ValidForPrefix(opts.Prefix) && uint64(len(mints)) < count; it.Next() {
item := it.Item()
key := item.KeyCopy(nil)
ival, err := item.ValueCopy(nil)
Expand Down
62 changes: 62 additions & 0 deletions storage/badger_mint_fix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package storage

import (
"encoding/binary"

"github.com/MixinNetwork/mixin/common"
"github.com/dgraph-io/badger/v4"
)

func (s *BadgerStore) OneTimeFixMintPrefix() error {
txn := s.snapshotsDB.NewTransaction(true)
defer txn.Discard()

mints, err := s.readOldMintDistributions(txn)
if err != nil || len(mints) == 0 {
return err
}

for _, m := range mints {
err = writeMintDistribution(txn, &m.MintData, m.Transaction)
if err != nil {
return err
}
key := binary.BigEndian.AppendUint64([]byte("MINTKERNELNODE"), m.Batch)
err = txn.Delete(key)
if err != nil {
return err
}
}

return txn.Commit()
}

func (s *BadgerStore) readOldMintDistributions(txn *badger.Txn) ([]*common.MintDistribution, error) {
mints := make([]*common.MintDistribution, 0)

opts := badger.DefaultIteratorOptions
opts.Prefix = []byte("MINTKERNELNODE")
it := txn.NewIterator(opts)
defer it.Close()

it.Seek(opts.Prefix)
for ; it.ValidForPrefix(opts.Prefix); it.Next() {
item := it.Item()
key := item.KeyCopy(nil)
ival, err := item.ValueCopy(nil)
if err != nil {
return nil, err
}
data, err := common.DecompressUnmarshalMintDistribution(ival)
if err != nil {
return nil, err
}
if data.Batch != binary.BigEndian.Uint64(key[len(opts.Prefix):]) {
panic("malformed mint data")
}

mints = append(mints, data)
}

return mints, nil
}

0 comments on commit 967269d

Please sign in to comment.