wormhole/bridge/cmd/guardiand/main.go

107 lines
2.9 KiB
Go
Raw Normal View History

package main
import (
"context"
"flag"
"fmt"
"os"
2020-08-16 08:05:58 -07:00
eth_common "github.com/ethereum/go-ethereum/common"
2020-08-16 08:05:58 -07:00
"github.com/certusone/wormhole/bridge/pkg/common"
"github.com/certusone/wormhole/bridge/pkg/ethereum"
"github.com/certusone/wormhole/bridge/pkg/supervisor"
ipfslog "github.com/ipfs/go-log/v2"
)
var (
p2pNetworkID = flag.String("network", "/wormhole/dev", "P2P network identifier")
p2pPort = flag.Uint("port", 8999, "P2P UDP listener port")
p2pBootstrap = flag.String("bootstrap", "", "P2P bootstrap peers (comma-separated)")
2020-08-16 08:05:58 -07:00
nodeKeyPath = flag.String("nodeKey", "", "Path to node key (will be generated if it doesn't exist)")
2020-08-16 08:05:58 -07:00
ethRPC = flag.String("ethRPC", "", "Ethereum RPC URL")
ethContract = flag.String("ethContract", "", "Ethereum bridge contract address")
ethConfirmations = flag.Uint64("ethConfirmations", 15, "Ethereum confirmation count requirement")
2020-08-16 08:05:58 -07:00
logLevel = flag.String("loglevel", "info", "Logging level (debug, info, warn, error, dpanic, panic, fatal)")
)
var (
rootCtx context.Context
rootCtxCancel context.CancelFunc
)
func main() {
flag.Parse()
// Set up logging. The go-log zap wrapper that libp2p uses is compatible with our
// usage of zap in supervisor, which is nice.
lvl, err := ipfslog.LevelFromString(*logLevel)
if err != nil {
fmt.Println("Invalid log level")
os.Exit(1)
}
// FIXME: add hostname to root logger for cleaner console output in multi-node development.
// The proper way is to change the output format to include the hostname.
hostname, err := os.Hostname()
if err != nil {
panic(err)
}
// Our root logger.
logger := ipfslog.Logger(fmt.Sprintf("%s-%s", "wormhole", hostname))
// Override the default go-log config, which uses a magic environment variable.
ipfslog.SetAllLoggers(lvl)
// Mute chatty subsystems.
ipfslog.SetLogLevel("swarm2", "error") // connection errors
// Verify flags
if *nodeKeyPath == "" {
logger.Fatal("Please specify -nodeKey")
}
2020-08-16 08:05:58 -07:00
if *ethRPC == "" {
logger.Fatal("Please specify -ethRPC")
}
ethContractAddr := eth_common.HexToAddress(*ethContract)
// Node's main lifecycle context.
rootCtx, rootCtxCancel = context.WithCancel(context.Background())
defer rootCtxCancel()
2020-08-16 08:05:58 -07:00
// Ethereum lock event channel
ec := make(chan *common.ChainLock)
// Run supervisor.
supervisor.New(rootCtx, logger.Desugar(), func(ctx context.Context) error {
if err := supervisor.Run(ctx, "p2p", p2p); err != nil {
return err
}
if err := supervisor.Run(ctx, "eth",
ethereum.NewEthBridgeWatcher(*ethRPC, ethContractAddr, *ethConfirmations, ec).Run); err != nil {
2020-08-16 08:05:58 -07:00
return err
}
logger.Info("Started internal services")
supervisor.Signal(ctx, supervisor.SignalHealthy)
select {
case <-ctx.Done():
return nil
}
})
select {
case <-rootCtx.Done():
logger.Info("root context cancelled, exiting...")
// TODO: wait for things to shut down gracefully
}
}