OSDN Git Service

add contract hash tool
authormars <mars@bytom.io>
Tue, 8 Jan 2019 07:09:32 +0000 (15:09 +0800)
committermars <mars@bytom.io>
Tue, 8 Jan 2019 07:09:32 +0000 (15:09 +0800)
tools/contracthashtool/contracthashtool.go [new file with mode: 0644]

diff --git a/tools/contracthashtool/contracthashtool.go b/tools/contracthashtool/contracthashtool.go
new file mode 100644 (file)
index 0000000..3251962
--- /dev/null
@@ -0,0 +1,105 @@
+package main
+
+import (
+       "crypto/hmac"
+       "crypto/sha256"
+       "fmt"
+       "os"
+       "strings"
+
+       "github.com/spf13/cobra"
+       cmn "github.com/tendermint/tmlibs/common"
+
+       "github.com/vapor/common"
+       "github.com/vapor/consensus"
+       "github.com/vapor/crypto"
+       "github.com/vapor/crypto/ed25519/chainkd"
+       chainjson "github.com/vapor/encoding/json"
+       "github.com/vapor/equity/pegin_contract"
+       "github.com/vapor/util"
+)
+
+var (
+       fedpegXPubs    string
+       fedpegXPrv     string
+       claimScriptStr string
+       mode           = uint16(0)
+)
+
+var runCmd = &cobra.Command{
+       Use:   "run",
+       Short: "pegin contract tool",
+       Run:   run,
+}
+
+func init() {
+       //runCmd.PersistentFlags().Uint64Var(&startHeight, "start_height", 0, "Start monitoring block height for transactions")
+       runCmd.PersistentFlags().StringVar(&fedpegXPubs, "fedpeg_xpubs", "", "Change federated peg to use a different xpub.Use Comma Delimiters.")
+       runCmd.PersistentFlags().StringVar(&fedpegXPrv, "xprv", "", "Generates one of the private keys corresponding to the payment contract address.")
+       runCmd.PersistentFlags().Uint16Var(&mode, "mode", 0, "0: generates the contract address for the payment  1: generate the private key corresponding to the payment contract address.")
+       runCmd.PersistentFlags().StringVar(&claimScriptStr, "claim_script", "", "Redemption of the script.")
+       fmt.Println("mode", mode)
+}
+
+func run(cmd *cobra.Command, args []string) {
+       if mode == 0 {
+               if fedpegXPubs == "" {
+                       cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? fedpeg_xpubs is empty."))
+               }
+               var federationRedeemXPubs []chainkd.XPub
+               fedpegXPubs := strings.Split(fedpegXPubs, ",")
+               for _, xpubStr := range fedpegXPubs {
+                       var xpub chainkd.XPub
+                       xpub.UnmarshalText([]byte(xpubStr))
+                       federationRedeemXPubs = append(federationRedeemXPubs, xpub)
+               }
+               consensus.ActiveNetParams.FedpegXPubs = federationRedeemXPubs
+               if claimScriptStr == "" {
+                       cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
+               }
+               var claimScript chainjson.HexBytes
+               claimScript.UnmarshalText([]byte(claimScriptStr))
+               peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
+               if err != nil {
+                       cmn.Exit(cmn.Fmt("GetPeginContractPrograms returns an error, %v", err))
+               }
+               scriptHash := crypto.Sha256(peginContractPrograms)
+               address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
+               if err != nil {
+                       cmn.Exit(cmn.Fmt("NewPeginAddressWitnessScriptHash returns an error, %v", err))
+               }
+               fmt.Println("contract address:", address.EncodeAddress())
+               fmt.Println("claim_script:", claimScriptStr)
+
+       } else if mode == 1 {
+               if fedpegXPrv == "" {
+                       cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? xprv is empty."))
+               }
+               if claimScriptStr == "" {
+                       cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
+               }
+               var claimScript chainjson.HexBytes
+               claimScript.UnmarshalText([]byte(claimScriptStr))
+
+               var xprv chainkd.XPrv
+               xprv.UnmarshalText([]byte(fedpegXPrv))
+               xpub := xprv.XPub()
+               // pub + scriptPubKey 生成一个随机数A
+               var tmp [32]byte
+               h := hmac.New(sha256.New, xpub[:])
+               h.Write(claimScript)
+               tweak := h.Sum(tmp[:])
+               // pub +  A 生成一个新的公钥pub_new
+               privateKey := xprv.Child(tweak, false)
+               fmt.Println("New secret key: ", privateKey.String())
+               fmt.Println("claim_script:", claimScriptStr)
+       } else {
+               cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO?"))
+       }
+}
+
+func main() {
+       if _, err := runCmd.ExecuteC(); err != nil {
+               os.Exit(util.ErrLocalExe)
+       }
+}