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  }