/
exec_del_local.go
54 lines (47 loc) · 1.46 KB
/
exec_del_local.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"github.com/33cn/chain33/system/crypto/secp256k1eth"
"github.com/33cn/chain33/types"
evmtypes "github.com/33cn/plugin/plugin/dapp/evm/types"
)
// ExecDelLocal 处理区块回滚
func (evm *EVMExecutor) ExecDelLocal(tx *types.Transaction, receipt *types.ReceiptData, index int) (*types.LocalDBSet, error) {
set, err := evm.DriverBase.ExecDelLocal(tx, receipt, index)
if err != nil {
return nil, err
}
defer func(lSet *types.LocalDBSet) {
if types.IsEthSignID(tx.GetSignature().GetTy()) {
nonceLocalKey := secp256k1eth.CaculCoinsEvmAccountKey(tx.From())
nonceV, err := evm.GetLocalDB().Get(nonceLocalKey)
if err == nil {
var evmNonce types.EvmAccountNonce
types.Decode(nonceV, &evmNonce)
if evmNonce.GetNonce() == tx.GetNonce()+1 {
evmNonce.Nonce--
if evmNonce.GetNonce() < 0 {
evmNonce.Nonce = 0
}
if lSet != nil {
lSet.KV = append(lSet.KV, &types.KeyValue{Key: nonceLocalKey, Value: types.Encode(&evmNonce)})
}
}
}
}
}(set)
if receipt.GetTy() != types.ExecOk {
return set, nil
}
cfg := evm.GetAPI().GetConfig()
if cfg.IsDappFork(evm.GetHeight(), "evm", evmtypes.ForkEVMState) {
kvs, err := evm.DelRollbackKV(tx, []byte(evmtypes.ExecutorName))
if err != nil {
return nil, err
}
set.KV = kvs
}
return set, err
}