diff --git a/contracts/value/value.go b/contracts/value/value.go index b0fb0a8aa..6e1a6b831 100644 --- a/contracts/value/value.go +++ b/contracts/value/value.go @@ -44,6 +44,9 @@ const ( // credentialAllCommand defines the credential command that is allowed to // perform all commands. credentialAllCommand = "all" + + // contractKeyPrefix is used to prefix keys in the K/V store. + contractKeyPrefix = "VALU" // intentionally 4 bytes only, not a typo! ) // Command defines a type of command for the value contract @@ -172,14 +175,17 @@ func (c valueCommand) write(snap store.Snapshot, step execution.Step) error { return xerrors.Errorf("'%s' not found in tx arg", ValueArg) } - err := snap.Set(key, value) + snapKey := prefix(key) + err := snap.Set(snapKey, value) if err != nil { return xerrors.Errorf("failed to set value: %v", err) } c.index[string(key)] = struct{}{} - dela.Logger.Info().Str("contract", ContractName).Msgf("setting %x=%s", key, value) + dela.Logger.Info(). + Str("contract", ContractName). + Msgf("setting value %x=%s", snapKey, value) return nil } @@ -191,7 +197,7 @@ func (c valueCommand) read(snap store.Snapshot, step execution.Step) error { return xerrors.Errorf("'%s' not found in tx arg", KeyArg) } - val, err := snap.Get(key) + val, err := snap.Get(prefix(key)) if err != nil { return xerrors.Errorf("failed to get key '%s': %v", key, err) } @@ -208,13 +214,18 @@ func (c valueCommand) delete(snap store.Snapshot, step execution.Step) error { return xerrors.Errorf("'%s' not found in tx arg", KeyArg) } - err := snap.Delete(key) + snapKey := prefix(key) + err := snap.Delete(snapKey) if err != nil { return xerrors.Errorf("failed to delete key '%x': %v", key, err) } delete(c.index, string(key)) + dela.Logger.Info(). + Str("contract", ContractName). + Msgf("deleting value %x", snapKey) + return nil } @@ -223,7 +234,7 @@ func (c valueCommand) list(snap store.Snapshot) error { res := []string{} for k := range c.index { - v, err := snap.Get([]byte(k)) + v, err := snap.Get(prefix([]byte(k))) if err != nil { return xerrors.Errorf("failed to get key '%s': %v", k, err) } @@ -247,3 +258,7 @@ func (h infoLog) Write(p []byte) (int, error) { return len(p), nil } + +func prefix(key []byte) []byte { + return append([]byte(contractKeyPrefix), key...) +} diff --git a/contracts/value/value_test.go b/contracts/value/value_test.go index 00b3ed75a..c358793cd 100644 --- a/contracts/value/value_test.go +++ b/contracts/value/value_test.go @@ -76,7 +76,7 @@ func TestCommand_Write(t *testing.T) { _, found = contract.index["dummy"] require.True(t, found) - res, err := snap.Get([]byte("dummy")) + res, err := snap.Get(prefix([]byte("dummy"))) require.NoError(t, err) require.Equal(t, "value", string(res)) } @@ -98,7 +98,7 @@ func TestCommand_Read(t *testing.T) { require.EqualError(t, err, fake.Err("failed to get key 'dummy'")) snap := fake.NewSnapshot() - snap.Set(key, []byte("value")) + snap.Set(prefix(key), []byte("value")) buf := &bytes.Buffer{} cmd.Contract.printer = buf @@ -127,13 +127,13 @@ func TestCommand_Delete(t *testing.T) { require.EqualError(t, err, fake.Err("failed to delete key '"+keyHex+"'")) snap := fake.NewSnapshot() - snap.Set(key, []byte("value")) + snap.Set(prefix(key), []byte("value")) contract.index[keyStr] = struct{}{} err = cmd.delete(snap, makeStep(t, KeyArg, keyStr)) require.NoError(t, err) - res, err := snap.Get(key) + res, err := snap.Get(prefix(key)) require.Nil(t, err) require.Nil(t, res) @@ -158,8 +158,8 @@ func TestCommand_List(t *testing.T) { } snap := fake.NewSnapshot() - snap.Set([]byte(key1), []byte("value1")) - snap.Set([]byte(key2), []byte("value2")) + snap.Set(prefix([]byte(key1)), []byte("value1")) + snap.Set(prefix([]byte(key2)), []byte("value2")) err := cmd.list(snap) require.NoError(t, err) diff --git a/test/integration_test.go b/test/integration_test.go index e4882e708..3a1441eef 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -87,7 +87,7 @@ func getTest[T require.TestingT](numNode, numTx int) func(t T) { require.NoError(t, err) for i := 0; i < numTx; i++ { - key := make([]byte, 32) + key := make([]byte, 28) // only 224 bits are available _, err = rand.Read(key) require.NoError(t, err) @@ -102,7 +102,7 @@ func getTest[T require.TestingT](numNode, numTx int) func(t T) { err = addAndWait(t, timeout, manager, nodes[0].(cosiDelaNode), args...) require.NoError(t, err) - proof, err := nodes[0].GetOrdering().GetProof(key) + proof, err := nodes[0].GetOrdering().GetProof(append([]byte("VALU"), key...)) require.NoError(t, err) require.Equal(t, []byte("value1"), proof.GetValue()) } @@ -112,7 +112,13 @@ func getTest[T require.TestingT](numNode, numTx int) func(t T) { // ----------------------------------------------------------------------------- // Utility functions -func addAndWait(t require.TestingT, to time.Duration, manager txn.Manager, node cosiDelaNode, args ...txn.Arg) error { +func addAndWait( + t require.TestingT, + to time.Duration, + manager txn.Manager, + node cosiDelaNode, + args ...txn.Arg, +) error { manager.Sync() tx, err := manager.Make(args...)