From 231b73997a1846036eecd3c4e1922e8094def6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=20=C4=90ANG?= Date: Mon, 6 Feb 2023 09:46:17 +0700 Subject: [PATCH 1/2] pebble module requires go 1.17 --- docker/Dockerfile.opera | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.opera b/docker/Dockerfile.opera index 0547d6f67..b69aa3df6 100644 --- a/docker/Dockerfile.opera +++ b/docker/Dockerfile.opera @@ -1,4 +1,4 @@ -FROM golang:1.14-alpine as builder +FROM golang:1.17-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git From 04950ccf3b9428565f59aed9e719b8e0f4e2bf13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=20=C4=90ANG?= Date: Wed, 8 Feb 2023 23:15:54 +0700 Subject: [PATCH 2/2] add flag to init account state from genesis json file for fakenet --- cmd/opera/launcher/config.go | 21 ++++++++++++++++++++- cmd/opera/launcher/fake.go | 5 +++++ cmd/opera/launcher/launcher.go | 1 + gossip/common_test.go | 2 +- integration/bench_db_flush_test.go | 2 +- integration/makefakegenesis/genesis.go | 24 ++++++++++++++++++------ 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/cmd/opera/launcher/config.go b/cmd/opera/launcher/config.go index cde784ab4..be43bcec8 100644 --- a/cmd/opera/launcher/config.go +++ b/cmd/opera/launcher/config.go @@ -2,6 +2,7 @@ package launcher import ( "bufio" + "encoding/json" "errors" "fmt" "os" @@ -14,6 +15,7 @@ import ( "github.com/Fantom-foundation/lachesis-base/utils/cachescale" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p/enode" @@ -210,7 +212,24 @@ func mayGetGenesisStore(ctx *cli.Context) *genesisstore.Store { if err != nil { log.Crit("Invalid flag", "flag", FakeNetFlag.Name, "err", err) } - return makefakegenesis.FakeGenesisStore(num, futils.ToFtm(1000000000), futils.ToFtm(5000000)) + if ctx.GlobalIsSet(InitGenesisFlag.Name) { + genesisPath := ctx.GlobalString(InitGenesisFlag.Name) + if len(genesisPath) == 0 { + utils.Fatalf("invalid path to genesis file") + } + file, err := os.Open(genesisPath) + if err != nil { + utils.Fatalf("Failed to read genesis file: %v", err) + } + defer file.Close() + + genesis := new(core.Genesis) + if err := json.NewDecoder(file).Decode(genesis); err != nil { + utils.Fatalf("invalid genesis file: %v", err) + } + return makefakegenesis.FakeGenesisStore(num, futils.ToFtm(1000000000), futils.ToFtm(5000000), genesis) + } + return makefakegenesis.FakeGenesisStore(num, futils.ToFtm(1000000000), futils.ToFtm(5000000), nil) case ctx.GlobalIsSet(GenesisFlag.Name): genesisPath := ctx.GlobalString(GenesisFlag.Name) diff --git a/cmd/opera/launcher/fake.go b/cmd/opera/launcher/fake.go index 7c7140316..f95ac0681 100644 --- a/cmd/opera/launcher/fake.go +++ b/cmd/opera/launcher/fake.go @@ -18,6 +18,11 @@ var FakeNetFlag = cli.StringFlag{ Usage: "'n/N' - sets coinbase as fake n-th key from genesis of N validators.", } +var InitGenesisFlag = cli.StringFlag{ + Name: "init", + Usage: "path to genesis json file to allocate account/contract genesis state for testing purpose on fakenet", +} + func getFakeValidatorKey(ctx *cli.Context) *ecdsa.PrivateKey { id, _, err := parseFakeGen(ctx.GlobalString(FakeNetFlag.Name)) if err != nil || id == 0 { diff --git a/cmd/opera/launcher/launcher.go b/cmd/opera/launcher/launcher.go index 7e45cf630..0d8d5e177 100644 --- a/cmd/opera/launcher/launcher.go +++ b/cmd/opera/launcher/launcher.go @@ -65,6 +65,7 @@ func initFlags() { // Flags for testing purpose. testFlags = []cli.Flag{ FakeNetFlag, + InitGenesisFlag, } // Flags that configure the node. diff --git a/gossip/common_test.go b/gossip/common_test.go index c913db77b..cfde8223b 100644 --- a/gossip/common_test.go +++ b/gossip/common_test.go @@ -135,7 +135,7 @@ func newTestEnv(firstEpoch idx.Epoch, validatorsNum idx.Validator) *testEnv { rules.Epochs.MaxEpochDuration = inter.Timestamp(maxEpochDuration) rules.Blocks.MaxEmptyBlockSkipPeriod = 0 - genStore := makefakegenesis.FakeGenesisStoreWithRulesAndStart(validatorsNum, utils.ToFtm(genesisBalance), utils.ToFtm(genesisStake), rules, firstEpoch, 2) + genStore := makefakegenesis.FakeGenesisStoreWithRulesAndStart(validatorsNum, utils.ToFtm(genesisBalance), utils.ToFtm(genesisStake), rules, firstEpoch, 2, nil) genesis := genStore.Genesis() store := NewMemStore() diff --git a/integration/bench_db_flush_test.go b/integration/bench_db_flush_test.go index acca6eabb..9ed001b5e 100644 --- a/integration/bench_db_flush_test.go +++ b/integration/bench_db_flush_test.go @@ -21,7 +21,7 @@ import ( func BenchmarkFlushDBs(b *testing.B) { dir := tmpDir("flush_bench") defer os.RemoveAll(dir) - genStore := makefakegenesis.FakeGenesisStore(1, utils.ToFtm(1), utils.ToFtm(1)) + genStore := makefakegenesis.FakeGenesisStore(1, utils.ToFtm(1), utils.ToFtm(1), nil) g := genStore.Genesis() _, _, store, s2, _, closeDBs := MakeEngine(dir, &g, Configs{ Opera: gossip.DefaultConfig(cachescale.Identity), diff --git a/integration/makefakegenesis/genesis.go b/integration/makefakegenesis/genesis.go index 259671937..85cc12a0c 100644 --- a/integration/makefakegenesis/genesis.go +++ b/integration/makefakegenesis/genesis.go @@ -11,6 +11,7 @@ import ( "github.com/Fantom-foundation/lachesis-base/kvdb/memorydb" "github.com/Fantom-foundation/lachesis-base/lachesis" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -43,20 +44,31 @@ func FakeKey(n idx.ValidatorID) *ecdsa.PrivateKey { return evmcore.FakeKey(int(n)) } -func FakeGenesisStore(num idx.Validator, balance, stake *big.Int) *genesisstore.Store { - return FakeGenesisStoreWithRules(num, balance, stake, opera.FakeNetRules()) +func FakeGenesisStore(num idx.Validator, balance, stake *big.Int, genesis *core.Genesis) *genesisstore.Store { + return FakeGenesisStoreWithRules(num, balance, stake, opera.FakeNetRules(), genesis) } -func FakeGenesisStoreWithRules(num idx.Validator, balance, stake *big.Int, rules opera.Rules) *genesisstore.Store { - return FakeGenesisStoreWithRulesAndStart(num, balance, stake, rules, 2, 1) +func FakeGenesisStoreWithRules(num idx.Validator, balance, stake *big.Int, rules opera.Rules, genesis *core.Genesis) *genesisstore.Store { + return FakeGenesisStoreWithRulesAndStart(num, balance, stake, rules, 2, 1, genesis) } -func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules opera.Rules, epoch idx.Epoch, block idx.Block) *genesisstore.Store { +func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules opera.Rules, epoch idx.Epoch, block idx.Block, g *core.Genesis) *genesisstore.Store { builder := makegenesis.NewGenesisBuilder(memorydb.NewProducer("")) - validators := GetFakeValidators(num) + // init genesis alloc accounts if any + if g != nil { + for addr, account := range g.Alloc { + builder.AddBalance(addr, account.Balance) + builder.SetCode(addr, account.Code) + builder.SetNonce(addr, account.Nonce) + for key, value := range account.Storage { + builder.SetStorage(addr, key, value) + } + } + } // add balances to validators + validators := GetFakeValidators(num) var delegations []drivercall.Delegation for _, val := range validators { builder.AddBalance(val.Address, balance)