From 974b1fc795ca5639ee88936ce1293a9bcfc55805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Junior?= Date: Tue, 9 Nov 2021 17:23:42 -0400 Subject: [PATCH] feat(lib/runtime): Implement `ext_offchain_http_request_start_version_1` host function (#1947) * feat: implement offchain http host functions * chore: decoding Result * chore: adjust result encoding/decoding * chore: add export comment on Get * chore: change to map and update test wasm * chore: use request id buffer * chore: change to NewHTTPSet * chore: add export comment * chore: use pkg/scale to encode Result to wasm memory * chore: update naming and fix lint warns * chore: use buffer.put when remove http request * chore: add more comments * chore: add unit tests * chore: fix misspelling * chore: fix scale marshal to encode Result instead of Option * chore: ignore uneeded error * chore: fix unused params * chore: cannot remove unused params * chore: ignore deepsource errors * chore: add parallel to wasmer tests * chore: remove dereferencing * chore: fix param compatibility * chore: embed mutex iunto httpset struct * chore: update the hoost polkadot test runtime location * chore: fix request not available test --- lib/runtime/constants.go | 2 +- lib/runtime/offchain/httpset.go | 105 +++++++++++++++++++++++++++ lib/runtime/offchain/httpset_test.go | 47 ++++++++++++ lib/runtime/types.go | 18 +++-- lib/runtime/wasmer/imports.go | 34 ++++++++- lib/runtime/wasmer/imports_test.go | 103 ++++++++++++++++++++++++++ lib/runtime/wasmer/instance.go | 18 +++-- 7 files changed, 309 insertions(+), 18 deletions(-) create mode 100644 lib/runtime/offchain/httpset.go create mode 100644 lib/runtime/offchain/httpset_test.go diff --git a/lib/runtime/constants.go b/lib/runtime/constants.go index d5d107698e..c244d1c978 100644 --- a/lib/runtime/constants.go +++ b/lib/runtime/constants.go @@ -47,7 +47,7 @@ const ( // v0.9 test API wasm HOST_API_TEST_RUNTIME = "hostapi_runtime" HOST_API_TEST_RUNTIME_FP = "hostapi_runtime.compact.wasm" - HOST_API_TEST_RUNTIME_URL = "https://github.com/ChainSafe/polkadot-spec/blob/9cc27bf7b7f21c106000103f8f6b6c51f7fb8353/test/runtimes/hostapi/hostapi_runtime.compact.wasm?raw=true" + HOST_API_TEST_RUNTIME_URL = "https://github.com/ChainSafe/polkadot-spec/blob/b94d8c58ad6ea8bf827b0cae1645a999719c2bc7/test/runtimes/hostapi/hostapi_runtime.compact.wasm?raw=true" // v0.8 substrate runtime with modified name and babe C=(1, 1) DEV_RUNTIME = "dev_runtime" diff --git a/lib/runtime/offchain/httpset.go b/lib/runtime/offchain/httpset.go new file mode 100644 index 0000000000..7379a540ef --- /dev/null +++ b/lib/runtime/offchain/httpset.go @@ -0,0 +1,105 @@ +package offchain + +import ( + "errors" + "net/http" + "sync" +) + +const maxConcurrentRequests = 1000 + +var ( + errIntBufferEmpty = errors.New("int buffer exhausted") + errIntBufferFull = errors.New("int buffer is full") + errRequestIDNotAvailable = errors.New("request id not available") +) + +// requestIDBuffer created to control the amount of available non-duplicated ids +type requestIDBuffer chan int16 + +// newIntBuffer creates the request id buffer starting from 1 till @buffSize (by default @buffSize is 1000) +func newIntBuffer(buffSize int16) requestIDBuffer { + b := make(chan int16, buffSize) + for i := int16(1); i <= buffSize; i++ { + b <- i + } + + return b +} + +func (b requestIDBuffer) get() (int16, error) { + select { + case v := <-b: + return v, nil + default: + return 0, errIntBufferEmpty + } +} + +func (b requestIDBuffer) put(i int16) error { + select { + case b <- i: + return nil + default: + return errIntBufferFull + } +} + +// HTTPSet holds a pool of concurrent http request calls +type HTTPSet struct { + *sync.Mutex + reqs map[int16]*http.Request + idBuff requestIDBuffer +} + +// NewHTTPSet creates a offchain http set that can be used +// by runtime as HTTP clients, the max concurrent requests is 1000 +func NewHTTPSet() *HTTPSet { + return &HTTPSet{ + new(sync.Mutex), + make(map[int16]*http.Request), + newIntBuffer(maxConcurrentRequests), + } +} + +// StartRequest create a new request using the method and the uri, adds the request into the list +// and then return the position of the request inside the list +func (p *HTTPSet) StartRequest(method, uri string) (int16, error) { + p.Lock() + defer p.Unlock() + + id, err := p.idBuff.get() + if err != nil { + return 0, err + } + + if _, ok := p.reqs[id]; ok { + return 0, errRequestIDNotAvailable + } + + req, err := http.NewRequest(method, uri, nil) + if err != nil { + return 0, err + } + + p.reqs[id] = req + return id, nil +} + +// Remove just remove a expecific request from reqs +func (p *HTTPSet) Remove(id int16) error { + p.Lock() + defer p.Unlock() + + delete(p.reqs, id) + + return p.idBuff.put(id) +} + +// Get returns a request or nil if request not found +func (p *HTTPSet) Get(id int16) *http.Request { + p.Lock() + defer p.Unlock() + + return p.reqs[id] +} diff --git a/lib/runtime/offchain/httpset_test.go b/lib/runtime/offchain/httpset_test.go new file mode 100644 index 0000000000..4b73c9a34d --- /dev/null +++ b/lib/runtime/offchain/httpset_test.go @@ -0,0 +1,47 @@ +package offchain + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/require" +) + +const defaultTestURI = "http://example.url" + +func TestHTTPSetLimit(t *testing.T) { + t.Parallel() + + set := NewHTTPSet() + var err error + for i := 0; i < maxConcurrentRequests+1; i++ { + _, err = set.StartRequest(http.MethodGet, defaultTestURI) + } + + require.ErrorIs(t, errIntBufferEmpty, err) +} + +func TestHTTPSet_StartRequest_NotAvailableID(t *testing.T) { + t.Parallel() + + set := NewHTTPSet() + set.reqs[1] = &http.Request{} + + _, err := set.StartRequest(http.MethodGet, defaultTestURI) + require.ErrorIs(t, errRequestIDNotAvailable, err) +} + +func TestHTTPSetGet(t *testing.T) { + t.Parallel() + + set := NewHTTPSet() + + id, err := set.StartRequest(http.MethodGet, defaultTestURI) + require.NoError(t, err) + + req := set.Get(id) + require.NotNil(t, req) + + require.Equal(t, http.MethodGet, req.Method) + require.Equal(t, defaultTestURI, req.URL.String()) +} diff --git a/lib/runtime/types.go b/lib/runtime/types.go index 6a131104af..8a4a734146 100644 --- a/lib/runtime/types.go +++ b/lib/runtime/types.go @@ -19,6 +19,7 @@ package runtime import ( "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/runtime/offchain" log "github.com/ChainSafe/log15" ) @@ -72,14 +73,15 @@ type InstanceConfig struct { // Context is the context for the wasm interpreter's imported functions type Context struct { - Storage Storage - Allocator *FreeingBumpHeapAllocator - Keystore *keystore.GlobalKeystore - Validator bool - NodeStorage NodeStorage - Network BasicNetwork - Transaction TransactionState - SigVerifier *SignatureVerifier + Storage Storage + Allocator *FreeingBumpHeapAllocator + Keystore *keystore.GlobalKeystore + Validator bool + NodeStorage NodeStorage + Network BasicNetwork + Transaction TransactionState + SigVerifier *SignatureVerifier + OffchainHTTPSet *offchain.HTTPSet } // NewValidateTransactionError returns an error based on a return value from TaggedTransactionQueueValidateTransaction diff --git a/lib/runtime/wasmer/imports.go b/lib/runtime/wasmer/imports.go index 7877ba5a29..f75a1ee4c7 100644 --- a/lib/runtime/wasmer/imports.go +++ b/lib/runtime/wasmer/imports.go @@ -89,6 +89,7 @@ package wasmer // extern int64_t ext_offchain_submit_transaction_version_1(void *context, int64_t a); // extern int64_t ext_offchain_timestamp_version_1(void *context); // extern void ext_offchain_sleep_until_version_1(void *context, int64_t a); +// extern int64_t ext_offchain_http_request_start_version_1(void *context, int64_t a, int64_t b, int64_t c); // // extern void ext_storage_append_version_1(void *context, int64_t a, int64_t b); // extern int64_t ext_storage_changes_root_version_1(void *context, int64_t a); @@ -894,7 +895,7 @@ func ext_trie_blake2_256_ordered_root_version_1(context unsafe.Pointer, dataSpan } //export ext_trie_blake2_256_verify_proof_version_1 -func ext_trie_blake2_256_verify_proof_version_1(context unsafe.Pointer, a C.int32_t, b, c, d C.int64_t) C.int32_t { +func ext_trie_blake2_256_verify_proof_version_1(context unsafe.Pointer, a C.int32_t, b, c, d C.int64_t) C.int32_t { // skipcq: RVV-B0012 logger.Debug("[ext_trie_blake2_256_verify_proof_version_1] executing...") logger.Warn("[ext_trie_blake2_256_verify_proof_version_1] unimplemented") return 0 @@ -1675,6 +1676,33 @@ func ext_offchain_sleep_until_version_1(_ unsafe.Pointer, deadline C.int64_t) { logger.Warn("unimplemented") } +//export ext_offchain_http_request_start_version_1 +func ext_offchain_http_request_start_version_1(context unsafe.Pointer, methodSpan, uriSpan, metaSpan C.int64_t) C.int64_t { // skipcq: RVV-B0012 + logger.Debug("executing...") + + instanceContext := wasm.IntoInstanceContext(context) + + httpMethod := asMemorySlice(instanceContext, methodSpan) + uri := asMemorySlice(instanceContext, uriSpan) + + result := scale.NewResult(int16(0), nil) + + runtimeCtx := instanceContext.Data().(*runtime.Context) + reqID, err := runtimeCtx.OffchainHTTPSet.StartRequest(string(httpMethod), string(uri)) + + if err != nil { + logger.Error("failed to start request", "error", err) + _ = result.Set(scale.Err, nil) + } else { + _ = result.Set(scale.OK, reqID) + } + + enc, _ := scale.Marshal(result) + ptr, _ := toWasmMemory(instanceContext, enc) + + return C.int64_t(ptr) +} + func storageAppend(storage runtime.Storage, key, valueToAppend []byte) error { nextLength := big.NewInt(1) var valueRes []byte @@ -2334,6 +2362,10 @@ func ImportsNodeRuntime() (*wasm.Imports, error) { //nolint if err != nil { return nil, err } + _, err = imports.Append("ext_offchain_http_request_start_version_1", ext_offchain_http_request_start_version_1, C.ext_offchain_http_request_start_version_1) + if err != nil { + return nil, err + } _, err = imports.Append("ext_sandbox_instance_teardown_version_1", ext_sandbox_instance_teardown_version_1, C.ext_sandbox_instance_teardown_version_1) if err != nil { return nil, err diff --git a/lib/runtime/wasmer/imports_test.go b/lib/runtime/wasmer/imports_test.go index 5ef67a4768..e921dd503c 100644 --- a/lib/runtime/wasmer/imports_test.go +++ b/lib/runtime/wasmer/imports_test.go @@ -60,6 +60,7 @@ func TestMain(m *testing.M) { } func Test_ext_hashing_blake2_128_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -79,6 +80,7 @@ func Test_ext_hashing_blake2_128_version_1(t *testing.T) { } func Test_ext_hashing_blake2_256_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -98,6 +100,7 @@ func Test_ext_hashing_blake2_256_version_1(t *testing.T) { } func Test_ext_hashing_keccak_256_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -117,6 +120,7 @@ func Test_ext_hashing_keccak_256_version_1(t *testing.T) { } func Test_ext_hashing_twox_128_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -136,6 +140,7 @@ func Test_ext_hashing_twox_128_version_1(t *testing.T) { } func Test_ext_hashing_twox_64_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -155,6 +160,7 @@ func Test_ext_hashing_twox_64_version_1(t *testing.T) { } func Test_ext_hashing_sha2_256_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) data := []byte("helloworld") @@ -173,6 +179,7 @@ func Test_ext_hashing_sha2_256_version_1(t *testing.T) { } func Test_ext_storage_clear_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -189,6 +196,7 @@ func Test_ext_storage_clear_version_1(t *testing.T) { } func Test_ext_offchain_local_storage_clear_version_1_Persistent(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("key1") @@ -211,6 +219,7 @@ func Test_ext_offchain_local_storage_clear_version_1_Persistent(t *testing.T) { } func Test_ext_offchain_local_storage_clear_version_1_Local(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("key1") @@ -232,7 +241,62 @@ func Test_ext_offchain_local_storage_clear_version_1_Local(t *testing.T) { require.Nil(t, val) } +func Test_ext_offchain_http_request_start_version_1(t *testing.T) { + t.Parallel() + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + encMethod, err := scale.Marshal([]byte("GET")) + require.NoError(t, err) + + encURI, err := scale.Marshal([]byte("https://chainsafe.io")) + require.NoError(t, err) + + var optMeta *[]byte + encMeta, err := scale.Marshal(optMeta) + require.NoError(t, err) + + params := append([]byte{}, encMethod...) + params = append(params, encURI...) + params = append(params, encMeta...) + + resReqID := scale.NewResult(int16(0), nil) + + // start request number 0 + ret, err := inst.Exec("rtm_ext_offchain_http_request_start_version_1", params) + require.NoError(t, err) + + err = scale.Unmarshal(ret, &resReqID) + require.NoError(t, err) + + requestNumber, err := resReqID.Unwrap() + require.NoError(t, err) + require.Equal(t, int16(1), requestNumber) + + // start request number 1 + ret, err = inst.Exec("rtm_ext_offchain_http_request_start_version_1", params) + require.NoError(t, err) + + err = scale.Unmarshal(ret, &resReqID) + require.NoError(t, err) + + requestNumber, err = resReqID.Unwrap() + require.NoError(t, err) + require.Equal(t, int16(2), requestNumber) + + // start request number 2 + ret, err = inst.Exec("rtm_ext_offchain_http_request_start_version_1", params) + require.NoError(t, err) + + err = scale.Unmarshal(ret, &resReqID) + require.NoError(t, err) + + requestNumber, err = resReqID.Unwrap() + require.NoError(t, err) + require.Equal(t, int16(3), requestNumber) +} + func Test_ext_storage_clear_prefix_version_1_hostAPI(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("static") @@ -255,6 +319,7 @@ func Test_ext_storage_clear_prefix_version_1_hostAPI(t *testing.T) { } func Test_ext_storage_clear_prefix_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -277,6 +342,7 @@ func Test_ext_storage_clear_prefix_version_1(t *testing.T) { } func Test_ext_storage_clear_prefix_version_2(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -349,6 +415,7 @@ func Test_ext_storage_clear_prefix_version_2(t *testing.T) { } func Test_ext_storage_get_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -369,6 +436,7 @@ func Test_ext_storage_get_version_1(t *testing.T) { } func Test_ext_storage_exists_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -392,6 +460,7 @@ func Test_ext_storage_exists_version_1(t *testing.T) { } func Test_ext_storage_next_key_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -414,6 +483,7 @@ func Test_ext_storage_next_key_version_1(t *testing.T) { } func Test_ext_storage_read_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -442,6 +512,7 @@ func Test_ext_storage_read_version_1(t *testing.T) { } func Test_ext_storage_read_version_1_again(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -471,6 +542,7 @@ func Test_ext_storage_read_version_1_again(t *testing.T) { } func Test_ext_storage_read_version_1_OffsetLargerThanValue(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -499,6 +571,7 @@ func Test_ext_storage_read_version_1_OffsetLargerThanValue(t *testing.T) { } func Test_ext_storage_root_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) ret, err := inst.Exec("rtm_ext_storage_root_version_1", []byte{}) @@ -513,6 +586,7 @@ func Test_ext_storage_root_version_1(t *testing.T) { } func Test_ext_storage_set_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -531,6 +605,7 @@ func Test_ext_storage_set_version_1(t *testing.T) { } func Test_ext_offline_index_set_version_1(t *testing.T) { + t.Parallel() // TODO this currently fails with error could not find exported function, add rtm_ func to tester wasm (#1026) t.Skip() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -552,6 +627,7 @@ func Test_ext_offline_index_set_version_1(t *testing.T) { } func Test_ext_crypto_ed25519_generate_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) idData := []byte(keystore.AccoName) @@ -595,6 +671,7 @@ func Test_ext_crypto_ed25519_generate_version_1(t *testing.T) { } func Test_ext_crypto_ed25519_public_keys_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) idData := []byte(keystore.DumyName) @@ -629,6 +706,7 @@ func Test_ext_crypto_ed25519_public_keys_version_1(t *testing.T) { } func Test_ext_crypto_ed25519_sign_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) kp, err := ed25519.GenerateKeypair() @@ -667,6 +745,7 @@ func Test_ext_crypto_ed25519_sign_version_1(t *testing.T) { } func Test_ext_crypto_ed25519_verify_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) kp, err := ed25519.GenerateKeypair() @@ -734,6 +813,7 @@ func Test_ext_crypto_ecdsa_verify_version_2(t *testing.T) { } func Test_ext_crypto_ecdsa_verify_version_2_Table(t *testing.T) { + t.Parallel() testCases := map[string]struct { sig []byte msg []byte @@ -791,6 +871,7 @@ func Test_ext_crypto_ecdsa_verify_version_2_Table(t *testing.T) { } func Test_ext_crypto_sr25519_generate_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) idData := []byte(keystore.AccoName) @@ -823,6 +904,7 @@ func Test_ext_crypto_sr25519_generate_version_1(t *testing.T) { } func Test_ext_crypto_secp256k1_ecdsa_recover_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) msgData := []byte("Hello world!") @@ -866,6 +948,7 @@ func Test_ext_crypto_secp256k1_ecdsa_recover_version_1(t *testing.T) { } func Test_ext_crypto_secp256k1_ecdsa_recover_compressed_version_1(t *testing.T) { + t.Parallel() t.Skip("host API tester does not yet contain rtm_ext_crypto_secp256k1_ecdsa_recover_compressed_version_1") inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -909,6 +992,7 @@ func Test_ext_crypto_secp256k1_ecdsa_recover_compressed_version_1(t *testing.T) } func Test_ext_crypto_sr25519_public_keys_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) idData := []byte(keystore.DumyName) @@ -943,6 +1027,7 @@ func Test_ext_crypto_sr25519_public_keys_version_1(t *testing.T) { } func Test_ext_crypto_sr25519_sign_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) kp, err := sr25519.GenerateKeypair() @@ -983,6 +1068,7 @@ func Test_ext_crypto_sr25519_sign_version_1(t *testing.T) { } func Test_ext_crypto_sr25519_verify_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) kp, err := sr25519.GenerateKeypair() @@ -1015,6 +1101,7 @@ func Test_ext_crypto_sr25519_verify_version_1(t *testing.T) { } func Test_ext_default_child_storage_read_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1051,6 +1138,7 @@ func Test_ext_default_child_storage_read_version_1(t *testing.T) { } func Test_ext_default_child_storage_clear_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1079,6 +1167,7 @@ func Test_ext_default_child_storage_clear_version_1(t *testing.T) { } func Test_ext_default_child_storage_clear_prefix_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) prefix := []byte("key") @@ -1120,6 +1209,7 @@ func Test_ext_default_child_storage_clear_prefix_version_1(t *testing.T) { } func Test_ext_default_child_storage_exists_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1144,6 +1234,7 @@ func Test_ext_default_child_storage_exists_version_1(t *testing.T) { } func Test_ext_default_child_storage_get_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1168,6 +1259,7 @@ func Test_ext_default_child_storage_get_version_1(t *testing.T) { } func Test_ext_default_child_storage_next_key_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testKeyValuePair := []struct { @@ -1205,6 +1297,7 @@ func Test_ext_default_child_storage_next_key_version_1(t *testing.T) { } func Test_ext_default_child_storage_root_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1237,6 +1330,7 @@ func Test_ext_default_child_storage_root_version_1(t *testing.T) { } func Test_ext_default_child_storage_set_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1265,6 +1359,7 @@ func Test_ext_default_child_storage_set_version_1(t *testing.T) { } func Test_ext_default_child_storage_storage_kill_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) err := inst.ctx.Storage.SetChild(testChildKey, trie.NewEmptyTrie()) @@ -1286,6 +1381,7 @@ func Test_ext_default_child_storage_storage_kill_version_1(t *testing.T) { } func Test_ext_default_child_storage_storage_kill_version_2_limit_all(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) tr := trie.NewEmptyTrie() @@ -1319,6 +1415,7 @@ func Test_ext_default_child_storage_storage_kill_version_2_limit_all(t *testing. } func Test_ext_default_child_storage_storage_kill_version_2_limit_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) tr := trie.NewEmptyTrie() @@ -1352,6 +1449,7 @@ func Test_ext_default_child_storage_storage_kill_version_2_limit_1(t *testing.T) } func Test_ext_default_child_storage_storage_kill_version_2_limit_none(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) tr := trie.NewEmptyTrie() @@ -1383,6 +1481,7 @@ func Test_ext_default_child_storage_storage_kill_version_2_limit_none(t *testing } func Test_ext_default_child_storage_storage_kill_version_3(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) tr := trie.NewEmptyTrie() @@ -1429,6 +1528,7 @@ func Test_ext_default_child_storage_storage_kill_version_3(t *testing.T) { } func Test_ext_storage_append_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testkey := []byte("noot") @@ -1477,6 +1577,7 @@ func Test_ext_storage_append_version_1(t *testing.T) { } func Test_ext_storage_append_version_1_again(t *testing.T) { + t.Parallel() DefaultTestLogLvl = 5 inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -1526,6 +1627,7 @@ func Test_ext_storage_append_version_1_again(t *testing.T) { } func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testvalues := []string{"static", "even-keeled", "Future-proofed"} @@ -1544,6 +1646,7 @@ func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) { } func Test_ext_trie_blake2_256_root_version_1(t *testing.T) { + t.Parallel() inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) testinput := []string{"noot", "was", "here", "??"} diff --git a/lib/runtime/wasmer/instance.go b/lib/runtime/wasmer/instance.go index f0c1fcfd3d..cafa936d76 100644 --- a/lib/runtime/wasmer/instance.go +++ b/lib/runtime/wasmer/instance.go @@ -25,6 +25,7 @@ import ( "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" + "github.com/ChainSafe/gossamer/lib/runtime/offchain" "github.com/ChainSafe/gossamer/lib/trie" log "github.com/ChainSafe/log15" @@ -149,14 +150,15 @@ func newInstance(code []byte, cfg *Config) (*Instance, error) { allocator := runtime.NewAllocator(instance.Memory, heapBase) runtimeCtx := &runtime.Context{ - Storage: cfg.Storage, - Allocator: allocator, - Keystore: cfg.Keystore, - Validator: cfg.Role == byte(4), - NodeStorage: cfg.NodeStorage, - Network: cfg.Network, - Transaction: cfg.Transaction, - SigVerifier: runtime.NewSignatureVerifier(), + Storage: cfg.Storage, + Allocator: allocator, + Keystore: cfg.Keystore, + Validator: cfg.Role == byte(4), + NodeStorage: cfg.NodeStorage, + Network: cfg.Network, + Transaction: cfg.Transaction, + SigVerifier: runtime.NewSignatureVerifier(), + OffchainHTTPSet: offchain.NewHTTPSet(), } logger.Debug("NewInstance", "runtimeCtx", runtimeCtx)