|
@@ -38,6 +38,8 @@ var (
|
|
|
|
|
|
|
|
nodeKeyPath *string
|
|
nodeKeyPath *string
|
|
|
|
|
|
|
|
|
|
+ adminSocketPath *string
|
|
|
|
|
+
|
|
|
bridgeKeyPath *string
|
|
bridgeKeyPath *string
|
|
|
|
|
|
|
|
ethRPC *string
|
|
ethRPC *string
|
|
@@ -67,6 +69,8 @@ func init() {
|
|
|
|
|
|
|
|
nodeKeyPath = BridgeCmd.Flags().String("nodeKey", "", "Path to node key (will be generated if it doesn't exist)")
|
|
nodeKeyPath = BridgeCmd.Flags().String("nodeKey", "", "Path to node key (will be generated if it doesn't exist)")
|
|
|
|
|
|
|
|
|
|
+ adminSocketPath = BridgeCmd.Flags().String("adminSocket", "", "Admin gRPC service UNIX domain socket path")
|
|
|
|
|
+
|
|
|
bridgeKeyPath = BridgeCmd.Flags().String("bridgeKey", "", "Path to guardian key (required)")
|
|
bridgeKeyPath = BridgeCmd.Flags().String("bridgeKey", "", "Path to guardian key (required)")
|
|
|
|
|
|
|
|
ethRPC = BridgeCmd.Flags().String("ethRPC", "", "Ethereum RPC URL")
|
|
ethRPC = BridgeCmd.Flags().String("ethRPC", "", "Ethereum RPC URL")
|
|
@@ -133,6 +137,12 @@ func lockMemory() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// setRestrictiveUmask masks the group and world bits. This ensures that key material
|
|
|
|
|
+// and sockets we create aren't accidentally group- or world-readable.
|
|
|
|
|
+func setRestrictiveUmask() {
|
|
|
|
|
+ syscall.Umask(0077) // cannot fail
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// BridgeCmd represents the bridge command
|
|
// BridgeCmd represents the bridge command
|
|
|
var BridgeCmd = &cobra.Command{
|
|
var BridgeCmd = &cobra.Command{
|
|
|
Use: "bridge",
|
|
Use: "bridge",
|
|
@@ -146,6 +156,7 @@ func runBridge(cmd *cobra.Command, args []string) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lockMemory()
|
|
lockMemory()
|
|
|
|
|
+ setRestrictiveUmask()
|
|
|
|
|
|
|
|
// Set up logging. The go-log zap wrapper that libp2p uses is compatible with our
|
|
// Set up logging. The go-log zap wrapper that libp2p uses is compatible with our
|
|
|
// usage of zap in supervisor, which is nice.
|
|
// usage of zap in supervisor, which is nice.
|
|
@@ -196,6 +207,9 @@ func runBridge(cmd *cobra.Command, args []string) {
|
|
|
if *bridgeKeyPath == "" {
|
|
if *bridgeKeyPath == "" {
|
|
|
logger.Fatal("Please specify -bridgeKey")
|
|
logger.Fatal("Please specify -bridgeKey")
|
|
|
}
|
|
}
|
|
|
|
|
+ if *adminSocketPath == "" {
|
|
|
|
|
+ logger.Fatal("Please specify -adminSocket")
|
|
|
|
|
+ }
|
|
|
if *agentRPC == "" {
|
|
if *agentRPC == "" {
|
|
|
logger.Fatal("Please specify -agentRPC")
|
|
logger.Fatal("Please specify -agentRPC")
|
|
|
}
|
|
}
|
|
@@ -273,6 +287,9 @@ func runBridge(cmd *cobra.Command, args []string) {
|
|
|
// VAAs to submit to Solana
|
|
// VAAs to submit to Solana
|
|
|
solanaVaaC := make(chan *vaa.VAA)
|
|
solanaVaaC := make(chan *vaa.VAA)
|
|
|
|
|
|
|
|
|
|
+ // Injected VAAs (manually generated rather than created via observation)
|
|
|
|
|
+ injectC := make(chan *vaa.VAA)
|
|
|
|
|
+
|
|
|
// Load p2p private key
|
|
// Load p2p private key
|
|
|
var priv crypto.PrivKey
|
|
var priv crypto.PrivKey
|
|
|
if *unsafeDevMode {
|
|
if *unsafeDevMode {
|
|
@@ -288,6 +305,11 @@ func runBridge(cmd *cobra.Command, args []string) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ adminService, err := adminServiceRunnable(logger, *adminSocketPath, injectC)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ logger.Fatal("failed to create admin service socket", zap.Error(err))
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// Run supervisor.
|
|
// Run supervisor.
|
|
|
supervisor.New(rootCtx, logger, func(ctx context.Context) error {
|
|
supervisor.New(rootCtx, logger, func(ctx context.Context) error {
|
|
|
if err := supervisor.Run(ctx, "p2p", p2p.Run(
|
|
if err := supervisor.Run(ctx, "p2p", p2p.Run(
|
|
@@ -314,11 +336,15 @@ func runBridge(cmd *cobra.Command, args []string) {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- p := processor.NewProcessor(ctx, lockC, setC, sendC, obsvC, solanaVaaC, gk, *unsafeDevMode, *devNumGuardians, *ethRPC, *terraLCD, *terraChaidID, *terraContract, *terraFeePayer)
|
|
|
|
|
|
|
+ p := processor.NewProcessor(ctx, lockC, setC, sendC, obsvC, solanaVaaC, injectC, gk, *unsafeDevMode, *devNumGuardians, *ethRPC, *terraLCD, *terraChaidID, *terraContract, *terraFeePayer)
|
|
|
if err := supervisor.Run(ctx, "processor", p.Run); err != nil {
|
|
if err := supervisor.Run(ctx, "processor", p.Run); err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if err := supervisor.Run(ctx, "admin", adminService); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
logger.Info("Started internal services")
|
|
logger.Info("Started internal services")
|
|
|
|
|
|
|
|
select {
|
|
select {
|