Commit 59b1cbdc authored by 任硕's avatar 任硕 Committed by linj

unfreeze exec/del local

parent 8de1b924
...@@ -61,7 +61,7 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro ...@@ -61,7 +61,7 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
k := []byte(unfreezeID) k := []byte(unfreezeID)
v := types.Encode(unfreeze) v := types.Encode(unfreeze)
kv = append(kv, &types.KeyValue{k, v}) kv = append(kv, &types.KeyValue{k, v})
receiptLog := a.getCreateLog(unfreeze) receiptLog := a.getUnfreezeLog(unfreeze)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
return &types.Receipt{types.ExecOk, kv, logs}, nil return &types.Receipt{types.ExecOk, kv, logs}, nil
} }
...@@ -103,7 +103,7 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt ...@@ -103,7 +103,7 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
unfreeze.WithdrawTimes += int32(reaTimes) unfreeze.WithdrawTimes += int32(reaTimes)
unfreeze.Remaining -= available unfreeze.Remaining -= available
a.saveStateDB(&unfreeze) a.saveStateDB(&unfreeze)
receiptLog := a.getWithdrawLog(&unfreeze) receiptLog := a.getUnfreezeLog(&unfreeze)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
k := []byte(withdraw.UnfreezeID) k := []byte(withdraw.UnfreezeID)
v := types.Encode(&unfreeze) v := types.Encode(&unfreeze)
...@@ -147,7 +147,7 @@ func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Rece ...@@ -147,7 +147,7 @@ func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Rece
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
unfreeze.Remaining = 0 unfreeze.Remaining = 0
a.saveStateDB(&unfreeze) a.saveStateDB(&unfreeze)
receiptLog := a.getTerminateLog(&unfreeze) receiptLog := a.getUnfreezeLog(&unfreeze)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
k := []byte(terminate.UnfreezeID) k := []byte(terminate.UnfreezeID)
v := types.Encode(&unfreeze) v := types.Encode(&unfreeze)
...@@ -165,37 +165,20 @@ func key(id string) (keys []byte) { ...@@ -165,37 +165,20 @@ func key(id string) (keys []byte) {
return keys return keys
} }
func (a *action) getCreateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog { func (a *action) getUnfreezeLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptCreate{} r := &uf.ReceiptUnfreeze{}
r.UnfreezeID = unfreeze.UnfreezeID r.UnfreezeID = unfreeze.UnfreezeID
r.Initiator = unfreeze.Initiator r.Initiator = unfreeze.Initiator
log.Log = types.Encode(r)
return log
}
func (a *action) getWithdrawLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptWithdraw{}
r.WithdrawTimes = unfreeze.WithdrawTimes
r.Beneficiary = unfreeze.Beneficiary r.Beneficiary = unfreeze.Beneficiary
log.Log = types.Encode(r) r.TokenName = unfreeze.TokenName
return log
}
func (a *action) getTerminateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptTerminate{}
r.UnfreezeID = unfreeze.UnfreezeID
log.Log = types.Encode(r) log.Log = types.Encode(r)
return log return log
} }
//查询可提币状态 //查询可提币状态
func QueryWithdraw(stateDB dbm.KV, param *uf.QueryUnfreezeWithdraw) (types.Message, error) { func QueryUnfreezeWithdraw(stateDB dbm.KV, param *uf.QueryUnfreezeWithdraw) (types.Message, error) {
//查询提币次数 //查询提币次数
//计算当前可否提币 //计算当前可否提币
unfreezeID := param.UnfreezeID unfreezeID := param.UnfreezeID
......
...@@ -6,9 +6,24 @@ import ( ...@@ -6,9 +6,24 @@ import (
) )
func (u *Unfreeze) execDelLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) { func (u *Unfreeze) execDelLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
if receiptData.GetTy() != types.ExecOk {
return dbSet, nil
}
for _, log := range receiptData.Logs {
switch log.Ty {
case uf.TyLogCreateUnfreeze, uf.TyLogWithdrawUnfreeze, uf.TyLogTerminateUnfreeze:
var receipt uf.ReceiptUnfreeze
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := u.rollbackUnfreezeCreate(&receipt)
dbSet.KV = append(dbSet.KV, kv...)
default:
return nil, types.ErrNotSupport
}
}
return dbSet, nil return dbSet, nil
} }
......
...@@ -6,9 +6,24 @@ import ( ...@@ -6,9 +6,24 @@ import (
) )
func (u *Unfreeze) execLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) { func (u *Unfreeze) execLocal(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
if receiptData.GetTy() != types.ExecOk {
return dbSet, nil
}
for _, log := range receiptData.Logs {
switch log.Ty {
case uf.TyLogCreateUnfreeze, uf.TyLogWithdrawUnfreeze, uf.TyLogTerminateUnfreeze:
var receipt uf.ReceiptUnfreeze
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := u.saveUnfreezeCreate(&receipt)
dbSet.KV = append(dbSet.KV, kv...)
default:
return nil, types.ErrNotSupport
}
}
return dbSet, nil return dbSet, nil
} }
......
...@@ -5,6 +5,6 @@ import ( ...@@ -5,6 +5,6 @@ import (
"gitlab.33.cn/chain33/chain33/types" "gitlab.33.cn/chain33/chain33/types"
) )
func (u *Unfreeze) Query_QueryWithdraw(in *uf.QueryUnfreezeWithdraw) (types.Message, error) { func (u *Unfreeze) Query_QueryUnfreezeWithdraw(in *uf.QueryUnfreezeWithdraw) (types.Message, error) {
return QueryWithdraw(u.GetStateDB(), in) return QueryUnfreezeWithdraw(u.GetStateDB(), in)
} }
package executor package executor
import ( import (
"fmt"
log "github.com/inconshreveable/log15" log "github.com/inconshreveable/log15"
uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types" uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
drivers "gitlab.33.cn/chain33/chain33/system/dapp" drivers "gitlab.33.cn/chain33/chain33/system/dapp"
...@@ -38,3 +40,19 @@ func GetName() string { ...@@ -38,3 +40,19 @@ func GetName() string {
func (u *Unfreeze) GetDriverName() string { func (u *Unfreeze) GetDriverName() string {
return driverName return driverName
} }
func (u *Unfreeze) saveUnfreezeCreate(res *uf.ReceiptUnfreeze) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = []byte(fmt.Sprintf("mavl-unfreeze-"+"%s-"+"%s-"+"%s", res.Initiator, res.Beneficiary, res.TokenName))
kv.Value = []byte(res.UnfreezeID)
kvs = append(kvs, kv)
return kvs
}
func (u *Unfreeze) rollbackUnfreezeCreate(res *uf.ReceiptUnfreeze) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = []byte(fmt.Sprintf("mavl-unfreeze-"+"%s-"+"%s-"+"%s", res.Initiator, res.Beneficiary, res.TokenName))
kv.Value = []byte(res.UnfreezeID)
kvs = append(kvs, kv)
return kvs
}
...@@ -57,18 +57,11 @@ message UnfreezeTerminate { ...@@ -57,18 +57,11 @@ message UnfreezeTerminate {
} }
// receipt // receipt
message ReceiptCreate { message ReceiptUnfreeze {
string unfreezeID = 1; string unfreezeID = 1;
string initiator = 2; string initiator = 2;
} string beneficiary = 3;
string tokenName = 4;
message ReceiptWithdraw {
int32 withdrawTimes = 1;
string beneficiary = 3;
}
message ReceiptTerminate {
string unfreezeID = 1;
} }
// query // query
......
...@@ -22,12 +22,12 @@ var ( ...@@ -22,12 +22,12 @@ var (
ExecerUnfreeze = []byte(UnfreezeX) ExecerUnfreeze = []byte(UnfreezeX)
) )
//const ( const (
// Action_CreateUnfreeze = "createUnfreeze" Action_CreateUnfreeze = "createUnfreeze"
// Action_WithdrawUnfreeze = "withdrawUnfreeze" Action_WithdrawUnfreeze = "withdrawUnfreeze"
// Action_TerminateUnfreeze = "terminateUnfreeze" Action_TerminateUnfreeze = "terminateUnfreeze"
//) )
//const ( const (
// FuncName_QueryXXX = "QueryXXX" FuncName_QueryUnfreezeWithdraw = "QueryUnfreezeWithdraw"
//) )
package types package types
import ( import (
"encoding/json"
"math/rand"
"reflect" "reflect"
"time"
log "github.com/inconshreveable/log15" log "github.com/inconshreveable/log15"
"gitlab.33.cn/chain33/chain33/common/address"
"gitlab.33.cn/chain33/chain33/types" "gitlab.33.cn/chain33/chain33/types"
) )
...@@ -35,9 +39,9 @@ type UnfreezeType struct { ...@@ -35,9 +39,9 @@ type UnfreezeType struct {
func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo { func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{ return map[int64]*types.LogInfo{
TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptCreate{}), "LogCreateUnfreeze"}, TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogCreateUnfreeze"},
TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptWithdraw{}), "LogWithdrawUnfreeze"}, TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogWithdrawUnfreeze"},
TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptTerminate{}), "LogTerminateUnfreeze"}, TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogTerminateUnfreeze"},
} }
} }
...@@ -53,35 +57,107 @@ func (u *UnfreezeType) GetTypeMap() map[string]int32 { ...@@ -53,35 +57,107 @@ func (u *UnfreezeType) GetTypeMap() map[string]int32 {
} }
} }
////创建解冻相关交易 // TODO createTx接口暂时没法用,作为一个预留接口
//func (u UnfreezeType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) { func (u UnfreezeType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) {
// tlog.Debug("UnfreezeType.CreateTx", "action", action) tlog.Debug("UnfreezeType.CreateTx", "action", action)
// if action == Action_CreateUnfreeze { if action == Action_CreateUnfreeze {
// var param UnfreezeCreate var param UnfreezeCreate
// err := json.Unmarshal(message, &param) err := json.Unmarshal(message, &param)
// if err != nil { if err != nil {
// tlog.Error("CreateTx", "Error", err) tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara return nil, types.ErrInputPara
// } }
// return CreateRawGamePreCreateTx(&param) return CreateUnfreezeCreateTx(&param)
// } else if action == Action_WithdrawUnfreeze { } else if action == Action_WithdrawUnfreeze {
// var param UnfreezeWithdraw var param UnfreezeWithdraw
// err := json.Unmarshal(message, &param) err := json.Unmarshal(message, &param)
// if err != nil { if err != nil {
// tlog.Error("CreateTx", "Error", err) tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara return nil, types.ErrInputPara
// } }
// return CreateRawGamePreMatchTx(&param) return CreateUnfreezeWithdrawTx(&param)
// } else if action == Action_TerminateUnfreeze { } else if action == Action_TerminateUnfreeze {
// var param UnfreezeTerminate var param UnfreezeTerminate
// err := json.Unmarshal(message, &param) err := json.Unmarshal(message, &param)
// if err != nil { if err != nil {
// tlog.Error("CreateTx", "Error", err) tlog.Error("CreateTx", "Error", err)
// return nil, types.ErrInputPara return nil, types.ErrInputPara
// } }
// return CreateRawGamePreCancelTx(&param) return CreateUnfreezeTerminateTx(&param)
// } else { } else {
// return nil, types.ErrNotSupport return nil, types.ErrNotSupport
// } }
// return nil, nil return nil, nil
//} }
func CreateUnfreezeCreateTx(parm *UnfreezeCreate) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeCreateTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeCreate{
StartTime: parm.StartTime,
TokenName: parm.TokenName,
TotalCount: parm.TotalCount,
Beneficiary: parm.Beneficiary,
Period: parm.Period,
Means: parm.Means,
Amount: parm.Amount,
}
create := &UnfreezeAction{
Ty: UnfreezeActionCreate,
Value: &UnfreezeAction_Create{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(create),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
func CreateUnfreezeWithdrawTx(parm *UnfreezeWithdraw) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeWithdrawTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeWithdraw{
UnfreezeID: parm.UnfreezeID,
}
withdraw := &UnfreezeAction{
Ty: UnfreezeActionWithdraw,
Value: &UnfreezeAction_Withdraw{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(withdraw),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
func CreateUnfreezeTerminateTx(parm *UnfreezeTerminate) (*types.Transaction, error) {
if parm == nil {
tlog.Error("CreateUnfreezeTerminateTx", "parm", parm)
return nil, types.ErrInvalidParam
}
v := &UnfreezeTerminate{
UnfreezeID: parm.UnfreezeID,
}
terminate := &UnfreezeAction{
Ty: UnfreezeActionTerminate,
Value: &UnfreezeAction_Terminate{v},
}
tx := &types.Transaction{
Execer: []byte(getRealExecName(types.GetParaName())),
Payload: types.Encode(terminate),
Nonce: rand.New(rand.NewSource(time.Now().UnixNano())).Int63(),
To: address.ExecAddress(getRealExecName(types.GetParaName())),
}
tx.SetRealFee(types.MinFee)
return tx, nil
}
This diff is collapsed.
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