github.com/MetalBlockchain/subnet-evm@v0.4.9/plugin/evm/static_service.go (about)

     1  // (c) 2019-2020, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package evm
     5  
     6  import (
     7  	"errors"
     8  	"net/http"
     9  
    10  	"github.com/MetalBlockchain/metalgo/utils/formatting"
    11  	"github.com/MetalBlockchain/subnet-evm/core"
    12  	"github.com/ethereum/go-ethereum/common"
    13  )
    14  
    15  var (
    16  	errNoGenesisData  = errors.New("no genesis data provided")
    17  	errNoConfig       = errors.New("no config provided in genesis")
    18  	errNoChainID      = errors.New("no chain ID provided in genesis config")
    19  	errInvalidChainID = errors.New("chainID must be greater than 0")
    20  	errNoAlloc        = errors.New("no alloc table provided in genesis")
    21  )
    22  
    23  // StaticService defines the static API services exposed by the evm
    24  type StaticService struct{}
    25  
    26  func CreateStaticService() *StaticService {
    27  	return &StaticService{}
    28  }
    29  
    30  // BuildGenesisArgs are arguments for BuildGenesis
    31  type BuildGenesisArgs struct {
    32  	GenesisData *core.Genesis       `json:"genesisData"`
    33  	Encoding    formatting.Encoding `json:"encoding"`
    34  }
    35  
    36  // BuildGenesisReply is the reply from BuildGenesis
    37  type BuildGenesisReply struct {
    38  	GenesisBytes string              `json:"genesisBytes"`
    39  	Encoding     formatting.Encoding `json:"encoding"`
    40  }
    41  
    42  // BuildGenesis constructs a genesis file.
    43  func (ss *StaticService) BuildGenesis(_ *http.Request, args *BuildGenesisArgs, reply *BuildGenesisReply) error {
    44  	// check for critical fields first
    45  	switch {
    46  	case args.GenesisData == nil:
    47  		return errNoGenesisData
    48  	case args.GenesisData.Config == nil:
    49  		return errNoConfig
    50  	case args.GenesisData.Config.ChainID == nil:
    51  		return errNoChainID
    52  	case args.GenesisData.Config.ChainID.Cmp(common.Big1) == -1:
    53  		return errInvalidChainID
    54  	case args.GenesisData.Alloc == nil:
    55  		return errNoAlloc
    56  	}
    57  
    58  	bytes, err := args.GenesisData.MarshalJSON()
    59  	if err != nil {
    60  		return err
    61  	}
    62  	bytesStr, err := formatting.Encode(args.Encoding, bytes)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	reply.GenesisBytes = bytesStr
    67  	reply.Encoding = args.Encoding
    68  	return nil
    69  }
    70  
    71  // DecodeGenesisArgs are arguments for DecodeGenesis
    72  type DecodeGenesisArgs struct {
    73  	GenesisBytes string              `json:"genesisBytes"`
    74  	Encoding     formatting.Encoding `json:"encoding"`
    75  }
    76  
    77  // DecodeGenesisReply is the reply from DecodeGenesis
    78  type DecodeGenesisReply struct {
    79  	Genesis  *core.Genesis       `json:"genesisData"`
    80  	Encoding formatting.Encoding `json:"encoding"`
    81  }
    82  
    83  // BuildGenesis constructs a genesis file.
    84  func (ss *StaticService) DecodeGenesis(_ *http.Request, args *DecodeGenesisArgs, reply *DecodeGenesisReply) error {
    85  	bytesStr, err := formatting.Decode(args.Encoding, args.GenesisBytes)
    86  	if err != nil {
    87  		return err
    88  	}
    89  	genesis := core.Genesis{}
    90  	if err := genesis.UnmarshalJSON(bytesStr); err != nil {
    91  		return err
    92  	}
    93  	reply.Genesis = &genesis
    94  	reply.Encoding = args.Encoding
    95  	return nil
    96  }