Commit 23cc6e46 authored by kingwang's avatar kingwang Committed by 33cn

update 04/08

parent ccaff680
......@@ -17,7 +17,7 @@ func (c *js) Exec_Create(payload *jsproto.Create, tx *types.Transaction, index i
if string(tx.Execer) != ptypes.JsX {
return nil, types.ErrExecNameNotMatch
}
c.prefix = calcStatePrefix([]byte(execer))
c.prefix = types.CalcStatePrefix([]byte(execer))
kvc := dapp.NewKVCreator(c.GetStateDB(), c.prefix, nil)
_, err = kvc.GetNoPrefix(calcCodeKey(payload.Name))
if err != nil && err != types.ErrNotFound {
......@@ -45,7 +45,7 @@ func (c *js) Exec_Call(payload *jsproto.Call, tx *types.Transaction, index int)
if string(tx.Execer) != execer {
return nil, types.ErrExecNameNotMatch
}
c.prefix = calcStatePrefix([]byte(execer))
c.prefix = types.CalcStatePrefix([]byte(execer))
kvc := dapp.NewKVCreator(c.GetStateDB(), c.prefix, nil)
jsvalue, err := c.callVM("exec", payload, tx, index, nil)
if err != nil {
......
package executor
import (
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
ptypes "github.com/33cn/plugin/plugin/dapp/js/types"
"github.com/33cn/plugin/plugin/dapp/js/types/jsproto"
......@@ -12,19 +11,13 @@ func (c *js) ExecDelLocal_Create(payload *jsproto.Create, tx *types.Transaction,
}
func (c *js) ExecDelLocal_Call(payload *jsproto.Call, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
krollback := calcRollbackKey(tx.Hash())
execer := types.ExecName("user." + ptypes.JsX + "." + payload.Name)
c.prefix = calcLocalPrefix([]byte(execer))
kvc := dapp.NewKVCreator(c.GetLocalDB(), c.prefix, krollback)
kvs, err := kvc.GetRollbackKVList()
r := &types.LocalDBSet{}
c.prefix = types.CalcLocalPrefix([]byte(execer))
kvs, err := c.DelRollbackKV(tx, []byte(execer))
if err != nil {
return nil, err
}
for _, kv := range kvs {
kvc.AddNoPrefix(kv.Key, kv.Value)
}
kvc.DelRollbackKV()
r := &types.LocalDBSet{}
r.KV = kvc.KVList()
r.KV = kvs
return r, nil
}
package executor
import (
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
ptypes "github.com/33cn/plugin/plugin/dapp/js/types"
"github.com/33cn/plugin/plugin/dapp/js/types/jsproto"
......@@ -12,10 +11,8 @@ func (c *js) ExecLocal_Create(payload *jsproto.Create, tx *types.Transaction, re
}
func (c *js) ExecLocal_Call(payload *jsproto.Call, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
k := calcRollbackKey(tx.Hash())
execer := types.ExecName("user." + ptypes.JsX + "." + payload.Name)
c.prefix = calcLocalPrefix([]byte(execer))
kvc := dapp.NewKVCreator(c.GetLocalDB(), c.prefix, k)
c.prefix = types.CalcLocalPrefix([]byte(execer))
jsvalue, err := c.callVM("execlocal", payload, tx, index, receiptData)
if err != nil {
return nil, err
......@@ -24,9 +21,7 @@ func (c *js) ExecLocal_Call(payload *jsproto.Call, tx *types.Transaction, receip
if err != nil {
return nil, err
}
kvc.AddListNoPrefix(kvs)
kvc.AddRollbackKV()
r := &types.LocalDBSet{}
r.KV = kvc.KVList()
r.KV = c.AddRollbackKV(tx, []byte(execer), kvs)
return r, nil
}
......@@ -5,29 +5,13 @@ import (
ptypes "github.com/33cn/plugin/plugin/dapp/js/types"
)
func calcLocalPrefix(execer []byte) []byte {
s := append([]byte("LODB-"), execer...)
s = append(s, byte('-'))
return s
}
func calcStatePrefix(execer []byte) []byte {
s := append([]byte("mavl-"), execer...)
s = append(s, byte('-'))
return s
}
func calcAllPrefix(name string) ([]byte, []byte) {
execer := types.ExecName("user." + ptypes.JsX + "." + name)
state := calcStatePrefix([]byte(execer))
local := calcLocalPrefix([]byte(execer))
state := types.CalcStatePrefix([]byte(execer))
local := types.CalcLocalPrefix([]byte(execer))
return state, local
}
func calcCodeKey(name string) []byte {
return append([]byte("mavl-"+ptypes.JsX+"-code-"), []byte(name)...)
}
func calcRollbackKey(hash []byte) []byte {
return append([]byte("LODB-"+ptypes.JsX+"-rollback-"), hash...)
}
......@@ -10,7 +10,7 @@ import (
func (c *js) Query_Query(payload *jsproto.Call) (types.Message, error) {
execer := types.ExecName("user." + ptypes.JsX + "." + payload.Name)
c.prefix = calcLocalPrefix([]byte(execer))
c.prefix = types.CalcLocalPrefix([]byte(execer))
jsvalue, err := c.callVM("query", payload, nil, 0, nil)
if err != nil {
fmt.Println("query", err)
......
......@@ -135,12 +135,15 @@ func (c *CoinsType) RPC_Default_Process(action string, msg interface{}) (*types.
// GetAssets return asset list
func (c *CoinsType) GetAssets(tx *types.Transaction) ([]*types.Asset, error) {
assetlist, err := c.ExecTypeBase.GetAssets(tx)
if err != nil || len(assetlist) == 0 {
assets, err := c.ExecTypeBase.GetAssets(tx)
if err != nil || len(assets) == 0 {
return nil, err
}
if assetlist[0].Symbol == "" {
assetlist[0].Symbol = types.GetCoinSymbol()
if assets[0].Symbol == "" {
assets[0].Symbol = types.GetCoinSymbol()
}
return assetlist, nil
if assets[0].Symbol == "bty" {
assets[0].Symbol = "BTY"
}
return assets, nil
}
......@@ -490,3 +490,27 @@ func (d *DriverBase) SetTxs(txs []*types.Transaction) {
func (d *DriverBase) CheckReceiptExecOk() bool {
return false
}
//AddRollbackKV add rollback kv
func (d *DriverBase) AddRollbackKV(tx *types.Transaction, execer []byte, kvs []*types.KeyValue) []*types.KeyValue {
k := types.CalcRollbackKey(types.GetRealExecName(execer), tx.Hash())
kvc := NewKVCreator(d.GetLocalDB(), types.CalcLocalPrefix(execer), k)
kvc.AddListNoPrefix(kvs)
kvc.AddRollbackKV()
return kvc.KVList()
}
//DelRollbackKV del rollback kv when exec_del_local
func (d *DriverBase) DelRollbackKV(tx *types.Transaction, execer []byte) ([]*types.KeyValue, error) {
krollback := types.CalcRollbackKey(types.GetRealExecName(execer), tx.Hash())
kvc := NewKVCreator(d.GetLocalDB(), types.CalcLocalPrefix(execer), krollback)
kvs, err := kvc.GetRollbackKVList()
if err != nil {
return nil, err
}
for _, kv := range kvs {
kvc.AddNoPrefix(kv.Key, kv.Value)
}
kvc.DelRollbackKV()
return kvc.KVList(), nil
}
......@@ -122,6 +122,8 @@ func TestAllow(t *testing.T) {
}
func TestDriverBase(t *testing.T) {
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
demo := newdemoApp().(*demoApp)
demo.SetExecutorType(nil)
assert.Nil(t, demo.GetPayloadValue())
......@@ -167,6 +169,42 @@ func TestDriverBase(t *testing.T) {
err = CheckAddress("1HUiTRFvp6HvW6eacgV9EoBSgroRDiUsMs", 0)
assert.NoError(t, err)
demo.SetLocalDB(kvdb)
execer := "user.p.guodun.demo"
kvs := []*types.KeyValue{
{
Key: []byte("hello"),
Value: []byte("world"),
},
}
newkvs := demo.AddRollbackKV(tx, []byte(execer), kvs)
assert.Equal(t, 2, len(newkvs))
assert.Equal(t, string(newkvs[0].Key), "hello")
assert.Equal(t, string(newkvs[0].Value), "world")
assert.Equal(t, string(newkvs[1].Key), string(append([]byte("LODB-demo-rollback-"), tx.Hash()...)))
rollbackkvs := []*types.KeyValue{
{
Key: []byte("hello"),
Value: nil,
},
}
data := types.Encode(&types.LocalDBSet{KV: rollbackkvs})
assert.Equal(t, string(newkvs[1].Value), string(types.Encode(&types.ReceiptLog{Ty: types.TyLogRollback, Log: data})))
_, err = demo.DelRollbackKV(tx, []byte(execer))
assert.Equal(t, err, types.ErrNotFound)
kvdb.Set(newkvs[1].Key, newkvs[1].Value)
newkvs, err = demo.DelRollbackKV(tx, []byte(execer))
assert.Nil(t, err)
assert.Equal(t, 2, len(newkvs))
assert.Equal(t, string(newkvs[0].Key), "hello")
assert.Equal(t, newkvs[0].Value, []byte(nil))
assert.Equal(t, string(newkvs[1].Key), string(append([]byte("LODB-demo-rollback-"), tx.Hash()...)))
assert.Equal(t, newkvs[1].Value, []byte(nil))
}
func TestDriverBase_Query(t *testing.T) {
......
package types
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestKeyCreate(t *testing.T) {
assert.Equal(t, TotalFeeKey([]byte("1")), []byte("TotalFeeKey:1"))
assert.Equal(t, CalcLocalPrefix([]byte("1")), []byte("LODB-1-"))
assert.Equal(t, CalcStatePrefix([]byte("1")), []byte("mavl-1-"))
assert.Equal(t, CalcRollbackKey([]byte("execer"), []byte("1")), []byte("LODB-execer-rollback-1"))
assert.Equal(t, StatisticFlag(), []byte("Statistics:Flag"))
}
......@@ -6,7 +6,6 @@ package types
import (
"fmt"
"time"
)
// 定义key值
......@@ -63,23 +62,30 @@ func StatisticFlag() []byte {
return []byte("Statistics:Flag")
}
//StatisticTicketInfoKey 统计ticket的key
func StatisticTicketInfoKey(ticketID string) []byte {
return []byte("Statistics:TicketInfo:TicketId:" + ticketID)
//TotalFeeKey 统计所有费用的key
func TotalFeeKey(hash []byte) []byte {
key := []byte("TotalFeeKey:")
return append(key, hash...)
}
//StatisticTicketInfoOrderKey 统计ticket的key
func StatisticTicketInfoOrderKey(minerAddr string, createTime int64, ticketID string) []byte {
return []byte("Statistics:TicketInfoOrder:Addr:" + minerAddr + ":CreateTime:" + time.Unix(createTime, 0).Format("20060102150405") + ":TicketId:" + ticketID)
//CalcLocalPrefix 计算localdb key
func CalcLocalPrefix(execer []byte) []byte {
s := append([]byte("LODB-"), execer...)
s = append(s, byte('-'))
return s
}
//StatisticTicketKey 统计ticket的key
func StatisticTicketKey(minerAddr string) []byte {
return []byte("Statistics:TicketStat:Addr:" + minerAddr)
//CalcStatePrefix 计算localdb key
func CalcStatePrefix(execer []byte) []byte {
s := append([]byte("mavl-"), execer...)
s = append(s, byte('-'))
return s
}
//TotalFeeKey 统计所有费用的key
func TotalFeeKey(hash []byte) []byte {
key := []byte("TotalFeeKey:")
return append(key, hash...)
//CalcRollbackKey 计算回滚的key
func CalcRollbackKey(execer []byte, hash []byte) []byte {
prefix := CalcLocalPrefix(execer)
key := append(prefix, []byte("rollback-")...)
key = append(key, hash...)
return key
}
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