github.com/prysmaticlabs/prysm@v1.4.4/tools/unencrypted-keys-gen/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "log" 6 "os" 7 8 "github.com/prysmaticlabs/prysm/shared/bls" 9 "github.com/prysmaticlabs/prysm/shared/interop" 10 "github.com/prysmaticlabs/prysm/tools/unencrypted-keys-gen/keygen" 11 ) 12 13 var ( 14 numKeys = flag.Int("num-keys", 0, "Number of validator private/withdrawal keys to generate") 15 startIndex = flag.Uint64("start-index", 0, "Start index for the determinstic keygen algorithm") 16 random = flag.Bool("random", false, "Randomly generate keys") 17 outputJSON = flag.String("output-json", "", "JSON file to write output to") 18 overwrite = flag.Bool("overwrite", false, "If the key file exists, it will be overwritten") 19 ) 20 21 func main() { 22 flag.Parse() 23 if *numKeys == 0 { 24 log.Fatal("Please specify --num-keys to generate") 25 } 26 if *outputJSON == "" { 27 log.Fatal("Please specify an --output-json file to write the unencrypted keys to") 28 } 29 30 if !*overwrite { 31 if _, err := os.Stat(*outputJSON); err == nil { 32 log.Fatal("The file exists. Use a different file name or the --overwrite flag") 33 } 34 } 35 36 file, err := os.Create(*outputJSON) 37 if err != nil { 38 log.Fatal(err) 39 } 40 cleanup := func() { 41 if err := file.Close(); err != nil { 42 log.Fatal(err) 43 } 44 } 45 defer cleanup() 46 47 var ctnr *keygen.UnencryptedKeysContainer 48 if *random { 49 ctnr, err = generateRandomKeys(*numKeys) 50 if err != nil { 51 // log.Fatal will prevent defer from being called 52 cleanup() 53 log.Fatal(err) 54 } 55 } else { 56 ctnr = generateUnencryptedKeys(*startIndex) 57 } 58 if err := keygen.SaveUnencryptedKeysToFile(file, ctnr); err != nil { 59 // log.Fatal will prevent defer from being called 60 cleanup() 61 log.Fatal(err) 62 } 63 } 64 65 func generateRandomKeys(num int) (*keygen.UnencryptedKeysContainer, error) { 66 ctnr := &keygen.UnencryptedKeysContainer{ 67 Keys: make([]*keygen.UnencryptedKeys, num), 68 } 69 70 for i := 0; i < num; i++ { 71 sk, err := bls.RandKey() 72 if err != nil { 73 return nil, err 74 } 75 ctnr.Keys[i] = &keygen.UnencryptedKeys{ 76 ValidatorKey: sk.Marshal(), 77 WithdrawalKey: sk.Marshal(), 78 } 79 } 80 81 return ctnr, nil 82 } 83 84 func generateUnencryptedKeys(startIndex uint64) *keygen.UnencryptedKeysContainer { 85 ctnr := &keygen.UnencryptedKeysContainer{ 86 Keys: make([]*keygen.UnencryptedKeys, *numKeys), 87 } 88 89 sks, _, err := interop.DeterministicallyGenerateKeys(startIndex, uint64(*numKeys)) 90 91 if err != nil { 92 panic(err) 93 } 94 95 for i, sk := range sks { 96 ctnr.Keys[i] = &keygen.UnencryptedKeys{ 97 ValidatorKey: sk.Marshal(), 98 WithdrawalKey: sk.Marshal(), 99 } 100 } 101 return ctnr 102 }