From b37c34fb3a33896241f2954506bc1a5765a1bf77 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Tue, 22 Aug 2023 19:03:22 -0400 Subject: [PATCH 01/10] chore: instead of 0 return and empty optional `0x01, 0x00` --- lib/runtime/wazero/imports.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index c4e344544e..efe4a609e0 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -1210,7 +1210,14 @@ func ext_default_child_storage_get_version_1(ctx context.Context, m api.Module, child, err := storage.GetChildStorage(keyToChild, keyBytes) if err != nil { logger.Errorf("failed to get child from child storage: %s", err) - return 0 + + var emptyOptionalBytes []byte = []byte{0x01, 0x00} + ret, err := write(m, rtCtx.Allocator, emptyOptionalBytes) + if err != nil { + panic(err) + } + + return ret } ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&child)) From 55f89eab4862d3813867348ca48772fe48dc9c82 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 23 Aug 2023 10:01:35 -0400 Subject: [PATCH 02/10] feat: standartize the none encoded returns in the host functions --- lib/runtime/wazero/imports.go | 125 +++++++++++++++++----------------- 1 file changed, 61 insertions(+), 64 deletions(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index efe4a609e0..f61fba57e4 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -31,6 +31,8 @@ var ( log.AddContext("pkg", "runtime"), log.AddContext("module", "wazero"), ) + + noneEncoded []byte = []byte{0x00} ) const ( @@ -229,13 +231,17 @@ func ext_crypto_ed25519_sign_version_1(ctx context.Context, m api.Module, keyTyp pubKey, err := ed25519.NewPublicKey(pubKeyData) if err != nil { logger.Errorf("failed to get public keys: %s", err) - return 0 + ret, err := write(m, rtCtx.Allocator, noneEncoded) + if err != nil { + panic(err) + } + return ret } ks, err := rtCtx.Keystore.GetKeystore(id) if err != nil { logger.Warnf("error for id 0x%x: %s", id, err) - ret, err := write(m, rtCtx.Allocator, []byte{0}) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -245,7 +251,7 @@ func ext_crypto_ed25519_sign_version_1(ctx context.Context, m api.Module, keyTyp signingKey := ks.GetKeypair(pubKey) if signingKey == nil { logger.Error("could not find public key " + pubKey.Hex() + " in keystore") - ret, err := write(m, rtCtx.Allocator, []byte{0}) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -255,25 +261,18 @@ func ext_crypto_ed25519_sign_version_1(ctx context.Context, m api.Module, keyTyp sig, err := signingKey.Sign(read(m, msg)) if err != nil { logger.Error("could not sign message") - } - - var fixedSize [64]byte - copy(fixedSize[:], sig) - - encoded, err := scale.Marshal(&fixedSize) - if err != nil { - logger.Error(fmt.Sprintf("scale encoding: %s", err)) - ret, err := write(m, rtCtx.Allocator, []byte{0}) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } return ret } - ret, err := write(m, rtCtx.Allocator, encoded) + var fixedSize [64]byte + copy(fixedSize[:], sig) + ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&fixedSize)) if err != nil { - logger.Errorf("failed to allocate memory: %s", err) - return 0 + panic(err) } return ret @@ -629,12 +628,10 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp panic("read overflow") } - var optionSig *[64]byte - ks, err := rtCtx.Keystore.GetKeystore(id) if err != nil { logger.Warnf("error for id 0x%x: %s", id, err) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -649,7 +646,7 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp pubKey, err := sr25519.NewPublicKey(kb) if err != nil { logger.Errorf("failed to get public key: %s", err) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -659,7 +656,7 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp signingKey := ks.GetKeypair(pubKey) if signingKey == nil { logger.Error("could not find public key " + pubKey.Hex() + " in keystore") - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -670,7 +667,7 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp sig, err := signingKey.Sign(msgData) if err != nil { logger.Errorf("could not sign message: %s", err) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -679,16 +676,10 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp var fixedSig [64]byte copy(fixedSig[:], sig) - optionSig = &fixedSig - keysPtr, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) + keysPtr, err := write(m, rtCtx.Allocator, scale.MustMarshal(&fixedSig)) if err != nil { - logger.Errorf("failed to allocate memory: %s", err) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(optionSig)) - if err != nil { - panic(err) - } - return ret + panic(err) } return keysPtr } @@ -990,11 +981,10 @@ func ext_misc_runtime_version_version_1(ctx context.Context, m api.Module, dataS } code := read(m, dataSpan) - var option *[]byte version, err := GetRuntimeVersion(code) if err != nil { logger.Errorf("failed to get runtime version: %s", err) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + ret, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { panic(err) } @@ -1011,12 +1001,14 @@ func ext_misc_runtime_version_version_1(ctx context.Context, m api.Module, dataS encodedData, err := scale.Marshal(version) if err != nil { logger.Errorf("failed to encode result: %s", err) - return 0 + ret, err := write(m, rtCtx.Allocator, noneEncoded) + if err != nil { + panic(err) + } + return ret } - option = &encodedData - - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&encodedData)) if err != nil { panic(err) } @@ -1035,7 +1027,11 @@ func ext_default_child_storage_read_version_1( value, err := rtCtx.Storage.GetChildStorage(keyToChild, keyBytes) if err != nil { logger.Errorf("failed to get child storage: %s", err) - return 0 + ret, err := write(m, rtCtx.Allocator, noneEncoded) + if err != nil { + panic(err) + } + return ret } valueBuf, _ := splitPointerSize(valueOut) @@ -1208,22 +1204,20 @@ func ext_default_child_storage_get_version_1(ctx context.Context, m api.Module, keyToChild := read(m, childStorageKey) keyBytes := read(m, key) child, err := storage.GetChildStorage(keyToChild, keyBytes) - if err != nil { - logger.Errorf("failed to get child from child storage: %s", err) - - var emptyOptionalBytes []byte = []byte{0x01, 0x00} - ret, err := write(m, rtCtx.Allocator, emptyOptionalBytes) - if err != nil { - panic(err) - } + var encodedChildOptional []byte - return ret + if err != nil || len(child) == 0 { + logger.Warnf("child storage not found: %s", err) + encodedChildOptional = noneEncoded + } else { + encodedChildOptional = scale.MustMarshal(&child) } - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&child)) + ret, err := write(m, rtCtx.Allocator, encodedChildOptional) if err != nil { panic(err) } + return ret } @@ -1714,11 +1708,15 @@ func ext_offchain_local_storage_get_version_1(ctx context.Context, m api.Module, res, err = rtCtx.NodeStorage.LocalStorage.Get(storageKey) } - if err != nil { + var encodedOption []byte + if err != nil || len(res) == 0 { logger.Errorf("failed to get value from storage: %s", err) + encodedOption = noneEncoded + } else { + encodedOption = res } - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&res)) + ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&encodedOption)) if err != nil { panic(err) } @@ -2153,12 +2151,14 @@ func ext_storage_get_version_1(ctx context.Context, m api.Module, keySpan uint64 value := storage.Get(key) logger.Debugf("value: 0x%x", value) - var option *[]byte - if value != nil { - option = &value + var encodedOption []byte + if len(value) == 0 { + encodedOption = noneEncoded + } else { + encodedOption = scale.MustMarshal(&value) } - valueSpan, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + valueSpan, err := write(m, rtCtx.Allocator, encodedOption) if err != nil { logger.Errorf("failed to allocate: %s", err) panic(err) @@ -2180,12 +2180,14 @@ func ext_storage_next_key_version_1(ctx context.Context, m api.Module, keySpan u "key: 0x%x; next key 0x%x", key, next) - var option *[]byte - if len(next) > 0 { - option = &next + var encodedOption []byte + if len(next) == 0 { + encodedOption = noneEncoded + } else { + encodedOption = scale.MustMarshal(&next) } - nextSpan, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + nextSpan, err := write(m, rtCtx.Allocator, encodedOption) if err != nil { logger.Errorf("failed to allocate: %s", err) panic(err) @@ -2200,17 +2202,14 @@ func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valu } storage := rtCtx.Storage - // memory := instanceContext.Memory().Data() - var option *uint32 = nil - key := read(m, keySpan) value := storage.Get(key) logger.Debugf( "key 0x%x has value 0x%x", key, value) - if value == nil { - res, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + if len(value) == 0 { + res, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { logger.Errorf("failed to allocate: %s", err) panic(err) @@ -2240,9 +2239,7 @@ func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valu } size := uint32(len(data)) - option = &size - - sizeSpan, err := write(m, rtCtx.Allocator, scale.MustMarshal(option)) + sizeSpan, err := write(m, rtCtx.Allocator, scale.MustMarshal(&size)) if err != nil { logger.Errorf("failed to allocate: %s", err) panic(err) From 98e3815e9984b2c6196b9c5f2bdd18dc6d3666da Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Wed, 23 Aug 2023 17:57:37 -0400 Subject: [PATCH 03/10] chore: deploy right none encoded value --- chain/westend/defaults.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chain/westend/defaults.go b/chain/westend/defaults.go index f6dcb2bfe5..cf4d17e0ba 100644 --- a/chain/westend/defaults.go +++ b/chain/westend/defaults.go @@ -30,5 +30,9 @@ func DefaultConfig() *cfg.Config { config.Core.Role = 1 config.Network.NoMDNS = false + config.Log.Sync = "trace" + config.Pprof.Enabled = true + config.Pprof.ListeningAddress = "0.0.0.0:6060" + return config } From a2d5a40e26a17a635d0d1bf14fb59d0d056bf544 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Fri, 25 Aug 2023 10:40:51 -0400 Subject: [PATCH 04/10] chore: check for `nil` since `Some(())` is len 0 --- lib/runtime/wazero/imports.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index f61fba57e4..ace13762ac 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -2152,10 +2152,10 @@ func ext_storage_get_version_1(ctx context.Context, m api.Module, keySpan uint64 logger.Debugf("value: 0x%x", value) var encodedOption []byte - if len(value) == 0 { - encodedOption = noneEncoded - } else { + if value != nil { encodedOption = scale.MustMarshal(&value) + } else { + encodedOption = noneEncoded } valueSpan, err := write(m, rtCtx.Allocator, encodedOption) @@ -2208,7 +2208,7 @@ func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valu "key 0x%x has value 0x%x", key, value) - if len(value) == 0 { + if value == nil { res, err := write(m, rtCtx.Allocator, noneEncoded) if err != nil { logger.Errorf("failed to allocate: %s", err) From ec2bacc14f48ee6f9e3feda47de59c6f9d6b68a7 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 07:21:22 -0400 Subject: [PATCH 05/10] chore: check if child is not nil --- lib/runtime/wazero/imports.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index ace13762ac..1c31be50cd 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -1188,6 +1188,7 @@ func ext_default_child_storage_exists_version_1(ctx context.Context, m api.Modul logger.Errorf("failed to get child from child storage: %s", err) return 0 } + if child != nil { return 1 } @@ -1206,7 +1207,7 @@ func ext_default_child_storage_get_version_1(ctx context.Context, m api.Module, child, err := storage.GetChildStorage(keyToChild, keyBytes) var encodedChildOptional []byte - if err != nil || len(child) == 0 { + if err != nil || child == nil { logger.Warnf("child storage not found: %s", err) encodedChildOptional = noneEncoded } else { From df577dfab6c7928b5746074d3d72ece991a4fd56 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 11:14:31 -0400 Subject: [PATCH 06/10] chore: test flaky test --- dot/network/transaction_integration_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dot/network/transaction_integration_test.go b/dot/network/transaction_integration_test.go index 0405bd73c7..3f0eec6465 100644 --- a/dot/network/transaction_integration_test.go +++ b/dot/network/transaction_integration_test.go @@ -41,7 +41,9 @@ func TestHandleTransactionMessage(t *testing.T) { HandleTransactionMessage(peer.ID(""), expectedMsgArg). Return(true, nil) - transactionHandler.EXPECT().TransactionsCount().Return(0) + transactionHandler.EXPECT(). + TransactionsCount(). + Return(0).AnyTimes() config := &Config{ BasePath: t.TempDir(), @@ -53,6 +55,7 @@ func TestHandleTransactionMessage(t *testing.T) { } s := createTestService(t, config) + time.Sleep(100 * time.Millisecond) ret, err := s.handleTransactionMessage(peer.ID(""), expectedMsgArg) require.NoError(t, err) From 817f812398dddef19acd6936abdc5e4f923893bd Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 13:20:05 -0400 Subject: [PATCH 07/10] chore: link todo issue --- dot/network/transaction_integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/network/transaction_integration_test.go b/dot/network/transaction_integration_test.go index 3f0eec6465..742ea6628c 100644 --- a/dot/network/transaction_integration_test.go +++ b/dot/network/transaction_integration_test.go @@ -41,6 +41,7 @@ func TestHandleTransactionMessage(t *testing.T) { HandleTransactionMessage(peer.ID(""), expectedMsgArg). Return(true, nil) + // TODO: https://github.com/ChainSafe/gossamer/issues/1975 transactionHandler.EXPECT(). TransactionsCount(). Return(0).AnyTimes() @@ -55,7 +56,6 @@ func TestHandleTransactionMessage(t *testing.T) { } s := createTestService(t, config) - time.Sleep(100 * time.Millisecond) ret, err := s.handleTransactionMessage(peer.ID(""), expectedMsgArg) require.NoError(t, err) From 4b28d84858f0c404ed4dacb3f3de132dab8db0a0 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 14:35:13 -0400 Subject: [PATCH 08/10] chore: improve coverage on `Test_ext_default_child_storage_get_version_1` --- lib/runtime/wazero/imports_test.go | 55 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/lib/runtime/wazero/imports_test.go b/lib/runtime/wazero/imports_test.go index d382df5961..a7a38e3dce 100644 --- a/lib/runtime/wazero/imports_test.go +++ b/lib/runtime/wazero/imports_test.go @@ -902,27 +902,52 @@ func Test_ext_default_child_storage_exists_version_1(t *testing.T) { } func Test_ext_default_child_storage_get_version_1(t *testing.T) { - inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + cases := map[string]struct { + setupInstance func(t *testing.T) *Instance + expected *[]byte + }{ + "value_exists_expected_value": { + setupInstance: func(t *testing.T) *Instance { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) + require.NoError(t, err) - err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) - require.NoError(t, err) + err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue) + require.NoError(t, err) + return inst + }, + expected: &testValue, + }, + "value_not_found_expected_none": { + setupInstance: func(t *testing.T) *Instance { + return NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + }, + expected: nil, + }, + } - err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue) - require.NoError(t, err) + for tname, tt := range cases { + tt := tt - encChildKey, err := scale.Marshal(testChildKey) - require.NoError(t, err) + t.Run(tname, func(t *testing.T) { + inst := tt.setupInstance(t) - encKey, err := scale.Marshal(testKey) - require.NoError(t, err) + encChildKey, err := scale.Marshal(testChildKey) + require.NoError(t, err) - ret, err := inst.Exec("rtm_ext_default_child_storage_get_version_1", append(encChildKey, encKey...)) - require.NoError(t, err) + encKey, err := scale.Marshal(testKey) + require.NoError(t, err) - var read *[]byte - err = scale.Unmarshal(ret, &read) - require.NoError(t, err) - require.NotNil(t, read) + ret, err := inst.Exec("rtm_ext_default_child_storage_get_version_1", append(encChildKey, encKey...)) + require.NoError(t, err) + + var read *[]byte + err = scale.Unmarshal(ret, &read) + require.NoError(t, err) + + require.Equal(t, tt.expected, read) + }) + } } func Test_ext_default_child_storage_next_key_version_1(t *testing.T) { From 72746146cddf8d9ce3e557f0941aeeaf6287edff Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 15:27:08 -0400 Subject: [PATCH 09/10] chore: increase code cov on `Test_ext_default_child_storage_read_version_1` --- lib/runtime/wazero/imports.go | 2 +- lib/runtime/wazero/imports_test.go | 83 ++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 27 deletions(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index 1c31be50cd..af08bb8de6 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -1710,7 +1710,7 @@ func ext_offchain_local_storage_get_version_1(ctx context.Context, m api.Module, } var encodedOption []byte - if err != nil || len(res) == 0 { + if err != nil || res == nil { logger.Errorf("failed to get value from storage: %s", err) encodedOption = noneEncoded } else { diff --git a/lib/runtime/wazero/imports_test.go b/lib/runtime/wazero/imports_test.go index a7a38e3dce..80f09ea38c 100644 --- a/lib/runtime/wazero/imports_test.go +++ b/lib/runtime/wazero/imports_test.go @@ -741,43 +741,74 @@ var ( ) func Test_ext_default_child_storage_read_version_1(t *testing.T) { + testOffset := uint32(2) + testBufferSize := uint32(100) - inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + expectedValue := testValue[testOffset:] + cases := map[string]struct { + setupInstance func(t *testing.T) *Instance + expected *[]byte + }{ + "should_return_none_if_child_doesnt_exist": { + setupInstance: func(t *testing.T) *Instance { + return NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + }, + expected: nil, + }, - err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) - require.NoError(t, err) + "child_exists_return_value": { + setupInstance: func(t *testing.T) *Instance { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) - err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue) - require.NoError(t, err) + err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) + require.NoError(t, err) - testOffset := uint32(2) - testBufferSize := uint32(100) + err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue) + require.NoError(t, err) + return inst + }, + expected: &expectedValue, + }, + } - encChildKey, err := scale.Marshal(testChildKey) - require.NoError(t, err) + for tname, tt := range cases { + tt := tt - encKey, err := scale.Marshal(testKey) - require.NoError(t, err) + t.Run(tname, func(t *testing.T) { + inst := tt.setupInstance(t) - encBufferSize, err := scale.Marshal(testBufferSize) - require.NoError(t, err) + encChildKey, err := scale.Marshal(testChildKey) + require.NoError(t, err) - encOffset, err := scale.Marshal(testOffset) - require.NoError(t, err) + encKey, err := scale.Marshal(testKey) + require.NoError(t, err) - ret, err := inst.Exec( - "rtm_ext_default_child_storage_read_version_1", - append(append(encChildKey, encKey...), - append(encOffset, encBufferSize...)...)) - require.NoError(t, err) + encBufferSize, err := scale.Marshal(testBufferSize) + require.NoError(t, err) - var read *[]byte - err = scale.Unmarshal(ret, &read) - require.NoError(t, err) - require.NotNil(t, read) + encOffset, err := scale.Marshal(testOffset) + require.NoError(t, err) - val := *read - require.Equal(t, testValue[testOffset:], val[:len(testValue)-int(testOffset)]) + args := bytes.Join([][]byte{ + encChildKey, encKey, + encOffset, encBufferSize, + }, nil) + + ret, err := inst.Exec("rtm_ext_default_child_storage_read_version_1", args) + require.NoError(t, err) + + var read *[]byte + err = scale.Unmarshal(ret, &read) + require.NoError(t, err) + + if tt.expected == nil { + require.Nil(t, read) + } else { + val := *read + require.Equal(t, testValue[testOffset:], val[:len(testValue)-int(testOffset)]) + } + }) + } } func Test_ext_default_child_storage_set_version_1(t *testing.T) { From 43ff1246b29ca9c16b0f027c79c69a46a8b36603 Mon Sep 17 00:00:00 2001 From: EclesioMeloJunior Date: Mon, 28 Aug 2023 16:11:45 -0400 Subject: [PATCH 10/10] chore: use `mustWrite` to reduce code repetition --- lib/runtime/wazero/imports.go | 142 +++++++--------------------------- 1 file changed, 29 insertions(+), 113 deletions(-) diff --git a/lib/runtime/wazero/imports.go b/lib/runtime/wazero/imports.go index af08bb8de6..24b37c91d0 100644 --- a/lib/runtime/wazero/imports.go +++ b/lib/runtime/wazero/imports.go @@ -77,6 +77,14 @@ func write(m api.Module, allocator *runtime.FreeingBumpHeapAllocator, data []byt return newPointerSize(pointer, size), nil } +func mustWrite(m api.Module, allocator *runtime.FreeingBumpHeapAllocator, data []byte) (pointerSize uint64) { + pointerSize, err := write(m, allocator, data) + if err != nil { + panic(err) + } + return pointerSize +} + func ext_logging_log_version_1(ctx context.Context, m api.Module, level int32, targetData, msgData uint64) { target := string(read(m, targetData)) msg := string(read(m, msgData)) @@ -231,51 +239,30 @@ func ext_crypto_ed25519_sign_version_1(ctx context.Context, m api.Module, keyTyp pubKey, err := ed25519.NewPublicKey(pubKeyData) if err != nil { logger.Errorf("failed to get public keys: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } ks, err := rtCtx.Keystore.GetKeystore(id) if err != nil { logger.Warnf("error for id 0x%x: %s", id, err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } signingKey := ks.GetKeypair(pubKey) if signingKey == nil { logger.Error("could not find public key " + pubKey.Hex() + " in keystore") - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } sig, err := signingKey.Sign(read(m, msg)) if err != nil { logger.Error("could not sign message") - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } var fixedSize [64]byte copy(fixedSize[:], sig) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&fixedSize)) - if err != nil { - panic(err) - } - - return ret + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&fixedSize)) } func ext_crypto_ed25519_verify_version_1(ctx context.Context, m api.Module, sig uint32, msg uint64, key uint32) uint32 { @@ -631,11 +618,7 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp ks, err := rtCtx.Keystore.GetKeystore(id) if err != nil { logger.Warnf("error for id 0x%x: %s", id, err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } kb, ok := m.Memory().Read(key, 32) @@ -646,42 +629,25 @@ func ext_crypto_sr25519_sign_version_1(ctx context.Context, m api.Module, keyTyp pubKey, err := sr25519.NewPublicKey(kb) if err != nil { logger.Errorf("failed to get public key: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } signingKey := ks.GetKeypair(pubKey) if signingKey == nil { logger.Error("could not find public key " + pubKey.Hex() + " in keystore") - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } msgData := read(m, msg) sig, err := signingKey.Sign(msgData) if err != nil { logger.Errorf("could not sign message: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } var fixedSig [64]byte copy(fixedSig[:], sig) - - keysPtr, err := write(m, rtCtx.Allocator, scale.MustMarshal(&fixedSig)) - if err != nil { - panic(err) - } - return keysPtr + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&fixedSig)) } func ext_crypto_sr25519_verify_version_1(ctx context.Context, m api.Module, sig uint32, msg uint64, key uint32) uint32 { @@ -984,11 +950,7 @@ func ext_misc_runtime_version_version_1(ctx context.Context, m api.Module, dataS version, err := GetRuntimeVersion(code) if err != nil { logger.Errorf("failed to get runtime version: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } // Note the encoding contains all the latest Core_version fields as defined in @@ -1001,18 +963,10 @@ func ext_misc_runtime_version_version_1(ctx context.Context, m api.Module, dataS encodedData, err := scale.Marshal(version) if err != nil { logger.Errorf("failed to encode result: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&encodedData)) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&encodedData)) } func ext_default_child_storage_read_version_1( @@ -1027,11 +981,7 @@ func ext_default_child_storage_read_version_1( value, err := rtCtx.Storage.GetChildStorage(keyToChild, keyBytes) if err != nil { logger.Errorf("failed to get child storage: %s", err) - ret, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, noneEncoded) } valueBuf, _ := splitPointerSize(valueOut) @@ -1045,11 +995,7 @@ func ext_default_child_storage_read_version_1( binary.LittleEndian.PutUint32(sizeBuf, size) // this is expected to be Option(Vec) - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&sizeBuf)) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&sizeBuf)) } func ext_default_child_storage_set_version_1( @@ -1188,7 +1134,6 @@ func ext_default_child_storage_exists_version_1(ctx context.Context, m api.Modul logger.Errorf("failed to get child from child storage: %s", err) return 0 } - if child != nil { return 1 } @@ -1214,12 +1159,7 @@ func ext_default_child_storage_get_version_1(ctx context.Context, m api.Module, encodedChildOptional = scale.MustMarshal(&child) } - ret, err := write(m, rtCtx.Allocator, encodedChildOptional) - if err != nil { - panic(err) - } - - return ret + return mustWrite(m, rtCtx.Allocator, encodedChildOptional) } func ext_default_child_storage_next_key_version_1( @@ -1717,11 +1657,7 @@ func ext_offchain_local_storage_get_version_1(ctx context.Context, m api.Module, encodedOption = res } - ret, err := write(m, rtCtx.Allocator, scale.MustMarshal(&encodedOption)) - if err != nil { - panic(err) - } - return ret + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&encodedOption)) } func ext_offchain_local_storage_set_version_1(ctx context.Context, m api.Module, kind uint32, key, value uint64) { @@ -2159,12 +2095,7 @@ func ext_storage_get_version_1(ctx context.Context, m api.Module, keySpan uint64 encodedOption = noneEncoded } - valueSpan, err := write(m, rtCtx.Allocator, encodedOption) - if err != nil { - logger.Errorf("failed to allocate: %s", err) - panic(err) - } - return valueSpan + return mustWrite(m, rtCtx.Allocator, encodedOption) } func ext_storage_next_key_version_1(ctx context.Context, m api.Module, keySpan uint64) uint64 { @@ -2188,12 +2119,7 @@ func ext_storage_next_key_version_1(ctx context.Context, m api.Module, keySpan u encodedOption = scale.MustMarshal(&next) } - nextSpan, err := write(m, rtCtx.Allocator, encodedOption) - if err != nil { - logger.Errorf("failed to allocate: %s", err) - panic(err) - } - return nextSpan + return mustWrite(m, rtCtx.Allocator, encodedOption) } func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valueOut uint64, offset uint32) uint64 { @@ -2210,12 +2136,7 @@ func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valu key, value) if value == nil { - res, err := write(m, rtCtx.Allocator, noneEncoded) - if err != nil { - logger.Errorf("failed to allocate: %s", err) - panic(err) - } - return res + return mustWrite(m, rtCtx.Allocator, noneEncoded) } var data []byte @@ -2240,12 +2161,7 @@ func ext_storage_read_version_1(ctx context.Context, m api.Module, keySpan, valu } size := uint32(len(data)) - sizeSpan, err := write(m, rtCtx.Allocator, scale.MustMarshal(&size)) - if err != nil { - logger.Errorf("failed to allocate: %s", err) - panic(err) - } - return sizeSpan + return mustWrite(m, rtCtx.Allocator, scale.MustMarshal(&size)) } func ext_storage_root_version_1(ctx context.Context, m api.Module) uint64 {