Commit 618e2f2f authored by vipwzw's avatar vipwzw

修改prefix 的策略

parent 5a633ba3
<script src="runtime.js"></script> <script src="runtime.js"></script>
<script src="test.js"></script> <script src="test.js"></script>
<script> <script>
callcode("{}", "execlocal_hello", "{}", []) //demo database function
var statedb = {}
var localdb = {}
function getlocaldb(key) {
return localdb[key]
}
function setlocaldb(kvs) {
for (var i = 0; i < kvs.length; i++) {
localdb[kvs[i].key] = kvs[i].value
}
}
function listdb(prefix, key, count, direction) {
var i = 0
var data = []
for (k in localdb) {
if (k.startsWith(prefix) && typeof localdb[k] == "string") {
i++
data.push({key: k, value: localdb[k]})
if (i == count) {
break
}
}
}
return data
}
function getstatedb(key) {
return statedb[key]
}
function setstatedb(kvs) {
for (var i = 0; i < kvs.length; i++) {
statedb[kvs[i].key] = kvs[i].value
}
}
var ret = callcode("{}", "execlocal_hello", "{}", [])
console.log(ret)
</script> </script>
\ No newline at end of file
...@@ -26,11 +26,11 @@ func (c *js) Exec_Create(payload *jsproto.Create, tx *types.Transaction, index i ...@@ -26,11 +26,11 @@ func (c *js) Exec_Create(payload *jsproto.Create, tx *types.Transaction, index i
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvs, logs, err := parseJsReturn(jsvalue) kvs, logs, err := parseJsReturn(c.prefix, jsvalue)
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvc.AddList(kvs) kvc.AddListNoPrefix(kvs)
r := &types.Receipt{Ty: types.ExecOk, KV: kvc.KVList(), Logs: logs} r := &types.Receipt{Ty: types.ExecOk, KV: kvc.KVList(), Logs: logs}
return r, nil return r, nil
} }
...@@ -46,11 +46,11 @@ func (c *js) Exec_Call(payload *jsproto.Call, tx *types.Transaction, index int) ...@@ -46,11 +46,11 @@ func (c *js) Exec_Call(payload *jsproto.Call, tx *types.Transaction, index int)
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvs, logs, err := parseJsReturn(jsvalue) kvs, logs, err := parseJsReturn(c.prefix, jsvalue)
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvc.AddList(kvs) kvc.AddListNoPrefix(kvs)
r := &types.Receipt{Ty: types.ExecOk, KV: kvc.KVList(), Logs: logs} r := &types.Receipt{Ty: types.ExecOk, KV: kvc.KVList(), Logs: logs}
return r, nil return r, nil
} }
...@@ -20,11 +20,11 @@ func (c *js) ExecLocal_Call(payload *jsproto.Call, tx *types.Transaction, receip ...@@ -20,11 +20,11 @@ func (c *js) ExecLocal_Call(payload *jsproto.Call, tx *types.Transaction, receip
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvs, _, err := parseJsReturn(jsvalue) kvs, _, err := parseJsReturn(c.prefix, jsvalue)
if err != nil { if err != nil {
return nil, err return nil, err
} }
kvc.AddList(kvs) kvc.AddListNoPrefix(kvs)
kvc.AddRollbackKV() kvc.AddRollbackKV()
r := &types.LocalDBSet{} r := &types.LocalDBSet{}
r.KV = kvc.KVList() r.KV = kvc.KVList()
......
...@@ -25,8 +25,8 @@ func init() { ...@@ -25,8 +25,8 @@ func init() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
execaddressFunc(basevm) //execaddressFunc(basevm)
registerTableFunc(basevm) //registerTableFunc(basevm)
} }
//Init 插件初始化 //Init 插件初始化
......
...@@ -24,7 +24,7 @@ type blockContext struct { ...@@ -24,7 +24,7 @@ type blockContext struct {
Index int64 `json:"index"` Index int64 `json:"index"`
} }
func parseJsReturn(jsvalue *otto.Object) (kvlist []*types.KeyValue, logs []*types.ReceiptLog, err error) { func parseJsReturn(prefix []byte, jsvalue *otto.Object) (kvlist []*types.KeyValue, logs []*types.ReceiptLog, err error) {
//kvs //kvs
obj, err := getObject(jsvalue, "kvs") obj, err := getObject(jsvalue, "kvs")
if err != nil { if err != nil {
...@@ -42,7 +42,7 @@ func parseJsReturn(jsvalue *otto.Object) (kvlist []*types.KeyValue, logs []*type ...@@ -42,7 +42,7 @@ func parseJsReturn(jsvalue *otto.Object) (kvlist []*types.KeyValue, logs []*type
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
kv, err := parseKV(data) kv, err := parseKV(prefix, data)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
...@@ -101,6 +101,14 @@ func getString(data *otto.Object, key string) (string, error) { ...@@ -101,6 +101,14 @@ func getString(data *otto.Object, key string) (string, error) {
return v.ToString() return v.ToString()
} }
func getBool(data *otto.Object, key string) (bool, error) {
v, err := data.Get(key)
if err != nil {
return false, err
}
return v.ToBoolean()
}
func getInt(data *otto.Object, key string) (int64, error) { func getInt(data *otto.Object, key string) (int64, error) {
v, err := data.Get(key) v, err := data.Get(key)
if err != nil { if err != nil {
...@@ -120,7 +128,7 @@ func getObject(data *otto.Object, key string) (*otto.Object, error) { ...@@ -120,7 +128,7 @@ func getObject(data *otto.Object, key string) (*otto.Object, error) {
return v.Object(), nil return v.Object(), nil
} }
func parseKV(data *otto.Object) (kv *types.KeyValue, err error) { func parseKV(prefix []byte, data *otto.Object) (kv *types.KeyValue, err error) {
key, err := getString(data, "key") key, err := getString(data, "key")
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -129,6 +137,13 @@ func parseKV(data *otto.Object) (kv *types.KeyValue, err error) { ...@@ -129,6 +137,13 @@ func parseKV(data *otto.Object) (kv *types.KeyValue, err error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
hasprefix, err := getBool(data, "prefix")
if err != nil {
return nil, err
}
if !hasprefix {
key = string(prefix) + key
}
return &types.KeyValue{Key: []byte(key), Value: []byte(value)}, nil return &types.KeyValue{Key: []byte(key), Value: []byte(value)}, nil
} }
......
...@@ -138,7 +138,7 @@ func TestBigInt(t *testing.T) { ...@@ -138,7 +138,7 @@ func TestBigInt(t *testing.T) {
call, tx := callCodeTx("test", "hello", s) call, tx := callCodeTx("test", "hello", s)
data, err := e.callVM("exec", call, tx, 0, nil) data, err := e.callVM("exec", call, tx, 0, nil)
assert.Nil(t, err) assert.Nil(t, err)
kvs, _, err := parseJsReturn(data) kvs, _, err := parseJsReturn([]byte("user.jsvm.test"), data)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, `{"balance":"9223372036854775807","balance1":"-9223372036854775808","balance2":9007199254740990,"balance3":-9007199254740990}`, string(kvs[0].Value)) assert.Equal(t, `{"balance":"9223372036854775807","balance1":"-9223372036854775808","balance2":9007199254740990,"balance3":-9007199254740990}`, string(kvs[0].Value))
} }
......
...@@ -105,10 +105,10 @@ func (c *KVCreator) AddNoPrefix(key, value []byte) *KVCreator { ...@@ -105,10 +105,10 @@ func (c *KVCreator) AddNoPrefix(key, value []byte) *KVCreator {
return c.addnoprefix(key, value, true) return c.addnoprefix(key, value, true)
} }
//AddList only add KVList //AddListNoPrefix only add KVList
func (c *KVCreator) AddList(list []*types.KeyValue) *KVCreator { func (c *KVCreator) AddListNoPrefix(list []*types.KeyValue) *KVCreator {
for _, kv := range list { for _, kv := range list {
c.add(kv.Key, kv.Value, true) c.add(kv.Key, kv.Value, false)
} }
return c return c
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment