From 793d80cc8eddb4730fc4da34a1193dfa2bc81a72 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 28 Aug 2023 16:56:40 +0200 Subject: [PATCH] Add new runtime functions tests --- lib/runtime/constants.go | 7 +- lib/runtime/wazero/imports_test.go | 228 ++++++++++++++++++++++++++++- 2 files changed, 231 insertions(+), 4 deletions(-) diff --git a/lib/runtime/constants.go b/lib/runtime/constants.go index 26d0ccd267..c6c5346ccf 100644 --- a/lib/runtime/constants.go +++ b/lib/runtime/constants.go @@ -6,9 +6,10 @@ package runtime const ( // v0.9 test API wasm // This wasm is generated using https://github.com/ChainSafe/polkadot-spec. - 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/raw/master/test/" + + HOST_API_TEST_RUNTIME = "hostapi_runtime" + HOST_API_TEST_RUNTIME_FP = "hostapi_runtime.compact.wasm" + // TODO: change this when https://github.com/ChainSafe/polkadot-spec/pull/17 is merged + HOST_API_TEST_RUNTIME_URL = "https://github.com/dimartiro/polkadot-spec/raw/add-triev1-functions/test/" + "runtimes/hostapi/hostapi_runtime.compact.wasm" // v0.9.29 polkadot diff --git a/lib/runtime/wazero/imports_test.go b/lib/runtime/wazero/imports_test.go index ab87e07d29..499d7083a1 100644 --- a/lib/runtime/wazero/imports_test.go +++ b/lib/runtime/wazero/imports_test.go @@ -554,7 +554,9 @@ func Test_ext_trie_blake2_256_root_version_1(t *testing.T) { require.NoError(t, err) encInput[0] = encInput[0] >> 1 - res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_1", encInput) + data := encInput + + res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_1", data) require.NoError(t, err) var hash []byte @@ -569,6 +571,39 @@ func Test_ext_trie_blake2_256_root_version_1(t *testing.T) { require.Equal(t, expected[:], hash) } +// TODO: revisit it +func Test_ext_trie_blake2_256_root_version_2(t *testing.T) { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + testinput := []string{"dimartiro", "was", "here", "??"} + encInput, err := scale.Marshal(testinput) + require.NoError(t, err) + encInput[0] = encInput[0] >> 1 + + stateVersion := uint32(trie.V1) + stateVersionBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion) + + encVersion, err := scale.Marshal(&stateVersionBytes) + require.NoError(t, err) + + data := append(encInput, encVersion...) + + res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_2", data) + require.NoError(t, err) + + var hash []byte + err = scale.Unmarshal(res, &hash) + require.NoError(t, err) + + tt := trie.NewEmptyTrie() + tt.Put([]byte("dimartiro"), []byte("was"), trie.V1) + tt.Put([]byte("here"), []byte("??"), trie.V1) + + expected := tt.MustHash() + require.Equal(t, expected[:], hash) +} + func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) { inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -587,6 +622,33 @@ func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) { require.Equal(t, expected[:], hash) } +func Test_ext_trie_blake2_256_ordered_root_version_2(t *testing.T) { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + testvalues := []string{"static", "even-keeled", "Future-proofed"} + encValues, err := scale.Marshal(testvalues) + require.NoError(t, err) + + stateVersion := uint32(trie.V1) + stateVersionBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion) + + encVersion, err := scale.Marshal(&stateVersionBytes) + require.NoError(t, err) + + data := append(encValues, encVersion...) + + res, err := inst.Exec("rtm_ext_trie_blake2_256_ordered_root_version_2", data) + require.NoError(t, err) + + var hash []byte + err = scale.Unmarshal(res, &hash) + require.NoError(t, err) + + expected := common.MustHexToHash("0xd847b86d0219a384d11458e829e9f4f4cce7e3cc2e6dcd0e8a6ad6f12c64a737") + require.Equal(t, expected[:], hash) +} + func Test_ext_trie_blake2_256_verify_proof_version_1(t *testing.T) { tmp := t.TempDir() memdb, err := database.NewPebble(tmp, true) @@ -679,6 +741,107 @@ func Test_ext_trie_blake2_256_verify_proof_version_1(t *testing.T) { } } +func Test_ext_trie_blake2_256_verify_proof_version_2(t *testing.T) { + tmp := t.TempDir() + memdb, err := database.NewPebble(tmp, true) + require.NoError(t, err) + + otherTrie := trie.NewEmptyTrie() + otherTrie.Put([]byte("simple"), []byte("cat"), trie.V1) + + otherHash, err := otherTrie.Hash() + require.NoError(t, err) + + tr := trie.NewEmptyTrie() + tr.Put([]byte("do"), []byte("verb"), trie.V1) + tr.Put([]byte("domain"), []byte("website"), trie.V1) + tr.Put([]byte("other"), []byte("random"), trie.V1) + tr.Put([]byte("otherwise"), []byte("randomstuff"), trie.V1) + tr.Put([]byte("cat"), []byte("another animal"), trie.V1) + + err = tr.WriteDirty(memdb) + require.NoError(t, err) + + hash, err := tr.Hash() + require.NoError(t, err) + + keys := [][]byte{ + []byte("do"), + []byte("domain"), + []byte("other"), + []byte("otherwise"), + []byte("cat"), + } + + root := hash.ToBytes() + otherRoot := otherHash.ToBytes() + + allProofs, err := proof.Generate(root, keys, memdb) + require.NoError(t, err) + + testcases := map[string]struct { + root, key, value []byte + proof [][]byte + expect bool + }{ + "Proof_should_be_true": { + root: root, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: true}, + "Root_empty,_proof_should_be_false": { + root: []byte{}, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: false}, + "Other_root,_proof_should_be_false": { + root: otherRoot, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: false}, + "Value_empty,_proof_should_be_true": { + root: root, key: []byte("do"), proof: allProofs, value: nil, expect: true}, + "Unknow_key,_proof_should_be_false": { + root: root, key: []byte("unknow"), proof: allProofs, value: nil, expect: false}, + "Key_and_value_unknow,_proof_should_be_false": { + root: root, key: []byte("unknow"), proof: allProofs, value: []byte("unknow"), expect: false}, + "Empty_proof,_should_be_false": { + root: root, key: []byte("do"), proof: [][]byte{}, value: nil, expect: false}, + } + + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + for name, testcase := range testcases { + testcase := testcase + t.Run(name, func(t *testing.T) { + hashEnc, err := scale.Marshal(testcase.root) + require.NoError(t, err) + + args := hashEnc + + encProof, err := scale.Marshal(testcase.proof) + require.NoError(t, err) + args = append(args, encProof...) + + keyEnc, err := scale.Marshal(testcase.key) + require.NoError(t, err) + args = append(args, keyEnc...) + + valueEnc, err := scale.Marshal(testcase.value) + require.NoError(t, err) + args = append(args, valueEnc...) + + stateVersion := uint32(trie.V1) + stateVersionBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion) + + encVersion, err := scale.Marshal(&stateVersionBytes) + require.NoError(t, err) + + args = append(args, encVersion...) + + res, err := inst.Exec("rtm_ext_trie_blake2_256_verify_proof_version_2", args) + require.NoError(t, err) + + var got bool + err = scale.Unmarshal(res, &got) + require.NoError(t, err) + require.Equal(t, testcase.expect, got) + }) + } +} + func Test_ext_misc_runtime_version_version_1(t *testing.T) { inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -994,6 +1157,48 @@ func Test_ext_default_child_storage_root_version_1(t *testing.T) { require.Equal(t, rootHash, actualValue) } +func Test_ext_default_child_storage_root_version_2(t *testing.T) { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie(), trie.V1) + require.NoError(t, err) + + err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue, trie.V1) + require.NoError(t, err) + + child, err := inst.Context.Storage.GetChild(testChildKey) + require.NoError(t, err) + + rootHash, err := child.Hash() + require.NoError(t, err) + + encChildKey, err := scale.Marshal(testChildKey) + require.NoError(t, err) + encKey, err := scale.Marshal(testKey) + require.NoError(t, err) + + stateVersion := uint32(trie.V1) + stateVersionBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion) + + encVersion, err := scale.Marshal(&stateVersionBytes) + require.NoError(t, err) + + data := append(encChildKey, encKey...) + data = append(data, encVersion...) + + ret, err := inst.Exec("rtm_ext_default_child_storage_root_version_2", data) + require.NoError(t, err) + + var hash []byte + err = scale.Unmarshal(ret, &hash) + require.NoError(t, err) + + // Convert decoded interface to common Hash + actualValue := common.BytesToHash(hash) + require.Equal(t, rootHash, actualValue) +} + func Test_ext_default_child_storage_storage_kill_version_1(t *testing.T) { inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) @@ -1835,6 +2040,27 @@ func Test_ext_storage_root_version_1(t *testing.T) { require.Equal(t, expected[:], hash) } +func Test_ext_storage_root_version_2(t *testing.T) { + inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME) + + stateVersion := uint32(trie.V1) + stateVersionBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion) + + encVersion, err := scale.Marshal(&stateVersionBytes) + require.NoError(t, err) + + ret, err := inst.Exec("rtm_ext_storage_root_version_2", encVersion) + require.NoError(t, err) + + var hash []byte + err = scale.Unmarshal(ret, &hash) + require.NoError(t, err) + + expected := trie.EmptyHash + require.Equal(t, expected[:], hash) +} + func Test_ext_storage_set_version_1(t *testing.T) { inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)