github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/chain/core/state/journal.go (about)

     1  package state
     2  
     3  import (
     4  	"math/big"
     5  
     6  	"github.com/neatlab/neatio/utilities/common"
     7  )
     8  
     9  type journalEntry interface {
    10  	undo(*StateDB)
    11  }
    12  
    13  type journal []journalEntry
    14  
    15  type (
    16  	createObjectChange struct {
    17  		account *common.Address
    18  	}
    19  	resetObjectChange struct {
    20  		prev *stateObject
    21  	}
    22  	suicideChange struct {
    23  		account     *common.Address
    24  		prev        bool
    25  		prevbalance *big.Int
    26  	}
    27  
    28  	balanceChange struct {
    29  		account *common.Address
    30  		prev    *big.Int
    31  	}
    32  	depositBalanceChange struct {
    33  		account *common.Address
    34  		prev    *big.Int
    35  	}
    36  	sideChainDepositBalanceChange struct {
    37  		account *common.Address
    38  		chainId string
    39  		prev    *big.Int
    40  	}
    41  	chainBalanceChange struct {
    42  		account *common.Address
    43  		prev    *big.Int
    44  	}
    45  	delegateBalanceChange struct {
    46  		account *common.Address
    47  		prev    *big.Int
    48  	}
    49  	proxiedBalanceChange struct {
    50  		account *common.Address
    51  		prev    *big.Int
    52  	}
    53  	depositProxiedBalanceChange struct {
    54  		account *common.Address
    55  		prev    *big.Int
    56  	}
    57  	pendingRefundBalanceChange struct {
    58  		account *common.Address
    59  		prev    *big.Int
    60  	}
    61  	rewardBalanceChange struct {
    62  		account *common.Address
    63  		prev    *big.Int
    64  	}
    65  
    66  	nonceChange struct {
    67  		account *common.Address
    68  		prev    uint64
    69  	}
    70  	storageChange struct {
    71  		account       *common.Address
    72  		key, prevalue common.Hash
    73  	}
    74  	addTX1Change struct {
    75  		account *common.Address
    76  		txHash  common.Hash
    77  	}
    78  	addTX3Change struct {
    79  		account *common.Address
    80  		txHash  common.Hash
    81  	}
    82  	accountProxiedBalanceChange struct {
    83  		account  *common.Address
    84  		key      common.Address
    85  		prevalue *accountProxiedBalance
    86  	}
    87  	delegateRewardBalanceChange struct {
    88  		account  *common.Address
    89  		key      common.Address
    90  		prevalue *big.Int
    91  	}
    92  
    93  	candidateChange struct {
    94  		account *common.Address
    95  		prev    bool
    96  	}
    97  
    98  	pubkeyChange struct {
    99  		account *common.Address
   100  		prev    string
   101  	}
   102  
   103  	commissionChange struct {
   104  		account *common.Address
   105  		prev    uint8
   106  	}
   107  
   108  	bannedChange struct {
   109  		account *common.Address
   110  		prev    bool
   111  	}
   112  
   113  	blockTimeChange struct {
   114  		account *common.Address
   115  		prev    *big.Int
   116  	}
   117  
   118  	bannedTimeChange struct {
   119  		account *common.Address
   120  		prev    *big.Int
   121  	}
   122  
   123  	fAddressChange struct {
   124  		account *common.Address
   125  		prev    common.Address
   126  	}
   127  
   128  	codeChange struct {
   129  		account            *common.Address
   130  		prevcode, prevhash []byte
   131  	}
   132  
   133  	refundChange struct {
   134  		prev uint64
   135  	}
   136  	addLogChange struct {
   137  		txhash common.Hash
   138  	}
   139  	addPreimageChange struct {
   140  		hash common.Hash
   141  	}
   142  	touchChange struct {
   143  		account   *common.Address
   144  		prev      bool
   145  		prevDirty bool
   146  	}
   147  )
   148  
   149  func (ch createObjectChange) undo(s *StateDB) {
   150  	delete(s.stateObjects, *ch.account)
   151  	delete(s.stateObjectsDirty, *ch.account)
   152  }
   153  
   154  func (ch resetObjectChange) undo(s *StateDB) {
   155  	s.setStateObject(ch.prev)
   156  }
   157  
   158  func (ch suicideChange) undo(s *StateDB) {
   159  	obj := s.getStateObject(*ch.account)
   160  	if obj != nil {
   161  		obj.suicided = ch.prev
   162  		obj.setBalance(ch.prevbalance)
   163  	}
   164  }
   165  
   166  var ripemd = common.HexToAddress("0000000000000000000000000000000000000003")
   167  
   168  func (ch touchChange) undo(s *StateDB) {
   169  	if !ch.prev && *ch.account != ripemd {
   170  		s.getStateObject(*ch.account).touched = ch.prev
   171  		if !ch.prevDirty {
   172  			delete(s.stateObjectsDirty, *ch.account)
   173  		}
   174  	}
   175  }
   176  
   177  func (ch balanceChange) undo(s *StateDB) {
   178  	s.getStateObject(*ch.account).setBalance(ch.prev)
   179  }
   180  
   181  func (ch depositBalanceChange) undo(s *StateDB) {
   182  	s.getStateObject(*ch.account).setDepositBalance(ch.prev)
   183  }
   184  
   185  func (ch sideChainDepositBalanceChange) undo(s *StateDB) {
   186  	self := s.getStateObject(*ch.account)
   187  
   188  	var index = -1
   189  	for i := range self.data.SideChainDepositBalance {
   190  		if self.data.SideChainDepositBalance[i].ChainId == ch.chainId {
   191  			index = i
   192  			break
   193  		}
   194  	}
   195  	if index < 0 {
   196  		self.data.SideChainDepositBalance = append(self.data.SideChainDepositBalance, &sideChainDepositBalance{
   197  			ChainId:        ch.chainId,
   198  			DepositBalance: new(big.Int),
   199  		})
   200  		index = len(self.data.SideChainDepositBalance) - 1
   201  	}
   202  
   203  	self.setSideChainDepositBalance(index, ch.prev)
   204  }
   205  
   206  func (ch chainBalanceChange) undo(s *StateDB) {
   207  	s.getStateObject(*ch.account).setChainBalance(ch.prev)
   208  }
   209  
   210  func (ch delegateBalanceChange) undo(s *StateDB) {
   211  	s.getStateObject(*ch.account).setDelegateBalance(ch.prev)
   212  }
   213  
   214  func (ch proxiedBalanceChange) undo(s *StateDB) {
   215  	s.getStateObject(*ch.account).setProxiedBalance(ch.prev)
   216  }
   217  
   218  func (ch depositProxiedBalanceChange) undo(s *StateDB) {
   219  	s.getStateObject(*ch.account).setDepositProxiedBalance(ch.prev)
   220  }
   221  
   222  func (ch pendingRefundBalanceChange) undo(s *StateDB) {
   223  	s.getStateObject(*ch.account).setPendingRefundBalance(ch.prev)
   224  }
   225  
   226  func (ch rewardBalanceChange) undo(s *StateDB) {
   227  	s.getStateObject(*ch.account).setRewardBalance(ch.prev)
   228  }
   229  
   230  func (ch nonceChange) undo(s *StateDB) {
   231  	s.getStateObject(*ch.account).setNonce(ch.prev)
   232  }
   233  
   234  func (ch codeChange) undo(s *StateDB) {
   235  	s.getStateObject(*ch.account).setCode(common.BytesToHash(ch.prevhash), ch.prevcode)
   236  }
   237  
   238  func (ch storageChange) undo(s *StateDB) {
   239  	s.getStateObject(*ch.account).setState(ch.key, ch.prevalue)
   240  }
   241  
   242  func (ch addTX1Change) undo(s *StateDB) {
   243  	s.getStateObject(*ch.account).removeTX1(ch.txHash)
   244  }
   245  
   246  func (ch addTX3Change) undo(s *StateDB) {
   247  	s.getStateObject(*ch.account).removeTX3(ch.txHash)
   248  }
   249  
   250  func (ch accountProxiedBalanceChange) undo(s *StateDB) {
   251  	s.getStateObject(*ch.account).setAccountProxiedBalance(ch.key, ch.prevalue)
   252  }
   253  
   254  func (ch delegateRewardBalanceChange) undo(s *StateDB) {
   255  	s.getStateObject(*ch.account).setDelegateRewardBalance(ch.key, ch.prevalue)
   256  }
   257  
   258  func (ch candidateChange) undo(s *StateDB) {
   259  	s.getStateObject(*ch.account).setCandidate(ch.prev)
   260  }
   261  
   262  func (ch pubkeyChange) undo(s *StateDB) {
   263  	s.getStateObject(*ch.account).setPubkey(ch.prev)
   264  }
   265  
   266  func (ch commissionChange) undo(s *StateDB) {
   267  	s.getStateObject(*ch.account).setCommission(ch.prev)
   268  }
   269  
   270  func (ch fAddressChange) undo(s *StateDB) {
   271  	s.getStateObject(*ch.account).setAddress(ch.prev)
   272  }
   273  
   274  func (ch refundChange) undo(s *StateDB) {
   275  	s.refund = ch.prev
   276  }
   277  
   278  func (ch addLogChange) undo(s *StateDB) {
   279  	logs := s.logs[ch.txhash]
   280  	if len(logs) == 1 {
   281  		delete(s.logs, ch.txhash)
   282  	} else {
   283  		s.logs[ch.txhash] = logs[:len(logs)-1]
   284  	}
   285  	s.logSize--
   286  }
   287  
   288  func (ch addPreimageChange) undo(s *StateDB) {
   289  	delete(s.preimages, ch.hash)
   290  }