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 }