github.com/cheng762/platon-go@v1.8.17-0.20190529111256-7deff2d7be26/cmd/ctool/core/utils.go (about) 1 package core 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "github.com/PlatONnetwork/PlatON-Go/common/hexutil" 7 "github.com/PlatONnetwork/PlatON-Go/rlp" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "strings" 12 ) 13 14 const ( 15 transfer = iota 16 deployContract 17 invokeContract 18 vote 19 permission 20 21 DefaultConfigFilePath = "/config.json" 22 ) 23 24 var ( 25 config = Config{} 26 ) 27 28 type JsonParam struct { 29 Jsonrpc string `json:"jsonrpc"` 30 Method string `json:"method"` 31 Params interface{} `json:"params"` 32 Id int `json:"id"` 33 } 34 35 type TxParams struct { 36 From string `json:"from"` 37 To string `json:"to"` 38 Gas string `json:"gas"` 39 GasPrice string `json:"gasPrice"` 40 Value string `json:"value"` 41 Data string `json:"data"` 42 } 43 44 type RawTxParams struct { 45 TxParams 46 Nonce int64 `json:"Nonce"` 47 } 48 49 type DeployParams struct { 50 From string `json:"from"` 51 Gas string `json:"gas"` 52 GasPrice string `json:"gasPrice"` 53 Data string `json:"data"` 54 } 55 56 type Config struct { 57 From string `json:"from"` 58 Gas string `json:"gas"` 59 GasPrice string `json:"gasPrice"` 60 Url string `json:"url"` 61 } 62 63 type FuncDesc struct { 64 Name string `json:"name"` 65 Inputs []struct { 66 Name string `json:"name"` 67 Type string `json:"type"` 68 } `json:"inputs"` 69 Outputs []struct { 70 Name string `json:"name"` 71 Type string `json:"type"` 72 } `json:"outputs"` 73 Constant string `json:"constant"` 74 Type string `json:"type"` 75 } 76 77 type Response struct { 78 Jsonrpc string `json:"jsonrpc"` 79 Result string `json:"result"` 80 Id int `json:"id"` 81 Error struct { 82 Code int32 `json:"code"` 83 Message string `json:"message"` 84 } `json:"error"` 85 } 86 87 type Receipt struct { 88 Jsonrpc string `json:"jsonrpc"` 89 Id int `json:"id"` 90 Result struct { 91 BlockHash string `json:"blockHash"` 92 BlockNumber string `json:"blockNumber"` 93 ContractAddress string `json:"contractAddress"` 94 CumulativeGasUsed string `json:"cumulativeGas_used"` 95 From string `json:"from"` 96 GasUsed string `json:"gasUsed"` 97 Root string `json:"root"` 98 To string `json:"to"` 99 TransactionHash string `json:"transactionHash"` 100 TransactionIndex string `json:"transactionIndex"` 101 } `json:"result"` 102 } 103 104 func parseConfigJson(configPath string) error { 105 if configPath == "" { 106 dir, _ := os.Getwd() 107 configPath = dir + DefaultConfigFilePath 108 } 109 110 if !filepath.IsAbs(configPath) { 111 configPath, _ = filepath.Abs(configPath) 112 } 113 114 bytes, err := ioutil.ReadFile(configPath) 115 if err != nil { 116 panic(fmt.Errorf("parse config file error,%s", err.Error())) 117 } 118 119 if err := json.Unmarshal(bytes, &config); err != nil { 120 panic(fmt.Errorf("parse config to json error,%s", err.Error())) 121 } 122 return nil 123 } 124 125 func parseAbiFromJson(fileName string) ([]FuncDesc, error) { 126 bytes, err := ioutil.ReadFile(fileName) 127 if err != nil { 128 return nil, fmt.Errorf("parse abi file error: %s", err.Error()) 129 } 130 var a []FuncDesc 131 if err := json.Unmarshal(bytes, &a); err != nil { 132 return nil, fmt.Errorf("parse abi to json error: %s", err.Error()) 133 } 134 return a, nil 135 } 136 137 func parseFuncFromAbi(fileName string, funcName string) (*FuncDesc, error) { 138 funcs, err := parseAbiFromJson(fileName) 139 if err != nil { 140 return nil, err 141 } 142 143 for _, value := range funcs { 144 if value.Name == funcName { 145 return &value, nil 146 } 147 } 148 return nil, fmt.Errorf("function %s not found in %s", funcName, fileName) 149 } 150 151 /** 152 Find the method called by parsing abi 153 */ 154 func GetFuncNameAndParams(f string) (string, []string) { 155 funcName := string(f[0:strings.Index(f, "(")]) 156 157 paramString := string(f[strings.Index(f, "(")+1 : strings.LastIndex(f, ")")]) 158 if paramString == "" { 159 return funcName, []string{} 160 } 161 162 params := strings.Split(paramString, ",") 163 for index, param := range params { 164 if strings.HasPrefix(param, "\"") { 165 params[index] = param[strings.Index(param, "\"")+1 : strings.LastIndex(param, "\"")] 166 } 167 } 168 return funcName, params 169 170 } 171 172 /** 173 Self-test method for encrypting parameters 174 */ 175 func encodeParam(abiPath string, funcName string, funcParams string) error { 176 // Determine if the method exists 177 abiFunc, err := parseFuncFromAbi(abiPath, funcName) 178 if err != nil { 179 return err 180 } 181 182 // Parsing the method of the call 183 funcName, inputParams := GetFuncNameAndParams(funcParams) 184 185 // Determine if the parameters are correct 186 if len(abiFunc.Inputs) != len(inputParams) { 187 return fmt.Errorf("incorrect number of parameters ,request=%d,get=%d\n", len(abiFunc.Inputs), len(inputParams)) 188 } 189 190 paramArr := [][]byte{ 191 Int32ToBytes(111), 192 []byte(funcName), 193 } 194 195 for i, v := range inputParams { 196 input := abiFunc.Inputs[i] 197 p, e := StringConverter(v, input.Type) 198 if e != nil { 199 return err 200 } 201 paramArr = append(paramArr, p) 202 } 203 204 paramBytes, _ := rlp.EncodeToBytes(paramArr) 205 206 fmt.Printf(hexutil.Encode(paramBytes)) 207 208 return nil 209 }