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
991f1f38
Commit
991f1f38
authored
Dec 10, 2018
by
heyubin
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into multisig
parents
04d2dd7b
6e169f63
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
61 additions
and
22 deletions
+61
-22
ticket.go
plugin/consensus/ticket/ticket.go
+3
-3
statedb.go
plugin/dapp/evm/executor/vm/state/statedb.go
+38
-18
evm.go
plugin/dapp/evm/types/evm.go
+2
-0
types.go
plugin/dapp/evm/types/types.go
+2
-0
rpc_test.go
plugin/dapp/ticket/rpc/rpc_test.go
+3
-1
ticket.go
plugin/dapp/ticket/wallet/ticket.go
+13
-0
No files found.
plugin/consensus/ticket/ticket.go
View file @
991f1f38
...
@@ -212,12 +212,12 @@ func (client *Client) setTicket(tlist *ty.ReplyTicketList, privmap map[string]cr
...
@@ -212,12 +212,12 @@ func (client *Client) setTicket(tlist *ty.ReplyTicketList, privmap map[string]cr
func
(
client
*
Client
)
flushTicket
()
error
{
func
(
client
*
Client
)
flushTicket
()
error
{
//list accounts
//list accounts
tickets
,
privs
,
err
:=
client
.
getTickets
()
tickets
,
privs
,
err
:=
client
.
getTickets
()
if
err
==
types
.
Err
MinerNotStar
ed
{
if
err
==
types
.
Err
WalletIsLock
ed
{
tlog
.
Error
(
"flushTicket error"
,
"err"
,
"wallet
miner not start
"
)
tlog
.
Error
(
"flushTicket error"
,
"err"
,
"wallet
is locked
"
)
client
.
setTicket
(
nil
,
nil
)
client
.
setTicket
(
nil
,
nil
)
return
nil
return
nil
}
}
if
err
!=
nil
&&
err
!=
types
.
ErrMinerNotStared
{
if
err
!=
nil
{
tlog
.
Error
(
"flushTicket error"
,
"err"
,
err
)
tlog
.
Error
(
"flushTicket error"
,
"err"
,
err
)
return
err
return
err
}
}
...
...
plugin/dapp/evm/executor/vm/state/statedb.go
View file @
991f1f38
...
@@ -131,6 +131,9 @@ func (mdb *MemoryStateDB) GetBalance(addr string) uint64 {
...
@@ -131,6 +131,9 @@ func (mdb *MemoryStateDB) GetBalance(addr string) uint64 {
isExec
:=
mdb
.
Exist
(
addr
)
isExec
:=
mdb
.
Exist
(
addr
)
var
ac
*
types
.
Account
var
ac
*
types
.
Account
if
isExec
{
if
isExec
{
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
ac
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
addr
,
addr
)
}
else
{
contract
:=
mdb
.
GetAccount
(
addr
)
contract
:=
mdb
.
GetAccount
(
addr
)
if
contract
==
nil
{
if
contract
==
nil
{
return
0
return
0
...
@@ -140,6 +143,7 @@ func (mdb *MemoryStateDB) GetBalance(addr string) uint64 {
...
@@ -140,6 +143,7 @@ func (mdb *MemoryStateDB) GetBalance(addr string) uint64 {
return
0
return
0
}
}
ac
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
creator
,
addr
)
ac
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
creator
,
addr
)
}
}
else
{
}
else
{
ac
=
mdb
.
CoinsAccount
.
LoadAccount
(
addr
)
ac
=
mdb
.
CoinsAccount
.
LoadAccount
(
addr
)
}
}
...
@@ -439,6 +443,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
...
@@ -439,6 +443,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
case
NoNeed
:
case
NoNeed
:
return
true
return
true
case
ToExec
:
case
ToExec
:
// 无论其它账户还是创建者向合约地址转账,都需要检查其当前合约账户活动余额是否充足
accFrom
:=
mdb
.
CoinsAccount
.
LoadExecAccount
(
sender
,
recipient
)
accFrom
:=
mdb
.
CoinsAccount
.
LoadExecAccount
(
sender
,
recipient
)
b
:=
accFrom
.
GetBalance
()
-
value
b
:=
accFrom
.
GetBalance
()
-
value
if
b
<
0
{
if
b
<
0
{
...
@@ -452,8 +457,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
...
@@ -452,8 +457,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
return
false
return
false
}
}
}
}
func
(
mdb
*
MemoryStateDB
)
checkExecAccount
(
execAddr
string
,
value
int64
)
bool
{
func
(
mdb
*
MemoryStateDB
)
checkExecAccount
(
addr
string
,
value
int64
)
bool
{
var
err
error
var
err
error
defer
func
()
{
defer
func
()
{
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -465,7 +469,7 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
...
@@ -465,7 +469,7 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
err
=
types
.
ErrAmount
err
=
types
.
ErrAmount
return
false
return
false
}
}
contract
:=
mdb
.
GetAccount
(
a
ddr
)
contract
:=
mdb
.
GetAccount
(
execA
ddr
)
if
contract
==
nil
{
if
contract
==
nil
{
err
=
model
.
ErrAddrNotExists
err
=
model
.
ErrAddrNotExists
return
false
return
false
...
@@ -476,9 +480,16 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
...
@@ -476,9 +480,16 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
return
false
return
false
}
}
accFrom
:=
mdb
.
CoinsAccount
.
LoadExecAccount
(
contract
.
GetCreator
(),
addr
)
var
accFrom
*
types
.
Account
b
:=
accFrom
.
GetBalance
()
-
value
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
if
b
<
0
{
// 分叉后,需要检查合约地址下的金额是否足够
accFrom
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
execAddr
,
execAddr
)
}
else
{
accFrom
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
creator
,
execAddr
)
}
balance
:=
accFrom
.
GetBalance
()
remain
:=
balance
-
value
if
remain
<
0
{
err
=
types
.
ErrNoBalance
err
=
types
.
ErrNoBalance
return
false
return
false
}
}
...
@@ -600,10 +611,20 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
...
@@ -600,10 +611,20 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
}
}
execAddr
:=
recipient
execAddr
:=
recipient
// 从自己的合约账户到创建者的合约账户
// 有可能是外部账户调用自己创建的合约,这种情况下这一步可以省略
ret
=
&
types
.
Receipt
{}
ret
=
&
types
.
Receipt
{}
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
// 用户向合约转账时,将钱转到合约地址下execAddr:execAddr
rs
,
err
:=
mdb
.
CoinsAccount
.
ExecTransfer
(
sender
,
execAddr
,
execAddr
,
amount
)
if
err
!=
nil
{
return
nil
,
err
}
ret
.
KV
=
append
(
ret
.
KV
,
rs
.
KV
...
)
ret
.
Logs
=
append
(
ret
.
Logs
,
rs
.
Logs
...
)
}
else
{
if
strings
.
Compare
(
sender
,
creator
)
!=
0
{
if
strings
.
Compare
(
sender
,
creator
)
!=
0
{
// 用户向合约转账时,首先将钱转到创建者合约地址下
rs
,
err
:=
mdb
.
CoinsAccount
.
ExecTransfer
(
sender
,
creator
,
execAddr
,
amount
)
rs
,
err
:=
mdb
.
CoinsAccount
.
ExecTransfer
(
sender
,
creator
,
execAddr
,
amount
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -612,6 +633,7 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
...
@@ -612,6 +633,7 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
ret
.
KV
=
append
(
ret
.
KV
,
rs
.
KV
...
)
ret
.
KV
=
append
(
ret
.
KV
,
rs
.
KV
...
)
ret
.
Logs
=
append
(
ret
.
Logs
,
rs
.
Logs
...
)
ret
.
Logs
=
append
(
ret
.
Logs
,
rs
.
Logs
...
)
}
}
}
return
ret
,
nil
return
ret
,
nil
}
}
...
@@ -631,6 +653,13 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
...
@@ -631,6 +653,13 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
execAddr
:=
sender
execAddr
:=
sender
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
// 合约向用户地址转账时,从合约地址下的钱中转出到用户合约地址
ret
,
err
=
mdb
.
CoinsAccount
.
ExecTransfer
(
execAddr
,
recipient
,
execAddr
,
amount
)
if
err
!=
nil
{
return
nil
,
err
}
}
else
{
// 第一步先从创建者的合约账户到接受者的合约账户
// 第一步先从创建者的合约账户到接受者的合约账户
// 如果是自己调用自己创建的合约,这一步也可以省略
// 如果是自己调用自己创建的合约,这一步也可以省略
if
strings
.
Compare
(
creator
,
recipient
)
!=
0
{
if
strings
.
Compare
(
creator
,
recipient
)
!=
0
{
...
@@ -639,16 +668,7 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
...
@@ -639,16 +668,7 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
return
nil
,
err
return
nil
,
err
}
}
}
}
}
// 第二步再从接收者的合约账户取款到接受者账户
// 本操作不允许,需要外部操作coins账户
//rs, err := mdb.CoinsAccount.TransferWithdraw(recipient.String(), sender.String(), amount)
//if err != nil {
// return nil, err
//}
//
//ret = mdb.mergeResult(ret, rs)
return
ret
,
nil
return
ret
,
nil
}
}
...
...
plugin/dapp/evm/types/evm.go
View file @
991f1f38
...
@@ -38,6 +38,8 @@ func init() {
...
@@ -38,6 +38,8 @@ func init() {
types
.
RegisterDappFork
(
ExecutorName
,
ForkEVMKVHash
,
1000000
)
types
.
RegisterDappFork
(
ExecutorName
,
ForkEVMKVHash
,
1000000
)
// EVM合约支持ABI绑定和调用
// EVM合约支持ABI绑定和调用
types
.
RegisterDappFork
(
ExecutorName
,
ForkEVMABI
,
1250000
)
types
.
RegisterDappFork
(
ExecutorName
,
ForkEVMABI
,
1250000
)
// EEVM合约用户金额冻结
types
.
RegisterDappFork
(
ExecutorName
,
ForkEVMFrozen
,
1300000
)
}
}
// EvmType EVM类型定义
// EvmType EVM类型定义
...
...
plugin/dapp/evm/types/types.go
View file @
991f1f38
...
@@ -38,6 +38,8 @@ const (
...
@@ -38,6 +38,8 @@ const (
ForkEVMKVHash
=
"ForkEVMKVHash"
ForkEVMKVHash
=
"ForkEVMKVHash"
// ForkEVMABI EVM合约支持ABI绑定和调用
// ForkEVMABI EVM合约支持ABI绑定和调用
ForkEVMABI
=
"ForkEVMABI"
ForkEVMABI
=
"ForkEVMABI"
// ForkEVMFrozen EVM合约用户金额冻结
ForkEVMFrozen
=
"ForkEVMFrozen"
)
)
var
(
var
(
...
...
plugin/dapp/ticket/rpc/rpc_test.go
View file @
991f1f38
...
@@ -18,7 +18,7 @@ import (
...
@@ -18,7 +18,7 @@ import (
ty
"github.com/33cn/plugin/plugin/dapp/ticket/types"
ty
"github.com/33cn/plugin/plugin/dapp/ticket/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/mock"
context
"golang.org/x/net/context"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc"
)
)
...
@@ -127,6 +127,8 @@ func TestJrpc_GetTicketCount(t *testing.T) {
...
@@ -127,6 +127,8 @@ func TestJrpc_GetTicketCount(t *testing.T) {
func
TestRPC_CallTestNode
(
t
*
testing
.
T
)
{
func
TestRPC_CallTestNode
(
t
*
testing
.
T
)
{
api
:=
new
(
mocks
.
QueueProtocolAPI
)
api
:=
new
(
mocks
.
QueueProtocolAPI
)
cfg
,
sub
:=
testnode
.
GetDefaultConfig
()
cfg
,
sub
:=
testnode
.
GetDefaultConfig
()
// 测试环境下,默认配置的共识为solo,需要修改
cfg
.
Consensus
.
Name
=
"ticket"
mock33
:=
testnode
.
NewWithConfig
(
cfg
,
sub
,
api
)
mock33
:=
testnode
.
NewWithConfig
(
cfg
,
sub
,
api
)
defer
func
()
{
defer
func
()
{
mock33
.
Close
()
mock33
.
Close
()
...
...
plugin/dapp/ticket/wallet/ticket.go
View file @
991f1f38
...
@@ -7,6 +7,7 @@ package wallet
...
@@ -7,6 +7,7 @@ package wallet
import
(
import
(
"encoding/hex"
"encoding/hex"
"fmt"
"fmt"
"strings"
"sync"
"sync"
"sync/atomic"
"sync/atomic"
"time"
"time"
...
@@ -221,6 +222,7 @@ func (policy *ticketPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSi
...
@@ -221,6 +222,7 @@ func (policy *ticketPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSi
func
(
policy
*
ticketPolicy
)
OnWalletLocked
()
{
func
(
policy
*
ticketPolicy
)
OnWalletLocked
()
{
// 钱包锁住时,不允许挖矿
// 钱包锁住时,不允许挖矿
atomic
.
CompareAndSwapInt32
(
&
policy
.
isTicketLocked
,
0
,
1
)
atomic
.
CompareAndSwapInt32
(
&
policy
.
isTicketLocked
,
0
,
1
)
FlushTicket
(
policy
.
getAPI
())
}
}
//解锁超时处理,需要区分整个钱包的解锁或者只挖矿的解锁
//解锁超时处理,需要区分整个钱包的解锁或者只挖矿的解锁
...
@@ -768,6 +770,17 @@ func (policy *ticketPolicy) autoMining() {
...
@@ -768,6 +770,17 @@ func (policy *ticketPolicy) autoMining() {
defer
bizlog
.
Info
(
"End auto mining"
)
defer
bizlog
.
Info
(
"End auto mining"
)
operater
:=
policy
.
getWalletOperate
()
operater
:=
policy
.
getWalletOperate
()
defer
operater
.
GetWaitGroup
()
.
Done
()
defer
operater
.
GetWaitGroup
()
.
Done
()
// 只有ticket共识下ticket相关的操作才有效
q
:=
types
.
Conf
(
"config.consensus"
)
if
q
!=
nil
{
cons
:=
q
.
GStr
(
"name"
)
if
strings
.
Compare
(
strings
.
TrimSpace
(
cons
),
ty
.
TicketX
)
!=
0
{
bizlog
.
Info
(
"consensus is not ticket, exit mining"
)
return
}
}
lastHeight
:=
int64
(
0
)
lastHeight
:=
int64
(
0
)
miningTicketTicker
:=
policy
.
getMingTicketTicker
()
miningTicketTicker
:=
policy
.
getMingTicketTicker
()
for
{
for
{
...
...
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