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  }