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  }