forked from protolambda/eth2-testnet-genesis
-
Notifications
You must be signed in to change notification settings - Fork 1
/
altair.go
81 lines (70 loc) · 2.4 KB
/
altair.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main
import (
"bufio"
"context"
"fmt"
"github.com/protolambda/zcli/util"
"github.com/protolambda/zrnt/eth2/beacon/altair"
"github.com/protolambda/zrnt/eth2/beacon/common"
"github.com/protolambda/ztyp/codec"
"os"
"time"
)
type AltairGenesisCmd struct {
util.SpecOptions `ask:"."`
Eth1BlockHash common.Root `ask:"--eth1-block" help:"Eth1 block hash to put into state"`
Eth1BlockTimestamp common.Timestamp `ask:"--timestamp" help:"Eth1 block timestamp"`
MnemonicsSrcFilePath string `ask:"--mnemonics" help:"File with YAML of key sources"`
StateOutputPath string `ask:"--state-output" help:"Output path for state file"`
TranchesDir string `ask:"--tranches-dir" help:"Directory to dump lists of pubkeys of each tranche in"`
}
func (g *AltairGenesisCmd) Help() string {
return "Create genesis state for altair beacon chain"
}
func (g *AltairGenesisCmd) Default() {
g.SpecOptions.Default()
g.Eth1BlockHash = common.Root{}
g.Eth1BlockTimestamp = common.Timestamp(time.Now().Unix())
g.MnemonicsSrcFilePath = "mnemonics.yaml"
g.StateOutputPath = "genesis.ssz"
g.TranchesDir = "tranches"
}
func (g *AltairGenesisCmd) Run(ctx context.Context, args ...string) error {
spec, err := g.SpecOptions.Spec()
if err != nil {
return err
}
if err := os.MkdirAll(g.TranchesDir, 0777); err != nil {
return err
}
validators, err := loadValidatorKeys(spec, g.MnemonicsSrcFilePath, g.TranchesDir)
if err != nil {
return err
}
if uint64(len(validators)) < spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT {
fmt.Printf("WARNING: not enough validators for genesis. Key sources sum up to %d total. But need %d.\n", len(validators), spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT)
}
state := altair.NewBeaconStateView(spec)
if err := setupState(spec, state, g.Eth1BlockTimestamp, g.Eth1BlockHash, validators); err != nil {
return err
}
t, err := state.GenesisTime()
if err != nil {
return err
}
fmt.Printf("genesis at %d + %d = %d (%s)\n", g.Eth1BlockTimestamp, spec.GENESIS_DELAY, t, time.Unix(int64(t), 0).String())
fmt.Println("done preparing state, serializing SSZ now...")
f, err := os.OpenFile(g.StateOutputPath, os.O_CREATE|os.O_WRONLY, 0777)
if err != nil {
return err
}
defer f.Close()
buf := bufio.NewWriter(f)
defer buf.Flush()
w := codec.NewEncodingWriter(f)
if err := state.Serialize(w); err != nil {
return err
}
fmt.Println("done!")
return nil
}