Skip to content

Commit 454689b

Browse files
edwardmacktimwu20
authored andcommitted
feat(lib/runtime/wasmer): implement ext_default_child_storage_storage_kill_version_3 (ChainSafe#1878)
1 parent 13ef4b4 commit 454689b

File tree

2 files changed

+104
-8
lines changed

2 files changed

+104
-8
lines changed

lib/runtime/wasmer/imports.go

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,19 +1142,67 @@ func ext_default_child_storage_storage_kill_version_2(context unsafe.Pointer, ch
11421142
return 0
11431143
}
11441144

1145-
//export ext_default_child_storage_storage_kill_version_3
1146-
func ext_default_child_storage_storage_kill_version_3(context unsafe.Pointer, childStorageKeySpan, _ C.int64_t) C.int64_t {
1147-
logger.Debug("[ext_default_child_storage_storage_kill_version_3] executing...")
1148-
logger.Warn("[ext_default_child_storage_storage_kill_version_3] somewhat unimplemented")
1149-
// TODO: need to use `limit` parameter (#1793)
1145+
type noneRemain uint32
1146+
type someRemain uint32
1147+
1148+
func (noneRemain) Index() uint {
1149+
return 0
1150+
}
1151+
func (someRemain) Index() uint {
1152+
return 1
1153+
}
11501154

1155+
//export ext_default_child_storage_storage_kill_version_3
1156+
func ext_default_child_storage_storage_kill_version_3(context unsafe.Pointer, childStorageKeySpan, lim C.int64_t) C.int64_t {
1157+
logger.Debug("executing...")
11511158
instanceContext := wasm.IntoInstanceContext(context)
11521159
ctx := instanceContext.Data().(*runtime.Context)
11531160
storage := ctx.Storage
1154-
11551161
childStorageKey := asMemorySlice(instanceContext, childStorageKeySpan)
1156-
storage.DeleteChild(childStorageKey)
1157-
return 0
1162+
1163+
limitBytes := asMemorySlice(instanceContext, lim)
1164+
buf := &bytes.Buffer{}
1165+
buf.Write(limitBytes)
1166+
1167+
limit, err := optional.NewBytes(true, nil).Decode(buf)
1168+
if err != nil {
1169+
logger.Warn("cannot generate limit", "error", err)
1170+
}
1171+
1172+
deleted, all, err := storage.DeleteChildLimit(childStorageKey, limit)
1173+
if err != nil {
1174+
logger.Warn("cannot get child storage", "error", err)
1175+
return C.int64_t(0)
1176+
}
1177+
1178+
vdt, err := scale.NewVaryingDataType(noneRemain(0), someRemain(0))
1179+
if err != nil {
1180+
logger.Warn("cannot create new varying data type", "error", err)
1181+
}
1182+
1183+
if all {
1184+
err = vdt.Set(noneRemain(deleted))
1185+
} else {
1186+
err = vdt.Set(someRemain(deleted))
1187+
}
1188+
if err != nil {
1189+
logger.Warn("cannot set varying data type", "error", err)
1190+
return C.int64_t(0)
1191+
}
1192+
1193+
encoded, err := scale.Marshal(vdt)
1194+
if err != nil {
1195+
logger.Warn("problem marshaling varying data type", "error", err)
1196+
return C.int64_t(0)
1197+
}
1198+
1199+
out, err := toWasmMemoryOptional(instanceContext, encoded)
1200+
if err != nil {
1201+
logger.Warn("failed to allocate", "error", err)
1202+
return 0
1203+
}
1204+
1205+
return C.int64_t(out)
11581206
}
11591207

11601208
//export ext_allocator_free_version_1

lib/runtime/wasmer/imports_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,54 @@ func Test_ext_default_child_storage_storage_kill_version_2_limit_none(t *testing
12261226
require.Nil(t, child)
12271227
}
12281228

1229+
func Test_ext_default_child_storage_storage_kill_version_3(t *testing.T) {
1230+
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)
1231+
1232+
tr := trie.NewEmptyTrie()
1233+
tr.Put([]byte(`key2`), []byte(`value2`))
1234+
tr.Put([]byte(`key1`), []byte(`value1`))
1235+
tr.Put([]byte(`key3`), []byte(`value3`))
1236+
err := inst.ctx.Storage.SetChild(testChildKey, tr)
1237+
require.NoError(t, err)
1238+
1239+
testLimitBytes := make([]byte, 4)
1240+
binary.LittleEndian.PutUint32(testLimitBytes, uint32(2))
1241+
optLimit2 := optional.NewBytes(true, testLimitBytes)
1242+
1243+
testCases := []struct {
1244+
key []byte
1245+
limit *optional.Bytes
1246+
expected []byte
1247+
errMsg string
1248+
}{
1249+
{key: []byte(`fakekey`), limit: optLimit2, expected: []byte{0, 0, 0, 0, 0}, errMsg: "Failed to call the `rtm_ext_default_child_storage_storage_kill_version_3` exported function."},
1250+
{key: testChildKey, limit: optLimit2, expected: []byte{1, 2, 0, 0, 0}},
1251+
{key: testChildKey, limit: nil, expected: []byte{0, 1, 0, 0, 0}},
1252+
}
1253+
1254+
for _, test := range testCases {
1255+
encChildKey, err := scale.Marshal(test.key)
1256+
require.NoError(t, err)
1257+
encOptLimit, err := test.limit.Encode()
1258+
require.NoError(t, err)
1259+
res, err := inst.Exec("rtm_ext_default_child_storage_storage_kill_version_3", append(encChildKey, encOptLimit...))
1260+
if test.errMsg != "" {
1261+
require.Error(t, err)
1262+
require.EqualError(t, err, test.errMsg)
1263+
continue
1264+
}
1265+
1266+
require.NoError(t, err)
1267+
1268+
buf := &bytes.Buffer{}
1269+
buf.Write(res)
1270+
1271+
read, err := new(optional.Bytes).Decode(buf)
1272+
require.NoError(t, err)
1273+
require.Equal(t, test.expected, read.Value())
1274+
}
1275+
}
1276+
12291277
func Test_ext_storage_append_version_1(t *testing.T) {
12301278
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)
12311279

0 commit comments

Comments
 (0)