GoQuarkChain undo 操作实现

GoQuarkChain undo 操作实现

  1. 实现可以undo的object–实现journalEntity接口
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state\journal.go



  2. 在调用这些object的时候,会将操作对应的addr和操作前的状态放入db.journal中
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state\state_object.go

  3. Undo之前先调用Snapshot,之后需要的话再调用RevertToSnapshot
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\vm\evm.go

C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state_processor.go

  1. 调用Snapshot时记录revisionid 和 journal的高度
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state\statedb.go

  2. 调用RevertToSnapshot时通过revid找到最小的revision(=revid),再通过revision找到journalIndex(对应的操作高度),之后用这个高度进行Undo
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state\statedb.go

  3. 然后将entries中的entry从高到低调用entry的revert操作,直到Snapshot(高度)
    C:\GoWork\src\github.com\QuarkChain\goquarkchain\core\state\journal.go

Looks like it can be implemented by a overlay db in memory, which may be much easier to implement without undo code.