Skip to content

Commit 7f4241e

Browse files
committed
Merge branch 'feature/atree-inlining-cadence-v0.42' into fxamacker/port-6063-to-atree-inlining-cadence-0.42
2 parents 659f5d4 + 0e24d01 commit 7f4241e

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

cmd/util/ledger/migrations/atree_register_migration.go

+7
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ func (m *AtreeRegisterMigrator) MigrateAccount(
9191
address common.Address,
9292
oldPayloads []*ledger.Payload,
9393
) ([]*ledger.Payload, error) {
94+
95+
err := CheckDomainPayloads(oldPayloads)
96+
if err != nil {
97+
// Log domain payload error for now
98+
m.log.Warn().Msgf("unexpected domain payloads: %s", err.Error())
99+
}
100+
94101
// create all the runtime components we need for the migration
95102
mr, err := NewAtreeRegisterMigratorRuntime(address, oldPayloads)
96103
if err != nil {

cmd/util/ledger/migrations/utils.go

+49
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package migrations
22

33
import (
4+
"errors"
45
"fmt"
56

67
"github.com/onflow/atree"
@@ -10,8 +11,56 @@ import (
1011

1112
"github.com/onflow/flow-go/ledger"
1213
"github.com/onflow/flow-go/ledger/common/convert"
14+
"github.com/onflow/flow-go/model/flow"
1315
)
1416

17+
func getDomainPayloads(payloads []*ledger.Payload) (map[flow.RegisterID]*ledger.Payload, error) {
18+
domains := make(map[flow.RegisterID]*ledger.Payload)
19+
20+
for _, payload := range payloads {
21+
registerID, _, err := convert.PayloadToRegister(payload)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to convert payload to register: %w", err)
24+
}
25+
26+
if registerID.IsInternalState() || registerID.IsSlabIndex() {
27+
continue
28+
}
29+
30+
domains[registerID] = payload
31+
}
32+
33+
return domains, nil
34+
}
35+
36+
func CheckDomainPayloads(payloads []*ledger.Payload) error {
37+
domainPayloads, err := getDomainPayloads(payloads)
38+
if err != nil {
39+
return err
40+
}
41+
42+
if len(domainPayloads) == 0 {
43+
return nil
44+
}
45+
46+
var errs []error
47+
48+
slabIndexLength := len(atree.SlabIndex{})
49+
50+
for id, p := range domainPayloads {
51+
if _, exist := allStorageMapDomainsSet[id.Key]; !exist {
52+
errs = append(errs, fmt.Errorf("found unexpected domain: %s", id.Key))
53+
continue
54+
}
55+
v := p.Value()
56+
if len(v) != slabIndexLength {
57+
errs = append(errs, fmt.Errorf("domain payload contains unexpected value: %s %x", id.Key, v))
58+
}
59+
}
60+
61+
return errors.Join(errs...)
62+
}
63+
1564
func getSlabIDsFromPayloads(payloads []*ledger.Payload) ([]atree.SlabID, error) {
1665
slabIDs := make([]atree.SlabID, 0, len(payloads))
1766

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package migrations
2+
3+
import (
4+
"crypto/rand"
5+
"encoding/binary"
6+
"strings"
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/onflow/flow-go/ledger"
12+
)
13+
14+
func TestCheckDomainPayloads(t *testing.T) {
15+
t.Run("no storage domain payload", func(t *testing.T) {
16+
var payloads []*ledger.Payload
17+
18+
// Add internal payload
19+
payloads = append(payloads, getPayload("a.s", 16))
20+
21+
// Add atree paylaod
22+
var index [9]byte
23+
binary.BigEndian.PutUint64(index[:], 0)
24+
index[0] = '$'
25+
26+
payloads = append(payloads, getPayload(string(index[:]), 16))
27+
28+
err := CheckDomainPayloads(payloads)
29+
require.NoError(t, err)
30+
})
31+
32+
t.Run("some storage domain payloads", func(t *testing.T) {
33+
var payloads []*ledger.Payload
34+
35+
// Add internal payload
36+
payloads = append(payloads, getPayload("a.s", 16))
37+
38+
// Add atree paylaod
39+
var index [9]byte
40+
binary.BigEndian.PutUint64(index[:], 0)
41+
index[0] = '$'
42+
43+
payloads = append(payloads, getPayload(string(index[:]), 16))
44+
45+
// Add domain payload
46+
payloads = append(payloads, getPayload(allStorageMapDomains[0], 8))
47+
48+
err := CheckDomainPayloads(payloads)
49+
require.NoError(t, err)
50+
})
51+
52+
t.Run("unexpected storage domain payloads", func(t *testing.T) {
53+
var payloads []*ledger.Payload
54+
55+
// Add internal payload
56+
payloads = append(payloads, getPayload("a.s", 16))
57+
58+
// Add atree paylaod
59+
var index [9]byte
60+
binary.BigEndian.PutUint64(index[:], 0)
61+
index[0] = '$'
62+
63+
payloads = append(payloads, getPayload(string(index[:]), 16))
64+
65+
// Add domain payload
66+
payloads = append(payloads, getPayload(allStorageMapDomains[0], 8))
67+
68+
// Add unexpected domain payload
69+
payloads = append(payloads, getPayload("a", 8))
70+
71+
// Add domain payload with unexpected value
72+
payloads = append(payloads, getPayload(allStorageMapDomains[1], 16))
73+
74+
err := CheckDomainPayloads(payloads)
75+
errStrings := strings.Split(err.Error(), "\n")
76+
require.Equal(t, 2, len(errStrings))
77+
require.Equal(t, "found unexpected domain: a", errStrings[0])
78+
require.True(t, strings.HasPrefix(errStrings[1], "domain payload contains unexpected value"))
79+
})
80+
}
81+
82+
func getPayload(key string, valueLength int) *ledger.Payload {
83+
address := make([]byte, 8)
84+
_, err := rand.Read(address)
85+
if err != nil {
86+
panic(err)
87+
}
88+
ledgerKey := ledger.Key{KeyParts: []ledger.KeyPart{
89+
{Type: uint16(0), Value: address},
90+
{Type: uint16(2), Value: []byte(key)},
91+
}}
92+
93+
value := make([]byte, valueLength)
94+
_, err = rand.Read(value)
95+
if err != nil {
96+
panic(err)
97+
}
98+
99+
return ledger.NewPayload(ledgerKey, value)
100+
}

0 commit comments

Comments
 (0)