github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/tools/gcoracle/main.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "log" 6 "net/http" 7 "os" 8 "strings" 9 10 "github.com/loomnetwork/gamechain/oracle" 11 "github.com/prometheus/client_golang/prometheus/promhttp" 12 "github.com/spf13/cobra" 13 "github.com/spf13/viper" 14 ) 15 16 var rootCmd = &cobra.Command{ 17 Use: "gcoracle", 18 Short: "Gamechain Oracle", 19 Long: `The oracle that connect plasmachain and gamechain`, 20 Example: ` gcoracle`, 21 SilenceUsage: false, 22 RunE: func(cmd *cobra.Command, args []string) error { 23 return run() 24 }, 25 } 26 27 func init() { 28 cobra.OnInitialize(initConfig) 29 30 // plasmchain 31 rootCmd.PersistentFlags().String("plasmachain-private-key", "", "Plasmachain Private Key") 32 rootCmd.PersistentFlags().String("plasmachain-chain-id", "default", "Plasmachain Chain ID") 33 rootCmd.PersistentFlags().String("plasmachain-read-uri", "http://localhost:46658/query", "Plasmachain Read URI") 34 rootCmd.PersistentFlags().String("plasmachain-write-uri", "http://localhost:46658/rpc", "Plasmachain Write URI") 35 rootCmd.PersistentFlags().String("plasmachain-event-uri", "ws://localhost:9999/queryws", "Plasmachain Events URI") 36 rootCmd.PersistentFlags().String("plasmachain-zbgcard-contract-hex-address", "0x3fc83db9ad1513c181e9a7345a28f62c0844abbb", "Plasmachain ZBGCard Contract Hex Address") 37 rootCmd.PersistentFlags().Int("plasmachain-poll-interval", 10, "Plasmachain Pool Interval in seconds") 38 rootCmd.PersistentFlags().Int("plasmachain-max-block-range", 20, "Plasmachain Max Block Range") 39 // gamechain 40 rootCmd.PersistentFlags().String("gamechain-private-key", "", "Gamechain Private Key") 41 rootCmd.PersistentFlags().String("gamechain-chain-id", "default", "Gamechain Chain ID") 42 rootCmd.PersistentFlags().String("gamechain-read-uri", "http://localhost:46658/query", "Gamechain Read URI") 43 rootCmd.PersistentFlags().String("gamechain-write-uri", "http://localhost:46658/rpc", "Gamechain Write URI") 44 rootCmd.PersistentFlags().String("gamechain-event-uri", "ws://localhost:9999/queryws", "Gamechain Events URI") 45 rootCmd.PersistentFlags().String("gamechain-contract-name", "ZombieBattleground", "Gamechain Contract Name") 46 // oracle 47 rootCmd.PersistentFlags().String("oracle-query-address", ":8888", "Oracle Query Address") 48 rootCmd.PersistentFlags().String("oracle-log-level", "debug", "Oracle Log Level") 49 rootCmd.PersistentFlags().String("oracle-log-destination", "file://oracle.log", "Oracle Log Destination") 50 rootCmd.PersistentFlags().Int("oracle-reconnect-interval", 5, "Oracle Startup Delay in second") 51 rootCmd.PersistentFlags().Int("oracle-startup-delay", 10, "Oracle Reconnect Interval in second") 52 53 viper.BindPFlag("plasmachain-private-key", rootCmd.PersistentFlags().Lookup("plasmachain-private-key")) 54 viper.BindPFlag("plasmachain-chain-id", rootCmd.PersistentFlags().Lookup("plasmachain-chain-id")) 55 viper.BindPFlag("plasmachain-read-uri", rootCmd.PersistentFlags().Lookup("plasmachain-read-uri")) 56 viper.BindPFlag("plasmachain-write-uri", rootCmd.PersistentFlags().Lookup("plasmachain-write-uri")) 57 viper.BindPFlag("plasmachain-event-uri", rootCmd.PersistentFlags().Lookup("plasmachain-event-uri")) 58 viper.BindPFlag("plasmachain-zbgcard-contract-hex-address", rootCmd.PersistentFlags().Lookup("plasmachain-zbgcard-contract-hex-address")) 59 viper.BindPFlag("plasmachain-poll-interval", rootCmd.PersistentFlags().Lookup("plasmachain-poll-interval")) 60 viper.BindPFlag("plasmachain-max-block-range", rootCmd.PersistentFlags().Lookup("plasmachain-max-block-range")) 61 62 viper.BindPFlag("gamechain-private-key", rootCmd.PersistentFlags().Lookup("gamechain-private-key")) 63 viper.BindPFlag("gamechain-chain-id", rootCmd.PersistentFlags().Lookup("gamechain-chain-id")) 64 viper.BindPFlag("gamechain-read-uri", rootCmd.PersistentFlags().Lookup("gamechain-read-uri")) 65 viper.BindPFlag("gamechain-write-uri", rootCmd.PersistentFlags().Lookup("gamechain-write-uri")) 66 viper.BindPFlag("gamechain-event-uri", rootCmd.PersistentFlags().Lookup("gamechain-event-uri")) 67 viper.BindPFlag("gamechain-contract-name", rootCmd.PersistentFlags().Lookup("gamechain-contract-name")) 68 69 viper.BindPFlag("oracle-query-address", rootCmd.PersistentFlags().Lookup("oracle-query-address")) 70 viper.BindPFlag("oracle-log-level", rootCmd.PersistentFlags().Lookup("oracle-log-level")) 71 viper.BindPFlag("oracle-log-destination", rootCmd.PersistentFlags().Lookup("oracle-log-destination")) 72 viper.BindPFlag("oracle-reconnect-interval", rootCmd.PersistentFlags().Lookup("oracle-reconnect-interval")) 73 viper.BindPFlag("oracle-startup-delay", rootCmd.PersistentFlags().Lookup("oracle-startup-delay")) 74 } 75 76 func initConfig() { 77 viper.AutomaticEnv() // read in environment variables that match 78 viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) 79 } 80 81 func main() { 82 if err := rootCmd.Execute(); err != nil { 83 os.Exit(1) 84 } 85 } 86 87 func run() error { 88 cfg := &oracle.Config{ 89 PlasmachainPrivateKey: viper.GetString("plasmachain-private-key"), 90 PlasmachainChainID: viper.GetString("plasmachain-chain-id"), 91 PlasmachainReadURI: viper.GetString("plasmachain-read-uri"), 92 PlasmachainWriteURI: viper.GetString("plasmachain-write-uri"), 93 PlasmachainEventsURI: viper.GetString("plasmachain-event-uri"), 94 PlasmachainZbgCardContractHexAddress: viper.GetString("plasmachain-zbgcard-contract-hex-address"), 95 PlasmachainPollInterval: viper.GetInt("plasmachain-poll-interval"), 96 PlasmachainMaxBlockRange: viper.GetInt("plasmachain-max-block-range"), 97 GamechainPrivateKey: viper.GetString("gamechain-private-key"), 98 GamechainChainID: viper.GetString("gamechain-chain-id"), 99 GamechainReadURI: viper.GetString("gamechain-read-uri"), 100 GamechainWriteURI: viper.GetString("gamechain-write-uri"), 101 GamechainEventsURI: viper.GetString("gamechain-event-uri"), 102 GamechainContractName: viper.GetString("gamechain-contract-name"), 103 OracleQueryAddress: viper.GetString("oracle-query-address"), 104 OracleLogLevel: viper.GetString("oracle-log-level"), 105 OracleLogDestination: viper.GetString("oracle-log-destination"), 106 OracleReconnectInterval: int32(viper.GetInt("oracle-reconnect-interval")), 107 OracleStartupDelay: int32(viper.GetInt("oracle-startup-delay")), 108 } 109 110 if cfg.PlasmachainMaxBlockRange <= 0 { 111 panic("max block height must be > 0") 112 } 113 114 orc, err := oracle.CreateOracle(cfg, "gcoracle") 115 if err != nil { 116 panic(err) 117 } 118 119 go orc.RunWithRecovery() 120 121 http.HandleFunc("/status", func(w http.ResponseWriter, req *http.Request) { 122 w.Header().Set("Content-Type", "application/json") 123 w.WriteHeader(http.StatusOK) 124 json.NewEncoder(w).Encode(orc.Status()) 125 }) 126 127 http.Handle("/metrics", promhttp.Handler()) 128 log.Fatal(http.ListenAndServe(cfg.OracleQueryAddress, nil)) 129 return nil 130 }