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
2ad5fc1c
Commit
2ad5fc1c
authored
Dec 07, 2018
by
Litian
Committed by
vipwzw
Dec 07, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
将evm合约接收到的金额直接存在合约自己的账户上,不和任何外部账户绑定
parent
96aa0725
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
36 additions
and
39 deletions
+36
-39
statedb.go
plugin/dapp/evm/executor/vm/state/statedb.go
+36
-39
No files found.
plugin/dapp/evm/executor/vm/state/statedb.go
View file @
2ad5fc1c
...
...
@@ -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
)
}
...
...
@@ -453,7 +457,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
return
false
}
}
func
(
mdb
*
MemoryStateDB
)
checkExecAccount
(
a
ddr
string
,
value
int64
)
bool
{
func
(
mdb
*
MemoryStateDB
)
checkExecAccount
(
execA
ddr
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,14 +480,14 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
return
false
}
accFrom
:=
mdb
.
CoinsAccount
.
LoadExecAccount
(
contract
.
GetCreator
(),
addr
)
var
balance
int64
var
accFrom
*
types
.
Account
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
// 分叉后,需要检查合约
创建者在合约地址下冻结
的金额是否足够
balance
=
accFrom
.
GetFrozen
(
)
// 分叉后,需要检查合约
地址下
的金额是否足够
accFrom
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
execAddr
,
execAddr
)
}
else
{
balance
=
accFrom
.
GetBalance
(
)
accFrom
=
mdb
.
CoinsAccount
.
LoadExecAccount
(
creator
,
execAddr
)
}
balance
:=
accFrom
.
GetBalance
()
remain
:=
balance
-
value
if
remain
<
0
{
err
=
types
.
ErrNoBalance
...
...
@@ -608,26 +612,27 @@ 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
}
ret
.
KV
=
append
(
ret
.
KV
,
rs
.
KV
...
)
ret
.
Logs
=
append
(
ret
.
Logs
,
rs
.
Logs
...
)
}
if
types
.
IsDappFork
(
mdb
.
GetBlockHeight
(),
"evm"
,
evmtypes
.
ForkEVMFrozen
)
{
//
将钱冻结在合约创建者的合约地址下
rs
,
err
:=
mdb
.
CoinsAccount
.
Exec
Frozen
(
creato
r
,
execAddr
,
amount
)
//
用户向合约转账时,将钱转到合约地址下execAddr:execAddr
rs
,
err
:=
mdb
.
CoinsAccount
.
Exec
Transfer
(
sender
,
execAdd
r
,
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
...
...
@@ -649,18 +654,10 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
execAddr
:=
sender
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
}
// 合约向用户地址转账时,从合约地址下的钱中转出到用户合约地址
ret
,
err
=
mdb
.
CoinsAccount
.
ExecTransfer
(
execAddr
,
recipient
,
execAddr
,
amount
)
if
err
!=
nil
{
return
nil
,
err
}
}
else
{
// 第一步先从创建者的合约账户到接受者的合约账户
...
...
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