github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/integration/makefakegenesis/genesis.go (about) 1 package makefakegenesis 2 3 import ( 4 "crypto/ecdsa" 5 "math/big" 6 "time" 7 8 "github.com/unicornultrafoundation/go-helios/hash" 9 "github.com/unicornultrafoundation/go-helios/native/idx" 10 "github.com/unicornultrafoundation/go-helios/native/pos" 11 utypes "github.com/unicornultrafoundation/go-helios/types" 12 "github.com/unicornultrafoundation/go-helios/u2udb/memorydb" 13 "github.com/unicornultrafoundation/go-u2u/common" 14 "github.com/unicornultrafoundation/go-u2u/core/types" 15 "github.com/unicornultrafoundation/go-u2u/crypto" 16 17 "github.com/unicornultrafoundation/go-u2u/evmcore" 18 "github.com/unicornultrafoundation/go-u2u/integration/makegenesis" 19 "github.com/unicornultrafoundation/go-u2u/native" 20 "github.com/unicornultrafoundation/go-u2u/native/drivertype" 21 "github.com/unicornultrafoundation/go-u2u/native/iblockproc" 22 "github.com/unicornultrafoundation/go-u2u/native/ier" 23 "github.com/unicornultrafoundation/go-u2u/native/validatorpk" 24 "github.com/unicornultrafoundation/go-u2u/u2u" 25 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/driver" 26 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/driver/drivercall" 27 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/driverauth" 28 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/evmwriter" 29 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/netinit" 30 netinitcall "github.com/unicornultrafoundation/go-u2u/u2u/contracts/netinit/netinitcalls" 31 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/sfc" 32 "github.com/unicornultrafoundation/go-u2u/u2u/contracts/sfclib" 33 "github.com/unicornultrafoundation/go-u2u/u2u/genesis" 34 "github.com/unicornultrafoundation/go-u2u/u2u/genesis/gpos" 35 "github.com/unicornultrafoundation/go-u2u/u2u/genesisstore" 36 ) 37 38 var ( 39 FakeGenesisTime = native.Timestamp(1608600000 * time.Second) 40 ) 41 42 // FakeKey gets n-th fake private key. 43 func FakeKey(n idx.ValidatorID) *ecdsa.PrivateKey { 44 return evmcore.FakeKey(uint32(n)) 45 } 46 47 func FakeGenesisStore(num idx.Validator, balance, stake *big.Int) *genesisstore.Store { 48 return FakeGenesisStoreWithRules(num, balance, stake, u2u.FakeNetRules()) 49 } 50 51 func FakeGenesisStoreWithRules(num idx.Validator, balance, stake *big.Int, rules u2u.Rules) *genesisstore.Store { 52 return FakeGenesisStoreWithRulesAndStart(num, balance, stake, rules, 2, 1) 53 } 54 55 func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules u2u.Rules, epoch idx.Epoch, block idx.Block) *genesisstore.Store { 56 builder := makegenesis.NewGenesisBuilder(memorydb.NewProducer("")) 57 58 validators := GetFakeValidators(num) 59 60 // add balances to validators 61 var delegations []drivercall.Delegation 62 for _, val := range validators { 63 builder.AddBalance(val.Address, balance) 64 delegations = append(delegations, drivercall.Delegation{ 65 Address: val.Address, 66 ValidatorID: val.ID, 67 Stake: stake, 68 LockedStake: new(big.Int), 69 LockupFromEpoch: 0, 70 LockupEndTime: 0, 71 LockupDuration: 0, 72 EarlyUnlockPenalty: new(big.Int), 73 Rewards: new(big.Int), 74 }) 75 } 76 77 // deploy essential contracts 78 // pre deploy NetworkInitializer 79 builder.SetCode(netinit.ContractAddress, netinit.GetContractBin()) 80 // pre deploy NodeDriver 81 builder.SetCode(driver.ContractAddress, driver.GetContractBin()) 82 // pre deploy NodeDriverAuth 83 builder.SetCode(driverauth.ContractAddress, driverauth.GetContractBin()) 84 // pre deploy SFC 85 builder.SetCode(sfc.ContractAddress, sfc.GetContractBin()) 86 // pre deploy SFCLib 87 builder.SetCode(sfclib.ContractAddress, sfclib.GetContractBin()) 88 // set non-zero code for pre-compiled contracts 89 builder.SetCode(evmwriter.ContractAddress, []byte{0}) 90 91 builder.SetCurrentEpoch(ier.LlrIdxFullEpochRecord{ 92 LlrFullEpochRecord: ier.LlrFullEpochRecord{ 93 BlockState: iblockproc.BlockState{ 94 LastBlock: iblockproc.BlockCtx{ 95 Idx: block - 1, 96 Time: FakeGenesisTime, 97 Atropos: hash.Event{}, 98 }, 99 FinalizedStateRoot: hash.Hash{}, 100 EpochGas: 0, 101 EpochCheaters: utypes.Cheaters{}, 102 CheatersWritten: 0, 103 ValidatorStates: make([]iblockproc.ValidatorBlockState, 0), 104 NextValidatorProfiles: make(map[idx.ValidatorID]drivertype.Validator), 105 DirtyRules: nil, 106 AdvanceEpochs: 0, 107 }, 108 EpochState: iblockproc.EpochState{ 109 Epoch: epoch - 1, 110 EpochStart: FakeGenesisTime, 111 PrevEpochStart: FakeGenesisTime - 1, 112 EpochStateRoot: hash.Zero, 113 Validators: pos.NewBuilder().Build(), 114 ValidatorStates: make([]iblockproc.ValidatorEpochState, 0), 115 ValidatorProfiles: make(map[idx.ValidatorID]drivertype.Validator), 116 Rules: rules, 117 }, 118 }, 119 Idx: epoch - 1, 120 }) 121 122 var owner common.Address 123 if num != 0 { 124 owner = validators[0].Address 125 } 126 127 blockProc := makegenesis.DefaultBlockProc() 128 genesisTxs := GetGenesisTxs(epoch-2, validators, builder.TotalSupply(), delegations, owner) 129 err := builder.ExecuteGenesisTxs(blockProc, genesisTxs) 130 if err != nil { 131 panic(err) 132 } 133 134 return builder.Build(genesis.Header{ 135 GenesisID: builder.CurrentHash(), 136 NetworkID: rules.NetworkID, 137 NetworkName: rules.Name, 138 }) 139 } 140 141 func txBuilder() func(calldata []byte, addr common.Address) *types.Transaction { 142 nonce := uint64(0) 143 return func(calldata []byte, addr common.Address) *types.Transaction { 144 tx := types.NewTransaction(nonce, addr, common.Big0, 1e10, common.Big0, calldata) 145 nonce++ 146 return tx 147 } 148 } 149 150 func GetGenesisTxs(sealedEpoch idx.Epoch, validators gpos.Validators, totalSupply *big.Int, delegations []drivercall.Delegation, driverOwner common.Address) types.Transactions { 151 buildTx := txBuilder() 152 internalTxs := make(types.Transactions, 0, 15) 153 // initialization 154 calldata := netinitcall.InitializeAll(sealedEpoch, totalSupply, sfc.ContractAddress, sfclib.ContractAddress, driverauth.ContractAddress, driver.ContractAddress, evmwriter.ContractAddress, driverOwner) 155 internalTxs = append(internalTxs, buildTx(calldata, netinit.ContractAddress)) 156 // push genesis validators 157 for _, v := range validators { 158 calldata := drivercall.SetGenesisValidator(v) 159 internalTxs = append(internalTxs, buildTx(calldata, driver.ContractAddress)) 160 } 161 // push genesis delegations 162 for _, delegation := range delegations { 163 calldata := drivercall.SetGenesisDelegation(delegation) 164 internalTxs = append(internalTxs, buildTx(calldata, driver.ContractAddress)) 165 } 166 return internalTxs 167 } 168 169 func GetFakeValidators(num idx.Validator) gpos.Validators { 170 validators := make(gpos.Validators, 0, num) 171 172 for i := idx.ValidatorID(1); i <= idx.ValidatorID(num); i++ { 173 key := FakeKey(i) 174 addr := crypto.PubkeyToAddress(key.PublicKey) 175 pubkeyraw := crypto.FromECDSAPub(&key.PublicKey) 176 validators = append(validators, gpos.Validator{ 177 ID: i, 178 Address: addr, 179 PubKey: validatorpk.PubKey{ 180 Raw: pubkeyraw, 181 Type: validatorpk.Types.Secp256k1, 182 }, 183 CreationTime: FakeGenesisTime, 184 CreationEpoch: 0, 185 DeactivatedTime: 0, 186 DeactivatedEpoch: 0, 187 Status: 0, 188 }) 189 } 190 191 return validators 192 }