github.com/ethereum-optimism/optimism/l2geth@v0.0.0-20230612200230-50b04ade19e3/statedumper/dumper.go (about)

     1  package statedumper
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"sync"
     8  
     9  	"github.com/ethereum-optimism/optimism/l2geth/common"
    10  )
    11  
    12  type StateDumper interface {
    13  	WriteETH(address common.Address)
    14  	WriteMessage(sender common.Address, msg []byte)
    15  }
    16  
    17  var DefaultStateDumper StateDumper
    18  
    19  func NewStateDumper() StateDumper {
    20  	path := os.Getenv("L2GETH_STATE_DUMP_PATH")
    21  	if path == "" {
    22  		return &noopStateDumper{}
    23  	}
    24  
    25  	f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o755)
    26  	if err != nil {
    27  		panic(err)
    28  	}
    29  
    30  	return &FileStateDumper{
    31  		f:        f,
    32  		ethCache: make(map[common.Address]bool),
    33  	}
    34  }
    35  
    36  type FileStateDumper struct {
    37  	f        io.Writer
    38  	ethCache map[common.Address]bool
    39  	mtx      sync.Mutex
    40  }
    41  
    42  func (s *FileStateDumper) WriteETH(address common.Address) {
    43  	s.mtx.Lock()
    44  	defer s.mtx.Unlock()
    45  	if s.ethCache[address] {
    46  		return
    47  	}
    48  	s.ethCache[address] = true
    49  
    50  	if _, err := s.f.Write([]byte(fmt.Sprintf("ETH|%s\n", address.Hex()))); err != nil {
    51  		panic(err)
    52  	}
    53  }
    54  
    55  func (s *FileStateDumper) WriteMessage(sender common.Address, msg []byte) {
    56  	s.mtx.Lock()
    57  	defer s.mtx.Unlock()
    58  	if _, err := s.f.Write([]byte(fmt.Sprintf("MSG|%s|%x\n", sender.Hex(), msg))); err != nil {
    59  		panic(err)
    60  	}
    61  }
    62  
    63  type noopStateDumper struct {
    64  }
    65  
    66  func (n *noopStateDumper) WriteETH(address common.Address) {
    67  }
    68  
    69  func (n *noopStateDumper) WriteMessage(sender common.Address, msg []byte) {
    70  }
    71  
    72  func init() {
    73  	DefaultStateDumper = NewStateDumper()
    74  }
    75  
    76  func WriteETH(address common.Address) {
    77  	DefaultStateDumper.WriteETH(address)
    78  }
    79  
    80  func WriteMessage(sender common.Address, msg []byte) {
    81  	DefaultStateDumper.WriteMessage(sender, msg)
    82  }