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 }