OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / tools / contracthashtool / contracthashtool.go
1 package main
2
3 import (
4         "crypto/hmac"
5         "crypto/sha256"
6         "fmt"
7         "os"
8         "strings"
9
10         "github.com/spf13/cobra"
11         cmn "github.com/tendermint/tmlibs/common"
12
13         "github.com/vapor/common"
14         "github.com/vapor/consensus"
15         "github.com/vapor/crypto"
16         "github.com/vapor/crypto/ed25519/chainkd"
17         chainjson "github.com/vapor/encoding/json"
18         "github.com/vapor/equity/pegin_contract"
19         "github.com/vapor/util"
20 )
21
22 var (
23         fedpegXPubs    string
24         fedpegXPrv     string
25         claimScriptStr string
26         mode           = uint16(0)
27 )
28
29 var runCmd = &cobra.Command{
30         Use:   "run",
31         Short: "pegin contract tool",
32         Run:   run,
33 }
34
35 func init() {
36         //runCmd.PersistentFlags().Uint64Var(&startHeight, "start_height", 0, "Start monitoring block height for transactions")
37         runCmd.PersistentFlags().StringVar(&fedpegXPubs, "fedpeg_xpubs", "", "Change federated peg to use a different xpub.Use Comma Delimiters.")
38         runCmd.PersistentFlags().StringVar(&fedpegXPrv, "xprv", "", "Generates one of the private keys corresponding to the payment contract address.")
39         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.")
40         runCmd.PersistentFlags().StringVar(&claimScriptStr, "claim_script", "", "Redemption of the script.")
41 }
42
43 func run(cmd *cobra.Command, args []string) {
44         if mode == 0 {
45                 if fedpegXPubs == "" {
46                         cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? fedpeg_xpubs is empty."))
47                 }
48                 var federationRedeemXPubs []chainkd.XPub
49                 fedpegXPubs := strings.Split(fedpegXPubs, ",")
50                 for _, xpubStr := range fedpegXPubs {
51                         var xpub chainkd.XPub
52                         xpub.UnmarshalText([]byte(xpubStr))
53                         federationRedeemXPubs = append(federationRedeemXPubs, xpub)
54                 }
55                 consensus.ActiveNetParams.FedpegXPubs = federationRedeemXPubs
56                 if claimScriptStr == "" {
57                         cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
58                 }
59                 var claimScript chainjson.HexBytes
60                 claimScript.UnmarshalText([]byte(claimScriptStr))
61                 peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
62                 if err != nil {
63                         cmn.Exit(cmn.Fmt("GetPeginContractPrograms returns an error, %v", err))
64                 }
65                 scriptHash := crypto.Sha256(peginContractPrograms)
66                 address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
67                 if err != nil {
68                         cmn.Exit(cmn.Fmt("NewPeginAddressWitnessScriptHash returns an error, %v", err))
69                 }
70                 fmt.Println("contract address:", address.EncodeAddress())
71                 fmt.Println("claim_script:", claimScriptStr)
72
73         } else if mode == 1 {
74                 if fedpegXPrv == "" {
75                         cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? xprv is empty."))
76                 }
77                 if claimScriptStr == "" {
78                         cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
79                 }
80                 var claimScript chainjson.HexBytes
81                 claimScript.UnmarshalText([]byte(claimScriptStr))
82
83                 var xprv chainkd.XPrv
84                 xprv.UnmarshalText([]byte(fedpegXPrv))
85                 xpub := xprv.XPub()
86                 // pub + scriptPubKey 生成一个随机数A
87                 var tmp [32]byte
88                 h := hmac.New(sha256.New, xpub[:])
89                 h.Write(claimScript)
90                 tweak := h.Sum(tmp[:])
91                 // pub +  A 生成一个新的公钥pub_new
92                 privateKey := xprv.Child(tweak, false)
93                 fmt.Println("New secret key: ", privateKey.String())
94                 fmt.Println("claim_script:", claimScriptStr)
95         } else {
96                 cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO?"))
97         }
98 }
99
100 func main() {
101         if _, err := runCmd.ExecuteC(); err != nil {
102                 os.Exit(util.ErrLocalExe)
103         }
104 }