github.com/kotalco/kotal@v0.3.0/clients/ethereum/parity_genesis.go (about)

     1  package ethereum
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"math/big"
     7  
     8  	ethereumv1alpha1 "github.com/kotalco/kotal/apis/ethereum/v1alpha1"
     9  )
    10  
    11  type ParityGenesis struct{}
    12  
    13  // NormalizeNonce normalizes nonce to be 8 bytes (16 hex digits)
    14  func (p *ParityGenesis) NormalizeNonce(data string) string {
    15  	n := new(big.Int)
    16  	i, _ := n.SetString(data, 16)
    17  	return fmt.Sprintf("%#0.16x", i)
    18  }
    19  
    20  // Genesis returns genesis config parameter
    21  func (p *ParityGenesis) Genesis(node *ethereumv1alpha1.Node) (content string, err error) {
    22  	genesis := node.Spec.Genesis
    23  	extraData := "0x00"
    24  	var engineConfig map[string]interface{}
    25  
    26  	// clique PoA settings
    27  	if genesis.Clique != nil {
    28  		extraData = createExtraDataFromSigners(genesis.Clique.Signers)
    29  		engineConfig = map[string]interface{}{
    30  			"clique": map[string]interface{}{
    31  				"params": map[string]interface{}{
    32  					"period": genesis.Clique.BlockPeriod,
    33  					"epoch":  genesis.Clique.EpochLength,
    34  				},
    35  			},
    36  		}
    37  	}
    38  
    39  	hex := func(n uint) string {
    40  		return fmt.Sprintf("%#x", n)
    41  	}
    42  
    43  	tingerineWhistleBlock := hex(genesis.Forks.EIP150)
    44  	spuriousDragonBlock := hex(genesis.Forks.EIP155)
    45  	homesteadBlock := hex(genesis.Forks.Homestead)
    46  	byzantiumBlock := hex(genesis.Forks.Byzantium)
    47  	constantinopleBlock := hex(genesis.Forks.Constantinople)
    48  	petersburgBlock := hex(genesis.Forks.Petersburg)
    49  	istanbulBlock := hex(genesis.Forks.Istanbul)
    50  	muirGlacierBlock := hex(genesis.Forks.MuirGlacier)
    51  	berlinBlock := hex(genesis.Forks.Berlin)
    52  	londonBlock := hex(genesis.Forks.London)
    53  	arrowGlacierBlock := hex(genesis.Forks.ArrowGlacier)
    54  
    55  	// ethash PoW settings
    56  	if genesis.Ethash != nil {
    57  		params := map[string]interface{}{
    58  			"minimumDifficulty":      "0x020000",
    59  			"difficultyBoundDivisor": "0x0800",
    60  			"durationLimit":          "0x0d",
    61  			"blockReward": map[string]string{
    62  				tingerineWhistleBlock: "0x4563918244f40000",
    63  				byzantiumBlock:        "0x29a2241af62c0000",
    64  				constantinopleBlock:   "0x1bc16d674ec80000",
    65  			},
    66  			"homesteadTransition": homesteadBlock,
    67  			"eip100bTransition":   byzantiumBlock,
    68  			"difficultyBombDelays": map[string]string{
    69  				byzantiumBlock:      "0x2dc6c0",
    70  				constantinopleBlock: "0x1e8480",
    71  				muirGlacierBlock:    "0x3d0900",
    72  				londonBlock:         "0xaae60",
    73  				arrowGlacierBlock:   "0xf4240",
    74  			},
    75  		}
    76  
    77  		if genesis.Forks.DAO != nil {
    78  			params["daoHardforkTransition"] = hex(*genesis.Forks.DAO)
    79  		}
    80  
    81  		engineConfig = map[string]interface{}{
    82  			"Ethash": map[string]interface{}{
    83  				"params": params,
    84  			},
    85  		}
    86  	}
    87  
    88  	genesisConfig := map[string]interface{}{
    89  		"seal": map[string]interface{}{
    90  			"ethereum": map[string]interface{}{
    91  				"nonce":   p.NormalizeNonce(string(genesis.Nonce)[2:]),
    92  				"mixHash": genesis.MixHash,
    93  			},
    94  		},
    95  		"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    96  		"timestamp":  genesis.Timestamp,
    97  		"gasLimit":   genesis.GasLimit,
    98  		"difficulty": genesis.Difficulty,
    99  		"author":     genesis.Coinbase,
   100  		"extraData":  extraData,
   101  	}
   102  
   103  	// specify base fee per gas if london fork is activated at genesis block
   104  	// https://github.com/openethereum/openethereum/issues/440
   105  	if genesis.Forks.London == 0 {
   106  		genesisConfig["baseFeePerGas"] = "0x3B9ACA00"
   107  	}
   108  
   109  	paramsConfig := map[string]interface{}{
   110  		// other non fork parameters
   111  		"chainID":              hex(genesis.ChainID),
   112  		"accountStartNonce":    "0x00",
   113  		"gasLimitBoundDivisor": "0x0400",
   114  		"maximumExtraDataSize": "0xffff",
   115  		"minGasLimit":          "0x1388",
   116  		"networkID":            hex(node.Spec.Genesis.NetworkID),
   117  		// Tingerine Whistle
   118  		"eip150Transition": tingerineWhistleBlock,
   119  		// Spurious Dragon
   120  		"eip155Transition":      spuriousDragonBlock,
   121  		"eip160Transition":      spuriousDragonBlock,
   122  		"eip161abcTransition":   spuriousDragonBlock,
   123  		"eip161dTransition":     spuriousDragonBlock,
   124  		"maxCodeSizeTransition": spuriousDragonBlock, //eip170
   125  		"maxCodeSize":           "0x6000",
   126  		// Byzantium
   127  		"eip140Transition": byzantiumBlock,
   128  		"eip211Transition": byzantiumBlock,
   129  		"eip214Transition": byzantiumBlock,
   130  		"eip658Transition": byzantiumBlock,
   131  		// Constantinople
   132  		"eip145Transition":  constantinopleBlock,
   133  		"eip1014Transition": constantinopleBlock,
   134  		"eip1052Transition": constantinopleBlock,
   135  		"eip1283Transition": constantinopleBlock,
   136  		// PetersBurg
   137  		"eip1283DisableTransition": petersburgBlock,
   138  		// Istanbul
   139  		"eip1283ReenableTransition": istanbulBlock,
   140  		"eip1344Transition":         istanbulBlock,
   141  		"eip1706Transition":         istanbulBlock,
   142  		"eip1884Transition":         istanbulBlock,
   143  		"eip2028Transition":         istanbulBlock,
   144  		// Berlin
   145  		"eip2315Transition": berlinBlock, // Simple Subroutines for the EVM
   146  		"eip2929Transition": berlinBlock, // Gas cost increases for state access opcodes
   147  		"eip2930Transition": berlinBlock, // Access lists. Requires eips 2718 (Typed Transaction Envelope), and 2929
   148  		// London
   149  		"eip1559Transition":                  londonBlock, // Fee market
   150  		"eip3198Transition":                  londonBlock, // BASEFEE opcode
   151  		"eip3541Transition":                  londonBlock, // Reject new contracts starting with the 0xEF byte
   152  		"eip3529Transition":                  londonBlock, // Reduction in refunds
   153  		"eip1559BaseFeeMaxChangeDenominator": "0x8",
   154  		"eip1559ElasticityMultiplier":        "0x2",
   155  		"eip1559BaseFeeInitialValue":         "0x3B9ACA00",
   156  	}
   157  
   158  	alloc := genesisAccounts(true, genesis.Forks)
   159  	for _, account := range genesis.Accounts {
   160  		m := map[string]interface{}{
   161  			"balance": account.Balance,
   162  		}
   163  
   164  		if account.Code != "" {
   165  			m["code"] = account.Code
   166  		}
   167  
   168  		if account.Storage != nil {
   169  			m["storage"] = account.Storage
   170  		}
   171  
   172  		alloc[string(account.Address)] = m
   173  	}
   174  
   175  	result := map[string]interface{}{
   176  		"name":     "network",
   177  		"genesis":  genesisConfig,
   178  		"params":   paramsConfig,
   179  		"engine":   engineConfig,
   180  		"accounts": alloc,
   181  	}
   182  
   183  	data, err := json.Marshal(result)
   184  	if err != nil {
   185  		return
   186  	}
   187  
   188  	content = string(data)
   189  
   190  	return
   191  }