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 }