Skip to content

Commit

Permalink
fix: swap store address formatting and migration
Browse files Browse the repository at this point in the history
  • Loading branch information
ralph-pichler committed Jul 19, 2021
1 parent 18e5231 commit 984c844
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 5 deletions.
4 changes: 2 additions & 2 deletions pkg/settlement/swap/addressbook.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ func peerKey(peer swarm.Address) string {

// chequebookPeerKey computes the key where to store the peer for a chequebook.
func chequebookPeerKey(chequebook common.Address) string {
return fmt.Sprintf("%s%s", peerChequebookPrefix, string(chequebook[:]))
return fmt.Sprintf("%s%x", peerChequebookPrefix, chequebook)
}

// peerBeneficiaryKey computes the key where to store the beneficiary for a peer.
Expand All @@ -208,7 +208,7 @@ func peerBeneficiaryKey(peer swarm.Address) string {

// beneficiaryPeerKey computes the key where to store the peer for a beneficiary.
func beneficiaryPeerKey(peer common.Address) string {
return fmt.Sprintf("%s%s", beneficiaryPeerPrefix, string(peer[:]))
return fmt.Sprintf("%s%x", beneficiaryPeerPrefix, peer)
}

func peerDeductedByKey(peer swarm.Address) string {
Expand Down
5 changes: 2 additions & 3 deletions pkg/settlement/swap/swap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ package swap_test
import (
"context"
"errors"
"fmt"
"io/ioutil"
"math/big"
"testing"
Expand Down Expand Up @@ -761,7 +760,7 @@ func TestStateStoreKeys(t *testing.T) {
t.Fatalf("wrong peer key. wanted %s, got %s", expected, swap.PeerKey(swarmAddress))
}

expected = fmt.Sprintf("swap_peer_chequebook_%s", address[:])
expected = "swap_peer_chequebook_000000000000000000000000000000000000abcd"
if swap.ChequebookPeerKey(address) != expected {
t.Fatalf("wrong peer key. wanted %s, got %s", expected, swap.ChequebookPeerKey(address))
}
Expand All @@ -771,7 +770,7 @@ func TestStateStoreKeys(t *testing.T) {
t.Fatalf("wrong peer beneficiary key. wanted %s, got %s", expected, swap.PeerBeneficiaryKey(swarmAddress))
}

expected = fmt.Sprintf("swap_beneficiary_peer_%s", address[:])
expected = "swap_beneficiary_peer_000000000000000000000000000000000000abcd"
if swap.BeneficiaryPeerKey(address) != expected {
t.Fatalf("wrong beneficiary peer key. wanted %s, got %s", expected, swap.BeneficiaryPeerKey(address))
}
Expand Down
39 changes: 39 additions & 0 deletions pkg/statestore/leveldb/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (
"errors"
"fmt"
"strings"

"github.com/ethereum/go-ethereum/common"
)

var (
Expand All @@ -35,6 +37,7 @@ const (
dbSchemaCleanInterval = "clean-interval"
dbSchemaNoStamp = "no-stamp"
dbSchemaFlushBlock = "flushblock"
dbSchemaSwapAddr = "swapaddr"
)

var (
Expand All @@ -54,6 +57,7 @@ var schemaMigrations = []migration{
{name: dbSchemaCleanInterval, fn: migrateGrace},
{name: dbSchemaNoStamp, fn: migrateStamp},
{name: dbSchemaFlushBlock, fn: migrateFB},
{name: dbSchemaSwapAddr, fn: migrateSwap},
}

func migrateFB(s *store) error {
Expand Down Expand Up @@ -108,6 +112,41 @@ func migrateGrace(s *store) error {
return nil
}

func migrateSwap(s *store) error {
migratePrefix := func(prefix string) error {
keys, err := collectKeys(s, prefix)
if err != nil {
return err
}

for _, key := range keys {
split := strings.SplitAfter(key, prefix)
if len(split) != 2 {
return errors.New("no peer in key")
}

addr := common.BytesToAddress([]byte(split[1]))
fixed := fmt.Sprintf("%s%x", prefix, addr)

var chequebookAddress common.Address
if err = s.Get(key, &chequebookAddress); err != nil {
return err
}

if err = s.Put(fixed, chequebookAddress); err != nil {
return err
}
}
return nil
}

if err := migratePrefix("swap_peer_chequebook_"); err != nil {
return err
}

return migratePrefix("swap_beneficiary_peer_")
}

func (s *store) migrate(schemaName string) error {
migrations, err := getMigrations(schemaName, dbSchemaCurrent, schemaMigrations, s)
if err != nil {
Expand Down
46 changes: 46 additions & 0 deletions pkg/statestore/leveldb/migration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ package leveldb

import (
"errors"
"fmt"
"io/ioutil"
"testing"

"github.com/ethereum/go-ethereum/common"
"github.com/ethersphere/bee/pkg/logging"
)

Expand Down Expand Up @@ -282,3 +284,47 @@ func TestMigrationErrorTo(t *testing.T) {
t.Errorf("migration ran but shouldnt have")
}
}

func TestMigrationSwap(t *testing.T) {
dir := t.TempDir()
logger := logging.New(ioutil.Discard, 0)

// start the fresh statestore with the sanctuary schema name
db, err := NewStateStore(dir, logger)
if err != nil {
t.Fatal(err)
}
defer db.Close()

address := common.HexToAddress("0xabcd")
storedAddress := common.HexToAddress("0xffff")

if err = db.Put(fmt.Sprintf("swap_peer_chequebook_%s", address[:]), storedAddress); err != nil {
t.Fatal(err)
}

if err = db.Put(fmt.Sprintf("swap_beneficiary_peer_%s", address[:]), storedAddress); err != nil {
t.Fatal(err)
}

if err = migrateSwap(db.(*store)); err != nil {
t.Fatal(err)
}

var retrievedAddress common.Address
if err = db.Get("swap_peer_chequebook_000000000000000000000000000000000000abcd", &retrievedAddress); err != nil {
t.Fatal(err)
}

if retrievedAddress != storedAddress {
t.Fatalf("got wrong address. wanted %x, got %x", storedAddress, retrievedAddress)
}

if err = db.Get("swap_beneficiary_peer_000000000000000000000000000000000000abcd", &retrievedAddress); err != nil {
t.Fatal(err)
}

if retrievedAddress != storedAddress {
t.Fatalf("got wrong address. wanted %x, got %x", storedAddress, retrievedAddress)
}
}

0 comments on commit 984c844

Please sign in to comment.