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  }