Commit 96aa0725 authored by Litian's avatar Litian Committed by vipwzw

add evm frozen

parent 7a083f93
...@@ -439,6 +439,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b ...@@ -439,6 +439,7 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b
case NoNeed: case NoNeed:
return true return true
case ToExec: case ToExec:
// 无论其它账户还是创建者向合约地址转账,都需要检查其当前合约账户活动余额是否充足
accFrom := mdb.CoinsAccount.LoadExecAccount(sender, recipient) accFrom := mdb.CoinsAccount.LoadExecAccount(sender, recipient)
b := accFrom.GetBalance() - value b := accFrom.GetBalance() - value
if b < 0 { if b < 0 {
...@@ -452,7 +453,6 @@ func (mdb *MemoryStateDB) CanTransfer(sender, recipient string, amount uint64) b ...@@ -452,7 +453,6 @@ 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(addr string, value int64) bool {
var err error var err error
defer func() { defer func() {
...@@ -477,8 +477,15 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool { ...@@ -477,8 +477,15 @@ func (mdb *MemoryStateDB) checkExecAccount(addr string, value int64) bool {
} }
accFrom := mdb.CoinsAccount.LoadExecAccount(contract.GetCreator(), addr) accFrom := mdb.CoinsAccount.LoadExecAccount(contract.GetCreator(), addr)
b := accFrom.GetBalance() - value var balance int64
if b < 0 { if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
// 分叉后,需要检查合约创建者在合约地址下冻结的金额是否足够
balance = accFrom.GetFrozen()
} else {
balance = accFrom.GetBalance()
}
remain := balance - value
if remain < 0 {
err = types.ErrNoBalance err = types.ErrNoBalance
return false return false
} }
...@@ -600,10 +607,9 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int ...@@ -600,10 +607,9 @@ 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 strings.Compare(sender, creator) != 0 {
// 用户向合约转账时,首先将钱转到创建者合约地址下
rs, err := mdb.CoinsAccount.ExecTransfer(sender, creator, execAddr, amount) rs, err := mdb.CoinsAccount.ExecTransfer(sender, creator, execAddr, amount)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -613,6 +619,17 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int ...@@ -613,6 +619,17 @@ func (mdb *MemoryStateDB) transfer2Contract(sender, recipient string, amount int
ret.Logs = append(ret.Logs, rs.Logs...) 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 return ret, nil
} }
...@@ -631,24 +648,30 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int ...@@ -631,24 +648,30 @@ func (mdb *MemoryStateDB) transfer2External(sender, recipient string, amount int
execAddr := sender execAddr := sender
// 第一步先从创建者的合约账户到接受者的合约账户 if types.IsDappFork(mdb.GetBlockHeight(), "evm", evmtypes.ForkEVMFrozen) {
// 如果是自己调用自己创建的合约,这一步也可以省略 if strings.Compare(creator, recipient) != 0 {
if strings.Compare(creator, recipient) != 0 { // 合约向用户地址转账时,从创建者合约地址下冻结的钱中转出到用户合约地址
ret, err = mdb.CoinsAccount.ExecTransfer(creator, 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 {
// 第一步先从创建者的合约账户到接受者的合约账户
// 如果是自己调用自己创建的合约,这一步也可以省略
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 return ret, nil
} }
......
...@@ -38,6 +38,8 @@ func init() { ...@@ -38,6 +38,8 @@ func init() {
types.RegisterDappFork(ExecutorName, ForkEVMKVHash, 1000000) types.RegisterDappFork(ExecutorName, ForkEVMKVHash, 1000000)
// EVM合约支持ABI绑定和调用 // EVM合约支持ABI绑定和调用
types.RegisterDappFork(ExecutorName, ForkEVMABI, 1250000) types.RegisterDappFork(ExecutorName, ForkEVMABI, 1250000)
// EEVM合约用户金额冻结
types.RegisterDappFork(ExecutorName, ForkEVMFrozen, 1300000)
} }
// EvmType EVM类型定义 // EvmType EVM类型定义
......
...@@ -38,6 +38,8 @@ const ( ...@@ -38,6 +38,8 @@ const (
ForkEVMKVHash = "ForkEVMKVHash" ForkEVMKVHash = "ForkEVMKVHash"
// ForkEVMABI EVM合约支持ABI绑定和调用 // ForkEVMABI EVM合约支持ABI绑定和调用
ForkEVMABI = "ForkEVMABI" ForkEVMABI = "ForkEVMABI"
// ForkEVMFrozen EVM合约用户金额冻结
ForkEVMFrozen = "ForkEVMFrozen"
) )
var ( var (
......
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