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
96aa0725
Commit
96aa0725
authored
Dec 06, 2018
by
Litian
Committed by
vipwzw
Dec 07, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add evm frozen
parent
7a083f93
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
48 additions
and
21 deletions
+48
-21
statedb.go
plugin/dapp/evm/executor/vm/state/statedb.go
+44
-21
evm.go
plugin/dapp/evm/types/evm.go
+2
-0
types.go
plugin/dapp/evm/types/types.go
+2
-0
No files found.
plugin/dapp/evm/executor/vm/state/statedb.go
View file @
96aa0725
...
...
@@ -439,6 +439,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,7 +453,6 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
return
false
}
}
func
(
mdb
*
MemoryStateDB
)
checkExecAccount
(
addr
string
,
value
int64
)
bool
{
var
err
error
defer
func
()
{
...
...
@@ -477,8 +477,15 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
}
accFrom
:=
mdb
.
CoinsAccount
.
LoadExecAccount
(
contract
.
GetCreator
(),
addr
)
b
:=
accFrom
.
GetBalance
()
-
value
if
b
<
0
{
var
balance
int64
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
// 分叉后,需要检查合约创建者在合约地址下冻结的金额是否足够
balance
=
accFrom
.
GetFrozen
()
}
else
{
balance
=
accFrom
.
GetBalance
()
}
remain
:=
balance
-
value
if
remain
<
0
{
err
=
types
.
ErrNoBalance
return
false
}
...
...
@@ -600,10 +607,9 @@ 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
err
!=
nil
{
return
nil
,
err
...
...
@@ -613,6 +619,17 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
ret
.
Logs
=
append
(
ret
.
Logs
,
rs
.
Logs
...
)
}
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
// 将钱冻结在合约创建者的合约地址下
rs
,
err
:=
mdb
.
CoinsAccount
.
ExecFrozen
(
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 +648,30 @@ 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
err
!=
nil
{
return
nil
,
err
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
if
strings
.
Compare
(
creator
,
recipient
)
!=
0
{
// 合约向用户地址转账时,从创建者合约地址下冻结的钱中转出到用户合约地址
ret
,
err
=
mdb
.
CoinsAccount
.
ExecTransferFrozen
(
creator
,
recipient
,
execAddr
,
amount
)
if
err
!=
nil
{
return
nil
,
err
}
}
else
{
// 合约向创建者地址转账时,直接从创建者合约地址下冻结的钱中解冻
ret
,
err
=
mdb
.
CoinsAccount
.
ExecActive
(
creator
,
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 @
96aa0725
...
...
@@ -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 @
96aa0725
...
...
@@ -38,6 +38,8 @@ const (
ForkEVMKVHash
=
"ForkEVMKVHash"
// ForkEVMABI EVM合约支持ABI绑定和调用
ForkEVMABI
=
"ForkEVMABI"
// ForkEVMFrozen EVM合约用户金额冻结
ForkEVMFrozen
=
"ForkEVMFrozen"
)
var
(
...
...
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