github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/genesis/spec/template_account.go (about) 1 package spec 2 3 import ( 4 "fmt" 5 6 "github.com/hyperledger/burrow/acm/balance" 7 "github.com/hyperledger/burrow/crypto" 8 "github.com/hyperledger/burrow/genesis" 9 "github.com/hyperledger/burrow/keys" 10 "github.com/hyperledger/burrow/permission" 11 ) 12 13 func (ta TemplateAccount) Validator(keyClient keys.KeyClient, index int, curve crypto.CurveType) (*genesis.Validator, error) { 14 var err error 15 gv := new(genesis.Validator) 16 gv.PublicKey, gv.Address, err = ta.RealisePublicKeyAndAddress(keyClient, crypto.CurveTypeEd25519) 17 if err != nil { 18 return nil, err 19 } 20 gv.Amount = ta.Balances().GetPower(DefaultPower) 21 if ta.Name == "" { 22 gv.Name = accountNameFromIndex(index) 23 } else { 24 gv.Name = ta.Name 25 } 26 27 gv.UnbondTo = []genesis.BasicAccount{{ 28 Address: gv.Address, 29 PublicKey: gv.PublicKey, 30 Amount: gv.Amount, 31 }} 32 return gv, nil 33 } 34 35 func (ta TemplateAccount) AccountPermissions() (permission.AccountPermissions, error) { 36 basePerms, err := permission.BasePermissionsFromStringList(ta.Permissions) 37 if err != nil { 38 return permission.ZeroAccountPermissions, nil 39 } 40 return permission.AccountPermissions{ 41 Base: basePerms, 42 Roles: ta.Roles, 43 }, nil 44 } 45 46 func (ta TemplateAccount) GenesisAccount(keyClient keys.KeyClient, index int, curve crypto.CurveType) (*genesis.Account, error) { 47 var err error 48 ga := new(genesis.Account) 49 ga.PublicKey, ga.Address, err = ta.RealisePublicKeyAndAddress(keyClient, curve) 50 if err != nil { 51 return nil, err 52 } 53 ga.Amount = ta.Balances().GetNative(DefaultAmount) 54 if ta.Name == "" { 55 ga.Name = accountNameFromIndex(index) 56 } else { 57 ga.Name = ta.Name 58 } 59 if ta.Permissions == nil { 60 ga.Permissions = permission.DefaultAccountPermissions.Clone() 61 } else { 62 ga.Permissions, err = ta.AccountPermissions() 63 if err != nil { 64 return nil, err 65 } 66 } 67 return ga, nil 68 } 69 70 // Adds a public key and address to the template. If PublicKey will try to fetch it by Address. 71 // If both PublicKey and Address are not set will use the keyClient to generate a new keypair 72 func (ta TemplateAccount) RealisePublicKeyAndAddress(keyClient keys.KeyClient, curve crypto.CurveType) (pubKey *crypto.PublicKey, address crypto.Address, err error) { 73 if ta.PublicKey == nil { 74 if ta.Address == nil { 75 // If neither PublicKey or Address set then generate a new one 76 address, err = keyClient.Generate(ta.Name, curve) 77 if err != nil { 78 return 79 } 80 } else { 81 address = *ta.Address 82 } 83 // Get the (possibly existing) key 84 pubKey, err = keyClient.PublicKey(address) 85 if err != nil { 86 return 87 } 88 } else { 89 address = (*ta.PublicKey).GetAddress() 90 if ta.Address != nil && *ta.Address != address { 91 err = fmt.Errorf("template address %s does not match public key derived address %s", ta.Address, 92 ta.PublicKey) 93 } 94 pubKey = ta.PublicKey 95 } 96 return 97 } 98 99 func (ta TemplateAccount) Balances() balance.Balances { 100 return ta.Amounts 101 }