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

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

parent 96aa0725
...@@ -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)
} }
...@@ -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,20 +612,20 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int ...@@ -608,20 +612,20 @@ 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 {
// 用户向合约转账时,首先将钱转到创建者合约地址下 if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
rs, err := mdb.CoinsAccount.ExecTransfer(sender, creator, execAddr, amount) // 用户向合约转账时,将钱转到合约地址下execAddr:execAddr
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 {
if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) { // 用户向合约转账时,首先将钱转到创建者合约地址下
// 将钱冻结在合约创建者的合约地址下 rs, err := mdb.CoinsAccount.ExecTransfer(sender, creator, execAddr, amount)
rs, err := mdb.CoinsAccount.ExecFrozen(creator, execAddr, amount)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -629,6 +633,7 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int ...@@ -629,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
} }
...@@ -649,20 +654,12 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int ...@@ -649,20 +654,12 @@ 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 { } else {
// 合约向创建者地址转账时,直接从创建者合约地址下冻结的钱中解冻
ret, err = mdb.CoinsAccount.ExecActive(creator, execAddr, amount)
if err != nil {
return nil, err
}
}
} else {
// 第一步先从创建者的合约账户到接受者的合约账户 // 第一步先从创建者的合约账户到接受者的合约账户
// 如果是自己调用自己创建的合约,这一步也可以省略 // 如果是自己调用自己创建的合约,这一步也可以省略
if strings.Compare(creator, recipient) != 0 { if strings.Compare(creator, recipient) != 0 {
......
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