diff --git a/cmd/bluefin/main.go b/cmd/bluefin/main.go index 4885c06..dd5bf13 100644 --- a/cmd/bluefin/main.go +++ b/cmd/bluefin/main.go @@ -17,13 +17,13 @@ package main import ( "flag" "fmt" + "log/slog" "os" _ "go.uber.org/automaxprocs" "github.com/blinklabs-io/bluefin/internal/config" "github.com/blinklabs-io/bluefin/internal/indexer" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/bluefin/internal/storage" "github.com/blinklabs-io/bluefin/internal/version" "github.com/blinklabs-io/bluefin/internal/wallet" @@ -31,6 +31,7 @@ import ( var cmdlineFlags struct { configFile string + debug bool } func main() { @@ -40,6 +41,12 @@ func main() { "", "path to config file to load", ) + flag.BoolVar( + &cmdlineFlags.debug, + "debug", + false, + "enable debug logging", + ) flag.Parse() // Load config @@ -49,36 +56,48 @@ func main() { os.Exit(1) } - // Configure logging - logging.Setup() - logger := logging.GetLogger() - // Sync logger on exit - defer func() { - if err := logger.Sync(); err != nil { - // We don't actually care about the error here, but we have to do something - // to appease the linter - return - } - }() + // Configure logger + logLevel := slog.LevelInfo + if cmdlineFlags.debug { + logLevel = slog.LevelDebug + } + logger := slog.New( + slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ + Level: logLevel, + }), + ) + slog.SetDefault(logger) - logger.Infof("bluefin %s started", version.GetVersionString()) + slog.Info( + fmt.Sprintf("bluefin %s started", version.GetVersionString()), + ) // Load storage if err := storage.GetStorage().Load(); err != nil { - logger.Fatalf("failed to load storage: %s", err) + slog.Error( + fmt.Sprintf("failed to load storage: %s", err), + ) + os.Exit(1) } // Setup wallet wallet.Setup() bursa := wallet.GetWallet() - logger.Infof("loaded mnemonic for address: %s", bursa.PaymentAddress) + slog.Info( + fmt.Sprintf("loaded mnemonic for address: %s", bursa.PaymentAddress), + ) // Fake Tx //tx.SendTx([]byte("foo")) // Start indexer - logger.Infof("starting indexer on %s", cfg.Network) + slog.Info( + fmt.Sprintf("starting indexer on %s", cfg.Network), + ) if err := indexer.GetIndexer().Start(); err != nil { - logger.Fatalf("failed to start indexer: %s", err) + slog.Error( + fmt.Sprintf("failed to start indexer: %s", err), + ) + os.Exit(1) } // Wait forever diff --git a/go.mod b/go.mod index 524f3bf..f967c8a 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/minio/sha256-simd v1.0.1 go.uber.org/automaxprocs v1.5.3 - go.uber.org/zap v1.27.0 golang.org/x/crypto v0.25.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -62,6 +61,7 @@ require ( github.com/x448/float16 v0.8.4 // indirect go.opencensus.io v0.22.5 // indirect go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/sys v0.22.0 // indirect diff --git a/internal/config/config.go b/internal/config/config.go index 3ab64b7..e9f6347 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -31,7 +31,6 @@ type Config struct { Submit SubmitConfig `yaml:"submit"` Wallet WalletConfig `yaml:"wallet"` Miner MinerConfig `yaml:"miner"` - Logging LoggingConfig `yaml:"logging"` Metrics MetricsConfig `yaml:"metrics"` Debug DebugConfig `yaml:"debug"` Profile string `yaml:"profile" envconfig:"PROFILE"` @@ -68,11 +67,6 @@ type MinerConfig struct { Message string `yaml:"message" envconfig:"MINER_MESSAGE"` } -type LoggingConfig struct { - Healthchecks bool `yaml:"healthchecks" envconfig:"LOGGING_HEALTHCHECKS"` - Level string `yaml:"level" envconfig:"LOGGING_LEVEL"` -} - type MetricsConfig struct { ListenAddress string `yaml:"address" envconfig:"METRICS_LISTEN_ADDRESS"` ListenPort uint `yaml:"port" envconfig:"METRICS_LISTEN_PORT"` @@ -85,10 +79,6 @@ type DebugConfig struct { // Singleton config instance with default values var globalConfig = &Config{ - Logging: LoggingConfig{ - Level: "info", - Healthchecks: false, - }, Debug: DebugConfig{ ListenAddress: "localhost", ListenPort: 0, diff --git a/internal/indexer/indexer.go b/internal/indexer/indexer.go index a6dd3ea..ce05141 100644 --- a/internal/indexer/indexer.go +++ b/internal/indexer/indexer.go @@ -17,10 +17,11 @@ package indexer import ( "encoding/hex" "fmt" + "log/slog" + "os" "time" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/bluefin/internal/miner" "github.com/blinklabs-io/bluefin/internal/storage" "github.com/blinklabs-io/bluefin/internal/wallet" @@ -59,7 +60,6 @@ var globalIndexer = &Indexer{} func (i *Indexer) Start() error { cfg := config.GetConfig() profileCfg := config.GetProfile() - logger := logging.GetLogger() bursa := wallet.GetWallet() // Load saved block data var lastBlockDataBytes cbor.RawMessage @@ -89,7 +89,7 @@ func (i *Indexer) Start() error { inputOpts := []input_chainsync.ChainSyncOptionFunc{ input_chainsync.WithBulkMode(true), input_chainsync.WithAutoReconnect(true), - input_chainsync.WithLogger(logger), + input_chainsync.WithLogger(NewAdderLogger()), input_chainsync.WithStatusUpdateFunc(i.updateStatus), input_chainsync.WithNetwork(cfg.Network), } @@ -104,10 +104,12 @@ func (i *Indexer) Start() error { return err } if cursorSlotNumber > 0 { - logger.Infof( - "found previous chainsync cursor: %d, %s", - cursorSlotNumber, - cursorBlockHash, + slog.Info( + fmt.Sprintf( + "found previous chainsync cursor: %d, %s", + cursorSlotNumber, + cursorBlockHash, + ), ) hashBytes, err := hex.DecodeString(cursorBlockHash) if err != nil { @@ -165,13 +167,19 @@ func (i *Indexer) Start() error { i.pipeline.AddOutput(output) // Start pipeline if err := i.pipeline.Start(); err != nil { - logger.Fatalf("failed to start pipeline: %s\n", err) + slog.Error( + fmt.Sprintf("failed to start pipeline: %s\n", err), + ) + os.Exit(1) } // Start error handler go func() { err, ok := <-i.pipeline.ErrorChan() if ok { - logger.Fatalf("pipeline failed: %s\n", err) + slog.Error( + fmt.Sprintf("pipeline failed: %s\n", err), + ) + os.Exit(1) } }() // Schedule periodic catch-up sync log messages @@ -191,7 +199,6 @@ func (i *Indexer) handleEvent(evt event.Event) error { } func (i *Indexer) handleEventRollback(evt event.Event) error { - logger := logging.GetLogger() store := storage.GetStorage() eventRollback := evt.Payload.(input_chainsync.RollbackEvent) store.Lock() @@ -199,12 +206,12 @@ func (i *Indexer) handleEventRollback(evt event.Event) error { if err := store.Rollback(eventRollback.SlotNumber); err != nil { return err } - logger.Info( + slog.Info( fmt.Sprintf("rolled back to %d.%s", eventRollback.SlotNumber, eventRollback.BlockHash), ) // Purge older deleted UTxOs if err := store.PurgeDeletedUtxos(eventRollback.SlotNumber - rollbackSlots); err != nil { - logger.Warn( + slog.Warn( fmt.Sprintf("failed to purge deleted UTxOs: %s", err), ) } @@ -214,7 +221,6 @@ func (i *Indexer) handleEventRollback(evt event.Event) error { func (i *Indexer) handleEventTransaction(evt event.Event) error { cfg := config.GetConfig() profileCfg := config.GetProfile() - logger := logging.GetLogger() bursa := wallet.GetWallet() store := storage.GetStorage() eventTx := evt.Payload.(input_chainsync.TransactionEvent) @@ -277,7 +283,7 @@ func (i *Indexer) handleEventTransaction(evt event.Event) error { []byte("TUNA"), ) if outputTunaCount > 0 { - logger.Info( + slog.Info( fmt.Sprintf("minted %d TUNA!", tunaMintCount), ) } @@ -289,20 +295,24 @@ func (i *Indexer) handleEventTransaction(evt event.Event) error { datum := utxo.Output.Datum() if datum != nil { if _, err := datum.Decode(); err != nil { - logger.Warnf( - "error decoding TX (%s) output datum: %s", - eventCtx.TransactionHash, - err, + slog.Warn( + fmt.Sprintf( + "error decoding TX (%s) output datum: %s", + eventCtx.TransactionHash, + err, + ), ) return err } if profileCfg.UseTunaV1 { var blockData models.TunaV1State if _, err := cbor.Decode(datum.Cbor(), &blockData); err != nil { - logger.Warnf( - "error decoding TX (%s) output datum: %s", - eventCtx.TransactionHash, - err, + slog.Warn( + fmt.Sprintf( + "error decoding TX (%s) output datum: %s", + eventCtx.TransactionHash, + err, + ), ) return err } @@ -314,23 +324,27 @@ func (i *Indexer) handleEventTransaction(evt event.Event) error { default: tmpExtra = v } - logger.Infof( - "found updated datum: block number: %d, hash: %x, leading zeros: %d, difficulty number: %d, epoch time: %d, real time now: %d, extra: %v", - blockData.BlockNumber, - blockData.CurrentHash, - blockData.LeadingZeros, - blockData.DifficultyNumber, - blockData.EpochTime, - blockData.RealTimeNow, - tmpExtra, + slog.Info( + fmt.Sprintf( + "found updated datum: block number: %d, hash: %x, leading zeros: %d, difficulty number: %d, epoch time: %d, real time now: %d, extra: %v", + blockData.BlockNumber, + blockData.CurrentHash, + blockData.LeadingZeros, + blockData.DifficultyNumber, + blockData.EpochTime, + blockData.RealTimeNow, + tmpExtra, + ), ) } else { var blockData models.TunaV2State if _, err := cbor.Decode(datum.Cbor(), &blockData); err != nil { - logger.Warnf( - "error decoding TX (%s) output datum: %s", - eventCtx.TransactionHash, - err, + slog.Warn( + fmt.Sprintf( + "error decoding TX (%s) output datum: %s", + eventCtx.TransactionHash, + err, + ), ) return err } @@ -344,15 +358,17 @@ func (i *Indexer) handleEventTransaction(evt event.Event) error { return err } trie.Unlock() - logger.Infof( - "found updated datum: block number: %d, hash: %x, leading zeros: %d, difficulty number: %d, epoch time: %d, current POSIX time: %d, merkle root = %x", - blockData.BlockNumber, - blockData.CurrentHash, - blockData.LeadingZeros, - blockData.DifficultyNumber, - blockData.EpochTime, - blockData.CurrentPosixTime, - blockData.MerkleRoot, + slog.Info( + fmt.Sprintf( + "found updated datum: block number: %d, hash: %x, leading zeros: %d, difficulty number: %d, epoch time: %d, current POSIX time: %d, merkle root = %x", + blockData.BlockNumber, + blockData.CurrentHash, + blockData.LeadingZeros, + blockData.DifficultyNumber, + blockData.EpochTime, + blockData.CurrentPosixTime, + blockData.MerkleRoot, + ), ) } @@ -369,7 +385,7 @@ func (i *Indexer) handleEventTransaction(evt event.Event) error { // Purge older deleted UTxOs if i.tipReached { if err := store.PurgeDeletedUtxos(eventCtx.SlotNumber - rollbackSlots); err != nil { - logger.Warn( + slog.Warn( fmt.Sprintf("failed to purge deleted UTxOs: %s", err), ) } @@ -387,18 +403,18 @@ func (i *Indexer) scheduleSyncStatusLog() { } func (i *Indexer) syncStatusLog() { - logger := logging.GetLogger() - logger.Infof( - "catch-up sync in progress: at %d.%s (current tip slot is %d)", - i.cursorSlot, - i.cursorHash, - i.tipSlot, + slog.Info( + fmt.Sprintf( + "catch-up sync in progress: at %d.%s (current tip slot is %d)", + i.cursorSlot, + i.cursorHash, + i.tipSlot, + ), ) i.scheduleSyncStatusLog() } func (i *Indexer) updateStatus(status input_chainsync.ChainSyncStatus) { - logger := logging.GetLogger() // Check if we've hit chain tip if !i.tipReached && status.TipReached { if i.syncLogTimer != nil { @@ -412,7 +428,9 @@ func (i *Indexer) updateStatus(status input_chainsync.ChainSyncStatus) { i.tipSlot = status.TipSlotNumber i.tipHash = status.TipBlockHash if err := storage.GetStorage().UpdateCursor(status.SlotNumber, status.BlockHash); err != nil { - logger.Errorf("failed to update cursor: %s", err) + slog.Error( + fmt.Sprintf("failed to update cursor: %s", err), + ) } } @@ -420,3 +438,43 @@ func (i *Indexer) updateStatus(status input_chainsync.ChainSyncStatus) { func GetIndexer() *Indexer { return globalIndexer } + +// TODO: remove the below once we switch adder to slog + +// AdderLogger is a wrapper type to give our logger the expected interface +type AdderLogger struct{} + +func NewAdderLogger() *AdderLogger { + return &AdderLogger{} +} + +func (a *AdderLogger) Infof(msg string, args ...any) { + slog.Info( + fmt.Sprintf(msg, args...), + ) +} + +func (a *AdderLogger) Warnf(msg string, args ...any) { + slog.Warn( + fmt.Sprintf(msg, args...), + ) +} + +func (a *AdderLogger) Debugf(msg string, args ...any) { + slog.Debug( + fmt.Sprintf(msg, args...), + ) +} + +func (a *AdderLogger) Errorf(msg string, args ...any) { + slog.Error( + fmt.Sprintf(msg, args...), + ) +} + +func (a *AdderLogger) Fatalf(msg string, args ...any) { + slog.Error( + fmt.Sprintf(msg, args...), + ) + os.Exit(1) +} diff --git a/internal/logging/logging.go b/internal/logging/logging.go deleted file mode 100644 index bcb240a..0000000 --- a/internal/logging/logging.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2023 Blink Labs Software -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package logging - -import ( - "log" - "time" - - "github.com/blinklabs-io/bluefin/internal/config" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -type Logger = zap.SugaredLogger - -var globalLogger *Logger - -func Setup() { - cfg := config.GetConfig() - // Build our custom logging config - loggerConfig := zap.NewProductionConfig() - // Change timestamp key name - loggerConfig.EncoderConfig.TimeKey = "timestamp" - // Use a human readable time format - loggerConfig.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout( - time.RFC3339, - ) - - // Set level - if cfg.Logging.Level != "" { - level, err := zapcore.ParseLevel(cfg.Logging.Level) - if err != nil { - log.Fatalf("error configuring logger: %s", err) - } - loggerConfig.Level.SetLevel(level) - } - - // Create the logger - l, err := loggerConfig.Build() - if err != nil { - log.Fatal(err) - } - - // Store the "sugared" version of the logger - globalLogger = l.Sugar() -} - -func GetLogger() *zap.SugaredLogger { - return globalLogger -} - -func GetDesugaredLogger() *zap.Logger { - return globalLogger.Desugar() -} - -func GetAccessLogger() *zap.Logger { - return globalLogger.Desugar(). - With(zap.String("type", "access")). - WithOptions(zap.WithCaller(false)) -} diff --git a/internal/miner/miner.go b/internal/miner/miner.go index 3ad1ba0..c0b3a95 100644 --- a/internal/miner/miner.go +++ b/internal/miner/miner.go @@ -17,12 +17,12 @@ package miner import ( "crypto/rand" "fmt" + "log/slog" "sync" "sync/atomic" "time" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/bluefin/internal/storage" "github.com/blinklabs-io/bluefin/internal/wallet" @@ -38,7 +38,6 @@ const ( type Miner struct { Config *config.Config - Logger *logging.Logger waitGroup *sync.WaitGroup resultChan chan Result doneChan chan any @@ -175,7 +174,6 @@ func New( ) *Miner { return &Miner{ Config: config.GetConfig(), - Logger: logging.GetLogger(), waitGroup: waitGroup, resultChan: resultChan, doneChan: doneChan, @@ -370,7 +368,7 @@ func (m *Miner) calculateHash() []byte { } stateBytes, err := m.state.MarshalCBOR() if err != nil { - logging.GetLogger().Error(err) + slog.Error(err.Error()) return nil } diff --git a/internal/miner/worker.go b/internal/miner/worker.go index b33f7fb..cc8cf06 100644 --- a/internal/miner/worker.go +++ b/internal/miner/worker.go @@ -16,12 +16,12 @@ package miner import ( "fmt" + "log/slog" "sync" "sync/atomic" "time" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/bluefin/internal/tx" ) @@ -52,7 +52,6 @@ func (m *Manager) Reset() { } func (m *Manager) Stop() { - logger := logging.GetLogger() m.stopMutex.Lock() defer m.stopMutex.Unlock() if !m.started { @@ -65,12 +64,12 @@ func (m *Manager) Stop() { m.workerWaitGroup.Wait() close(m.resultChan) m.started = false - logger.Infof("stopped workers") + slog.Info("stopped workers") // Start timer to restart miner m.restartTimer = time.AfterFunc( restartTimeout, func() { - logger.Warn( + slog.Warn( fmt.Sprintf( "restarting miner automatically after %s timeout", restartTimeout, @@ -93,13 +92,14 @@ func (m *Manager) Start(blockData any) { m.restartTimer.Stop() } cfg := config.GetConfig() - logger := logging.GetLogger() // Start hash rate log timer m.hashCounter = &atomic.Uint64{} m.scheduleHashRateLog() // Start workers m.Reset() - logger.Infof("starting %d workers", cfg.Miner.WorkerCount) + slog.Info( + fmt.Sprintf("starting %d workers", cfg.Miner.WorkerCount), + ) for i := 0; i < cfg.Miner.WorkerCount; i++ { miner := New( &(m.workerWaitGroup), @@ -121,7 +121,9 @@ func (m *Manager) Start(blockData any) { m.Stop() // Build and submit the TX if err := tx.SendTx(result.BlockData, result.Nonce); err != nil { - logger.Errorf("failed to submit TX: %s", err) + slog.Error( + fmt.Sprintf("failed to submit TX: %s", err), + ) } } }() @@ -135,7 +137,6 @@ func (m *Manager) scheduleHashRateLog() { func (m *Manager) hashRateLog() { cfg := config.GetConfig() - logger := logging.GetLogger() hashCount := m.hashCounter.Load() // Handle counter rollover if hashCount < m.hashLogLastCount { @@ -147,7 +148,9 @@ func (m *Manager) hashRateLog() { m.hashLogLastCount = hashCount secondDivisor := uint64(cfg.Miner.HashRateInterval) hashCountPerSec := hashCountDiff / secondDivisor - logger.Infof("hash rate: %d/s", hashCountPerSec) + slog.Info( + fmt.Sprintf("hash rate: %d/s", hashCountPerSec), + ) m.scheduleHashRateLog() } diff --git a/internal/storage/storage.go b/internal/storage/storage.go index ef38419..fcaf1b0 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -17,12 +17,12 @@ package storage import ( "encoding/hex" "fmt" + "log/slog" "strconv" "strings" "sync" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/gouroboros/cbor" "github.com/dgraph-io/badger/v4" @@ -305,7 +305,6 @@ func (s *Storage) GetUtxos(address string) ([][]byte, error) { } func (s *Storage) Rollback(slot uint64) error { - logger := logging.GetLogger() keyPrefix := []byte(`utxo_`) var deleteKeys [][]byte err := s.db.Update(func(txn *badger.Txn) error { @@ -334,7 +333,7 @@ func (s *Storage) Rollback(slot uint64) error { return err } if delSlot > slot { - logger.Debug( + slog.Debug( fmt.Sprintf( "deleting key %s ('deleted' slot %d) to restore deleted UTxO", keyDeleted, @@ -360,7 +359,7 @@ func (s *Storage) Rollback(slot uint64) error { return err } if addSlot > slot { - logger.Debug( + slog.Debug( fmt.Sprintf( "deleting keys %s ('added' slot %d) and %s to remove rolled-back UTxO", key, @@ -393,7 +392,6 @@ func (s *Storage) Rollback(slot uint64) error { } func (s *Storage) PurgeDeletedUtxos(beforeSlot uint64) error { - logger := logging.GetLogger() keyPrefix := []byte(`utxo_`) var deleteKeys [][]byte err := s.db.Update(func(txn *badger.Txn) error { @@ -441,12 +439,12 @@ func (s *Storage) PurgeDeletedUtxos(beforeSlot uint64) error { if err := txn.Delete([]byte(key)); err != nil { // Leave the rest for the next run if we hit the max transaction size if err == badger.ErrTxnTooBig { - logger.Debug("purge deleted UTxOs: badger transaction too large, leaving remainder until next run") + slog.Debug("purge deleted UTxOs: badger transaction too large, leaving remainder until next run") break } return err } - logger.Debug( + slog.Debug( fmt.Sprintf("purged deleted UTxO key: %s", key), ) } @@ -460,16 +458,32 @@ func GetStorage() *Storage { } // BadgerLogger is a wrapper type to give our logger the expected interface -type BadgerLogger struct { - *logging.Logger -} +type BadgerLogger struct{} func NewBadgerLogger() *BadgerLogger { - return &BadgerLogger{ - Logger: logging.GetLogger(), - } + return &BadgerLogger{} +} + +func (b *BadgerLogger) Infof(msg string, args ...any) { + slog.Info( + fmt.Sprintf(msg, args...), + ) } func (b *BadgerLogger) Warningf(msg string, args ...any) { - b.Logger.Warnf(msg, args...) + slog.Warn( + fmt.Sprintf(msg, args...), + ) +} + +func (b *BadgerLogger) Debugf(msg string, args ...any) { + slog.Debug( + fmt.Sprintf(msg, args...), + ) +} + +func (b *BadgerLogger) Errorf(msg string, args ...any) { + slog.Error( + fmt.Sprintf(msg, args...), + ) } diff --git a/internal/tx/tx.go b/internal/tx/tx.go index 0e1b3e0..cb64456 100644 --- a/internal/tx/tx.go +++ b/internal/tx/tx.go @@ -20,9 +20,11 @@ import ( "errors" "fmt" "io" + "log/slog" "math/big" "net" "net/http" + "os" "sync" "time" @@ -42,7 +44,6 @@ import ( "golang.org/x/crypto/blake2b" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "github.com/blinklabs-io/bluefin/internal/storage" "github.com/blinklabs-io/bluefin/internal/wallet" ) @@ -62,13 +63,14 @@ func SendTx(blockData any, nonce [16]byte) error { if err != nil { return err } - logging.GetLogger().Infof("successfully submitted TX %s", txId) + slog.Info( + fmt.Sprintf("successfully submitted TX %s", txId), + ) return nil } func createTx(blockData any, nonce [16]byte) ([]byte, error) { cfg := config.GetConfig() - logger := logging.GetLogger() bursa := wallet.GetWallet() store := storage.GetStorage() @@ -153,10 +155,12 @@ func createTx(blockData any, nonce [16]byte) ([]byte, error) { } // There should only ever be 1 UTxO for the script address if len(scriptUtxos) > 1 { - logger.Warnf( - "found unexpected UTxO(s) at script address (%s), expected 1 and found %d", - cfg.Indexer.ScriptAddress, - len(scriptUtxos), + slog.Warn( + fmt.Sprintf( + "found unexpected UTxO(s) at script address (%s), expected 1 and found %d", + cfg.Indexer.ScriptAddress, + len(scriptUtxos), + ), ) } if len(scriptUtxos) == 0 { @@ -388,7 +392,7 @@ func createTx(blockData any, nonce [16]byte) ([]byte, error) { if err != nil { return nil, err } - logger.Debug( + slog.Debug( fmt.Sprintf("TX bytes: %x", txBytes), ) return txBytes, nil @@ -404,7 +408,6 @@ func unixTimeToSlot(unixTime int64) uint64 { func submitTx(txRawBytes []byte) (string, error) { cfg := config.GetConfig() - logger := logging.GetLogger() if cfg.Submit.Address != "" { return submitTxNtN(txRawBytes) } else if cfg.Submit.SocketPath != "" { @@ -415,7 +418,10 @@ func submitTx(txRawBytes []byte) (string, error) { // Populate address info from indexer network network := ouroboros.NetworkByName(cfg.Network) if network == ouroboros.NetworkInvalid { - logger.Fatalf("unknown network: %s", cfg.Network) + slog.Error( + fmt.Sprintf("unknown network: %s", cfg.Network), + ) + os.Exit(1) } cfg.Submit.Address = fmt.Sprintf("%s:%d", network.PublicRootAddress, network.PublicRootPort) return submitTxNtN(txRawBytes) @@ -426,7 +432,6 @@ func submitTxNtN(txRawBytes []byte) (string, error) { ntnMutex.Lock() defer ntnMutex.Unlock() cfg := config.GetConfig() - logger := logging.GetLogger() // Record TX bytes in global for use in handler functions ntnTxBytes = txRawBytes[:] @@ -436,7 +441,9 @@ func submitTxNtN(txRawBytes []byte) (string, error) { // Unwrap raw transaction bytes into a CBOR array txUnwrap := []cbor.RawMessage{} if _, err := cbor.Decode(txRawBytes, &txUnwrap); err != nil { - logger.Errorf("failed to unwrap transaction CBOR: %s", err) + slog.Error( + fmt.Sprintf("failed to unwrap transaction CBOR: %s", err), + ) return "", fmt.Errorf("failed to unwrap transaction CBOR: %s", err) } // index 0 is the transaction body @@ -476,7 +483,9 @@ func submitTxNtN(txRawBytes []byte) (string, error) { default: } close(doneChan) - logger.Errorf("async error submitting TX via NtN: %s", err) + slog.Error( + fmt.Sprintf("async error submitting TX via NtN: %s", err), + ) } }() // Start txSubmission loop diff --git a/internal/wallet/wallet.go b/internal/wallet/wallet.go index e7b31db..59b9273 100644 --- a/internal/wallet/wallet.go +++ b/internal/wallet/wallet.go @@ -16,11 +16,12 @@ package wallet import ( "errors" + "fmt" + "log/slog" "os" "path" "github.com/blinklabs-io/bluefin/internal/config" - "github.com/blinklabs-io/bluefin/internal/logging" "golang.org/x/crypto/blake2b" "github.com/blinklabs-io/bursa" @@ -31,7 +32,6 @@ var globalWallet = &bursa.Wallet{} func Setup() { // Setup wallet cfg := config.GetConfig() - logger := logging.GetLogger() // TODO: check storage for mnemonic mnemonic := cfg.Wallet.Mnemonic if mnemonic == "" { @@ -45,7 +45,9 @@ func Setup() { ) // Read seed.txt if it exists if data, err := os.ReadFile(seedPath); err == nil { - logger.Infof("read mnemonic from %s", seedPath) + slog.Info( + fmt.Sprintf("read mnemonic from %s", seedPath), + ) mnemonic = string(data) } else if errors.Is(err, os.ErrNotExist) { mnemonic, err = bursa.NewMnemonic() @@ -59,7 +61,9 @@ func Setup() { panic(err) } l, err := f.WriteString(mnemonic) - logger.Debugf("wrote %d bytes to seed.txt", l) + slog.Debug( + fmt.Sprintf("wrote %d bytes to seed.txt", l), + ) if err != nil { f.Close() panic(err) @@ -68,7 +72,9 @@ func Setup() { if err != nil { panic(err) } - logger.Infof("wrote generated mnemonic to %s", seedPath) + slog.Info( + fmt.Sprintf("wrote generated mnemonic to %s", seedPath), + ) // TODO: write mnemonic to storage } else { panic(err)