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