Commit 2ad5fc1c authored by Litian's avatar Litian Committed by vipwzw

将evm合约接收到的金额直接存在合约自己的账户上,不和任何外部账户绑定

parent 96aa0725
...@@ -131,15 +131,19 @@ func (mdb *MemoryStateDB) GetBalance(addr string) uint64 { ...@@ -131,15 +131,19 @@ 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 {
contract := mdb.GetAccount(addr) if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
if contract == nil { ac = mdb.CoinsAccount.LoadExecAccount(addr, addr)
return 0 } else {
} contract := mdb.GetAccount(addr)
creator := contract.GetCreator() if contract == nil {
if len(creator) == 0 { return 0
return 0 }
creator := contract.GetCreator()
if len(creator) == 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)
} }
...@@ -453,7 +457,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b ...@@ -453,7 +457,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
return false return false
} }
} }
func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool { func (mdb *MemoryStateDB) checkExecAccount(execAddr 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(addr) contract := mdb.GetAccount(execAddr)
if contract == nil { if contract == nil {
err = model.ErrAddrNotExists err = model.ErrAddrNotExists
return false return false
...@@ -476,14 +480,14 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool { ...@@ -476,14 +480,14 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
return false return false
} }
accFrom := mdb.CoinsAccount.LoadExecAccount(contract.GetCreator(), addr) var accFrom *types.Account
var balance int64
if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) { if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
// 分叉后,需要检查合约创建者在合约地址下冻结的金额是否足够 // 分叉后,需要检查合约地址下的金额是否足够
balance = accFrom.GetFrozen() accFrom = mdb.CoinsAccount.LoadExecAccount(execAddr, execAddr)
} else { } else {
balance = accFrom.GetBalance() accFrom = mdb.CoinsAccount.LoadExecAccount(creator, execAddr)
} }
balance := accFrom.GetBalance()
remain := balance - value remain := balance - value
if remain < 0 { if remain < 0 {
err = types.ErrNoBalance err = types.ErrNoBalance
...@@ -608,26 +612,27 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int ...@@ -608,26 +612,27 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
execAddr := recipient execAddr := recipient
ret = &types.Receipt{} 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) { if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
// 将钱冻结在合约创建者的合约地址下 // 用户向合约转账时,将钱转到合约地址下execAddr:execAddr
rs, err := mdb.CoinsAccount.ExecFrozen(creator, execAddr, amount) rs, err := mdb.CoinsAccount.ExecTransfer(sender, execAddr, execAddr, amount)
if err != nil { if err != nil {
return nil, err return nil, err
} }
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...)
} 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 return ret, nil
...@@ -649,18 +654,10 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int ...@@ -649,18 +654,10 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
execAddr := sender execAddr := sender
if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) { if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
if strings.Compare(creator, recipient) != 0 { // 合约向用户地址转账时,从合约地址下的钱中转出到用户合约地址
// 合约向用户地址转账时,从创建者合约地址下冻结的钱中转出到用户合约地址 ret, err = mdb.CoinsAccount.ExecTransfer(execAddr, recipient, execAddr, amount)
ret, err = mdb.CoinsAccount.ExecTransferFrozen(creator, recipient, execAddr, amount) if err != nil {
if err != nil { return nil, err
return nil, err
}
} else {
// 合约向创建者地址转账时,直接从创建者合约地址下冻结的钱中解冻
ret, err = mdb.CoinsAccount.ExecActive(creator, execAddr, amount)
if err != nil {
return nil, err
}
} }
} else { } else {
// 第一步先从创建者的合约账户到接受者的合约账户 // 第一步先从创建者的合约账户到接受者的合约账户
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment