Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
f9d4465d
Commit
f9d4465d
authored
Oct 19, 2018
by
任硕
Committed by
linj
Nov 26, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
unfreeze exec
parent
9b25d121
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
149 additions
and
81 deletions
+149
-81
action.go
executor/action.go
+122
-65
query.go
executor/query.go
+1
-1
unfreeze.proto
proto/unfreeze.proto
+23
-12
types.go
types/types.go
+3
-3
unfreeze.pb.go
types/unfreeze.pb.go
+0
-0
No files found.
executor/action.go
View file @
f9d4465d
...
@@ -2,8 +2,9 @@ package executor
...
@@ -2,8 +2,9 @@ package executor
import
(
import
(
"time"
"time"
"gitlab.33.cn/chain33/chain33/account"
"gitlab.33.cn/chain33/chain33/account"
"gitlab.33.cn/chain33/chain33/common"
dbm
"gitlab.33.cn/chain33/chain33/common/db"
dbm
"gitlab.33.cn/chain33/chain33/common/db"
uf
"gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
uf
"gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
"gitlab.33.cn/chain33/chain33/system/dapp"
"gitlab.33.cn/chain33/chain33/system/dapp"
...
@@ -30,21 +31,21 @@ func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action {
...
@@ -30,21 +31,21 @@ func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action {
//创建解冻交易
//创建解冻交易
func
(
a
*
action
)
UnfreezeCreate
(
create
*
uf
.
UnfreezeCreate
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
UnfreezeCreate
(
create
*
uf
.
UnfreezeCreate
)
(
*
types
.
Receipt
,
error
)
{
/*
*参数检测
*时间等
*/
if
create
.
GetStartTime
()
<=
time
.
Unix
()
//构造ID - txHash
//构造ID - txHash
var
unfreezeID
string
=
a
.
txhash
var
unfreezeID
string
=
"unfreezeID_"
+
common
.
ToHex
(
a
.
txhash
)
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
create
.
TokenName
,
a
.
db
)
receipt
,
err
:=
a
.
coinsAccount
.
TransferToExec
(
a
.
fromaddr
,
a
.
execaddr
,
create
.
TotalCount
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecFrozen
(
a
.
fromaddr
,
a
.
execaddr
,
create
.
TotalCount
)
if
err
!=
nil
{
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze create "
,
"addr"
,
a
.
fromaddr
,
"execaddr"
,
a
.
execaddr
,
"ExecFrozen amount"
,
create
.
TotalCount
)
uflog
.
Error
(
"unfreeze create "
,
"addr"
,
a
.
fromaddr
,
"execaddr"
,
a
.
execaddr
,
"ExecFrozen amount"
,
create
.
TotalCount
)
return
nil
,
err
return
nil
,
err
}
}
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
unfreeze
:=
&
uf
.
Unfreeze
{
unfreeze
:=
&
uf
.
Unfreeze
{
UnfreezeID
:
unfreezeID
,
UnfreezeID
:
unfreezeID
,
StartTime
:
create
.
StartTime
,
StartTime
:
create
.
StartTime
,
...
@@ -57,30 +58,17 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
...
@@ -57,30 +58,17 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
Amount
:
create
.
Amount
,
Amount
:
create
.
Amount
,
}
}
a
.
saveStateDB
(
unfreeze
)
a
.
saveStateDB
(
unfreeze
)
var
logs
[]
*
types
.
ReceiptLog
k
:=
[]
byte
(
unfreezeID
)
var
kv
[]
*
types
.
KeyValue
v
:=
types
.
Encode
(
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
logs
=
append
(
logs
,
receipt
.
Logs
...
)
receiptLog
:=
a
.
getCreateLog
(
unfreeze
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
receiptLog
:=
a
.
getReceiptLog
(
unfreeze
)
//TODO 修改receiptLog
logs
=
append
(
logs
,
receiptLog
)
logs
=
append
(
logs
,
receiptLog
)
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
}
//提取解冻币
//提取解冻币
func
(
a
*
action
)
UnfreezeWithdraw
(
withdraw
*
uf
.
UnfreezeWithdraw
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
UnfreezeWithdraw
(
withdraw
*
uf
.
UnfreezeWithdraw
)
(
*
types
.
Receipt
,
error
)
{
//TODO pseudocode
value
,
err
:=
a
.
db
.
Get
(
key
(
withdraw
.
UnfreezeID
))
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(收币地址)
*/
value
,
err
:=
a
.
db
.
Get
(
key
(
withdraw
.
GetUnfreezeID
()))
if
err
!=
nil
{
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
return
nil
,
err
...
@@ -91,58 +79,109 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
...
@@ -91,58 +79,109 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
/*
*检测可取款状态(时间)
*计算可取款额
*计算取款次数增加量
*/
var
amount
int64
var
withdrawTimes
int32
var
logs
[]
*
types
.
ReceiptLog
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
var
kv
[]
*
types
.
KeyValue
currentTime
:=
time
.
Now
()
.
Unix
()
expectTimes
:=
(
currentTime
+
unfreeze
.
Period
-
unfreeze
.
StartTime
)
/
unfreeze
.
Period
reaTimes
:=
expectTimes
-
int64
(
unfreeze
.
WithdrawTimes
)
if
reaTimes
<=
0
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeBeforeDue
)
return
nil
,
types
.
ErrUnfreezeBeforeDue
}
if
unfreeze
.
Remaining
<=
0
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeEmptied
)
return
nil
,
types
.
ErrUnfreezeEmptied
}
receipt
,
err
:=
a
.
coinsAccount
.
ExecTransferFrozen
(
unfreeze
.
Initiator
,
unfreeze
.
Beneficiary
,
a
.
execaddr
,
amount
)
var
available
int64
switch
unfreeze
.
Means
{
case
1
:
// 百分比
for
i
:=
int64
(
0
);
i
<
reaTimes
;
i
++
{
if
tmp
:=
unfreeze
.
Remaining
*
unfreeze
.
Amount
/
10000
;
tmp
==
0
{
available
=
unfreeze
.
Remaining
break
}
else
{
available
+=
tmp
}
}
case
2
:
// 固额
for
i
:=
int64
(
0
);
i
<
reaTimes
;
i
++
{
if
unfreeze
.
Remaining
<=
unfreeze
.
Amount
{
available
=
unfreeze
.
Remaining
break
}
available
+=
unfreeze
.
Amount
}
default
:
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeMeans
)
return
nil
,
types
.
ErrUnfreezeMeans
}
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
unfreeze
.
TokenName
,
a
.
db
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecTransferFrozen
(
unfreeze
.
Initiator
,
a
.
fromaddr
,
a
.
execaddr
,
available
)
if
err
!=
nil
{
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
uflog
.
Error
(
"unfreeze withdraw "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
logs
=
append
(
logs
,
receipt
.
Logs
...
)
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
unfreeze
.
WithdrawTimes
+=
withdrawTimes
unfreeze
.
WithdrawTimes
+=
int32
(
reaTimes
)
unfreeze
.
Remaining
-=
available
a
.
saveStateDB
(
&
unfreeze
)
a
.
saveStateDB
(
&
unfreeze
)
receiptLog
:=
a
.
getWithdrawLog
(
&
unfreeze
)
logs
=
append
(
logs
,
receiptLog
)
k
:=
[]
byte
(
withdraw
.
UnfreezeID
)
v
:=
types
.
Encode
(
&
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
}
//中止定期解冻
//中止定期解冻
func
(
a
*
action
)
UnfreezeTerminate
(
terminate
*
uf
.
UnfreezeTerminate
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
UnfreezeTerminate
(
terminate
*
uf
.
UnfreezeTerminate
)
(
*
types
.
Receipt
,
error
)
{
//TODO pseudocode
value
,
err
:=
a
.
db
.
Get
(
key
(
terminate
.
UnfreezeID
))
/*
if
err
!=
nil
{
*参数检测
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
*检测该地址是否存在对应解冻交易ID
return
nil
,
err
*/
}
var
unfreeze
uf
.
Unfreeze
/*
err
=
types
.
Decode
(
value
,
&
unfreeze
)
*从合约转币到该地址(发币地址)
if
err
!=
nil
{
*/
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
//计算合约中剩余币数
return
nil
,
err
var
remain
int64
}
//获取发币地址
if
a
.
fromaddr
!=
unfreeze
.
Initiator
{
var
senderAddr
string
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeID
)
receipt
,
err
:=
a
.
coinsAccount
.
ExecActive
(
senderAddr
,
a
.
execaddr
,
remain
)
return
nil
,
types
.
ErrUnfreezeID
}
if
unfreeze
.
Remaining
<=
0
{
uflog
.
Error
(
"unfreeze terminate "
,
"execaddr"
,
a
.
execaddr
,
"err"
,
types
.
ErrUnfreezeEmptied
)
return
nil
,
types
.
ErrUnfreezeEmptied
}
tokenAccDB
,
err
:=
account
.
NewAccountDB
(
"token"
,
unfreeze
.
TokenName
,
a
.
db
)
if
err
!=
nil
{
return
nil
,
err
}
receipt
,
err
:=
tokenAccDB
.
ExecActive
(
unfreeze
.
Initiator
,
a
.
execaddr
,
unfreeze
.
Remaining
)
if
err
!=
nil
{
if
err
!=
nil
{
uflog
.
Error
(
"unfreeze terminate "
,
"addr"
,
senderAdd
r
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
uflog
.
Error
(
"unfreeze terminate "
,
"addr"
,
unfreeze
.
Initiato
r
,
"execaddr"
,
a
.
execaddr
,
"err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
var
logs
[]
*
types
.
ReceiptLog
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
var
kv
[]
*
types
.
KeyValue
logs
=
append
(
logs
,
receipt
.
Logs
...
)
logs
=
append
(
logs
,
receipt
.
Logs
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
kv
=
append
(
kv
,
receipt
.
KV
...
)
/*修改receipt
unfreeze
.
Remaining
=
0
*修改数据库中状态
a
.
saveStateDB
(
&
unfreeze
)
*/
receiptLog
:=
a
.
getTerminateLog
(
&
unfreeze
)
logs
=
append
(
logs
,
receiptLog
)
k
:=
[]
byte
(
terminate
.
UnfreezeID
)
v
:=
types
.
Encode
(
&
unfreeze
)
kv
=
append
(
kv
,
&
types
.
KeyValue
{
k
,
v
})
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
return
&
types
.
Receipt
{
types
.
ExecOk
,
kv
,
logs
},
nil
}
}
...
@@ -156,19 +195,37 @@ func key(id string) (keys []byte) {
...
@@ -156,19 +195,37 @@ func key(id string) (keys []byte) {
return
keys
return
keys
}
}
func
(
a
*
action
)
getReceiptLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
func
(
a
*
action
)
getCreateLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
//TODO 判断不同类型receipt
log
:=
&
types
.
ReceiptLog
{}
log
.
Ty
=
uf
.
TyLogCreateUnfreeze
r
:=
&
uf
.
ReceiptCreate
{}
r
.
UnfreezeID
=
unfreeze
.
UnfreezeID
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
log
.
Log
=
types
.
Encode
(
r
)
return
log
}
func
(
a
*
action
)
getTerminateLog
(
unfreeze
*
uf
.
Unfreeze
)
*
types
.
ReceiptLog
{
log
:=
&
types
.
ReceiptLog
{}
log
:=
&
types
.
ReceiptLog
{}
r
:=
&
uf
.
ReceiptUnfreeze
{}
log
.
Ty
=
uf
.
TyLogCreateUnfreeze
r
.
TokenName
=
unfreeze
.
TokenName
r
:=
&
uf
.
ReceiptTerminate
{}
r
.
CreateAddr
=
unfreeze
.
Initiator
r
.
UnfreezeID
=
unfreeze
.
UnfreezeID
r
.
ReceiveAddr
=
unfreeze
.
Beneficiary
log
.
Log
=
types
.
Encode
(
r
)
log
.
Log
=
types
.
Encode
(
r
)
return
log
return
log
}
}
//查询可提币状态
//查询可提币状态
func
QueryWithdraw
(
stateDB
dbm
.
KV
,
param
*
uf
.
QueryWithdraw
)
(
types
.
Message
,
error
)
{
func
QueryWithdraw
(
stateDB
dbm
.
KV
,
param
*
uf
.
QueryWithdraw
Status
)
(
types
.
Message
,
error
)
{
//查询提币次数
//查询提币次数
//计算当前可否提币
//计算当前可否提币
return
&
types
.
Reply
{},
nil
return
&
types
.
Reply
{},
nil
...
...
executor/query.go
View file @
f9d4465d
...
@@ -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
.
QueryWithdraw
)
(
types
.
Message
,
error
)
{
func
(
u
*
Unfreeze
)
Query_QueryWithdraw
(
in
*
uf
.
QueryWithdraw
Status
)
(
types
.
Message
,
error
)
{
return
QueryWithdraw
(
u
.
GetStateDB
(),
in
)
return
QueryWithdraw
(
u
.
GetStateDB
(),
in
)
}
}
proto/unfreeze.proto
View file @
f9d4465d
...
@@ -23,6 +23,8 @@ message Unfreeze {
...
@@ -23,6 +23,8 @@ message Unfreeze {
int64
amount
=
9
;
int64
amount
=
9
;
//已解冻次数
//已解冻次数
int32
withdrawTimes
=
10
;
int32
withdrawTimes
=
10
;
//解冻剩余币数
int64
remaining
=
11
;
}
}
// message for execs.unfreeze
// message for execs.unfreeze
...
@@ -32,18 +34,18 @@ message UnfreezeAction {
...
@@ -32,18 +34,18 @@ message UnfreezeAction {
UnfreezeWithdraw
withdraw
=
2
;
UnfreezeWithdraw
withdraw
=
2
;
UnfreezeTerminate
terminate
=
3
;
UnfreezeTerminate
terminate
=
3
;
}
}
int32
ty
=
10
;
int32
ty
=
4
;
}
}
// action
message
UnfreezeCreate
{
message
UnfreezeCreate
{
int64
startTime
=
1
;
int64
startTime
=
1
;
string
tokenName
=
2
;
string
tokenName
=
2
;
int64
totalCount
=
3
;
int64
totalCount
=
3
;
string
initiator
=
4
;
string
beneficiary
=
4
;
string
beneficiary
=
5
;
int64
period
=
5
;
int64
period
=
6
;
int32
means
=
6
;
int32
means
=
7
;
int64
amount
=
7
;
int64
amount
=
8
;
}
}
message
UnfreezeWithdraw
{
message
UnfreezeWithdraw
{
...
@@ -54,13 +56,22 @@ message UnfreezeTerminate {
...
@@ -54,13 +56,22 @@ message UnfreezeTerminate {
string
unfreezeID
=
1
;
string
unfreezeID
=
1
;
}
}
//TODO: 更多receipt类型
// receipt
message
ReceiptUnfreeze
{
message
ReceiptCreate
{
string
tokenName
=
1
;
string
unfreezeID
=
1
;
string
createAddr
=
2
;
string
initiator
=
2
;
string
receiveAddr
=
3
;
}
message
ReceiptWithdraw
{
int32
withdrawTimes
=
1
;
string
beneficiary
=
3
;
}
message
ReceiptTerminate
{
string
unfreezeID
=
1
;
}
}
message
QueryWithdraw
{
// query
message
QueryWithdrawStatus
{
string
unfreezeID
=
1
;
string
unfreezeID
=
1
;
}
}
types/types.go
View file @
f9d4465d
...
@@ -35,9 +35,9 @@ type UnfreezeType struct {
...
@@ -35,9 +35,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
(
Receipt
Unfreez
e
{}),
"LogCreateUnfreeze"
},
TyLogCreateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Creat
e
{}),
"LogCreateUnfreeze"
},
TyLogWithdrawUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Unfreeze
{}),
"LogWithdrawUnfreeze"
},
TyLogWithdrawUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Withdraw
{}),
"LogWithdrawUnfreeze"
},
TyLogTerminateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Unfreez
e
{}),
"LogTerminateUnfreeze"
},
TyLogTerminateUnfreeze
:
{
reflect
.
TypeOf
(
Receipt
Terminat
e
{}),
"LogTerminateUnfreeze"
},
}
}
}
}
...
...
types/unfreeze.pb.go
View file @
f9d4465d
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment