added listAddresses API to the AVM

This commit is contained in:
StephenButtolph 2020-05-25 22:29:36 -04:00
commit bb11465d7e
4 changed files with 63 additions and 15 deletions

View File

@ -29,7 +29,7 @@ import (
)
const (
dbVersion = "v0.2.0"
dbVersion = "v0.3.0"
)
// Results of parsing the CLI

View File

@ -55,7 +55,7 @@ const (
var (
genesisHashKey = []byte("genesisID")
nodeVersion = version.NewDefaultVersion("ava", 0, 1, 0)
nodeVersion = version.NewDefaultVersion("avalanche", 0, 3, 0)
versionParser = version.NewDefaultParser()
)

View File

@ -544,7 +544,7 @@ func (service *Service) CreateAddress(r *http.Request, args *CreateAddressArgs,
}
addresses, _ := user.Addresses(db)
addresses = append(addresses, ids.NewID(hashing.ComputeHash256Array(sk.PublicKey().Address().Bytes())))
addresses = append(addresses, sk.PublicKey().Address())
if err := user.SetAddresses(db, addresses); err != nil {
return fmt.Errorf("problem saving address: %w", err)
@ -554,6 +554,40 @@ func (service *Service) CreateAddress(r *http.Request, args *CreateAddressArgs,
return nil
}
// ListAddressesArgs ...
type ListAddressesArgs struct {
// User that we're listing the addresses of
Username string `json:"username"`
Password string `json:"password"`
}
// ListAddressesResponse ...
type ListAddressesResponse struct {
// Each element is an address controlled by specified account
Addresses []string `json:"addresses"`
}
// ListAddresses returns all of the addresses controlled by user [args.Username]
func (service *Service) ListAddresses(_ *http.Request, args *ListAddressesArgs, response *ListAddressesResponse) error {
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
return fmt.Errorf("problem retrieving user: %w", err)
}
response.Addresses = []string{}
user := userState{vm: service.vm}
addresses, err := user.Addresses(db)
if err != nil {
return nil
}
for _, address := range addresses {
response.Addresses = append(response.Addresses, service.vm.Format(address.Bytes()))
}
return nil
}
// ExportKeyArgs are arguments for ExportKey
type ExportKeyArgs struct {
Username string `json:"username"`
@ -575,6 +609,10 @@ func (service *Service) ExportKey(r *http.Request, args *ExportKeyArgs, reply *E
if err != nil {
return fmt.Errorf("problem parsing address: %w", err)
}
addr, err := ids.ToShortID(address)
if err != nil {
return fmt.Errorf("problem parsing address: %w", err)
}
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
@ -583,7 +621,7 @@ func (service *Service) ExportKey(r *http.Request, args *ExportKeyArgs, reply *E
user := userState{vm: service.vm}
sk, err := user.Key(db, ids.NewID(hashing.ComputeHash256Array(address)))
sk, err := user.Key(db, addr)
if err != nil {
return fmt.Errorf("problem retrieving private key: %w", err)
}
@ -628,7 +666,7 @@ func (service *Service) ImportKey(r *http.Request, args *ImportKeyArgs, reply *I
}
addresses, _ := user.Addresses(db)
addresses = append(addresses, ids.NewID(hashing.ComputeHash256Array(sk.PublicKey().Address().Bytes())))
addresses = append(addresses, sk.PublicKey().Address())
if err := user.SetAddresses(db, addresses); err != nil {
return fmt.Errorf("problem saving addresses: %w", err)
@ -687,7 +725,9 @@ func (service *Service) Send(r *http.Request, args *SendArgs, reply *SendReply)
addresses, _ := user.Addresses(db)
addrs := ids.Set{}
addrs.Add(addresses...)
for _, addr := range addresses {
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
}
utxos, err := service.vm.GetUTXOs(addrs)
if err != nil {
return fmt.Errorf("problem retrieving user's UTXOs: %w", err)
@ -956,6 +996,10 @@ func (service *Service) SignMintTx(r *http.Request, args *SignMintTxArgs, reply
if err != nil {
return fmt.Errorf("problem parsing address '%s': %w", args.Minter, err)
}
addr, err := ids.ToShortID(minter)
if err != nil {
return fmt.Errorf("problem parsing address '%s': %w", args.Minter, err)
}
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
@ -964,7 +1008,6 @@ func (service *Service) SignMintTx(r *http.Request, args *SignMintTxArgs, reply
user := userState{vm: service.vm}
addr := ids.NewID(hashing.ComputeHash256Array(minter))
sk, err := user.Key(db, addr)
if err != nil {
return fmt.Errorf("problem retriving private key: %w", err)
@ -1094,7 +1137,10 @@ func (service *Service) ImportAVA(_ *http.Request, args *ImportAVAArgs, reply *I
addresses, _ := user.Addresses(db)
addrs := ids.Set{}
addrs.Add(addresses...)
for _, addr := range addresses {
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
}
utxos, err := service.vm.GetAtomicUTXOs(addrs)
if err != nil {
return fmt.Errorf("problem retrieving user's atomic UTXOs: %w", err)
@ -1238,7 +1284,10 @@ func (service *Service) ExportAVA(_ *http.Request, args *ExportAVAArgs, reply *E
addresses, _ := user.Addresses(db)
addrs := ids.Set{}
addrs.Add(addresses...)
for _, addr := range addresses {
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
}
utxos, err := service.vm.GetUTXOs(addrs)
if err != nil {
return fmt.Errorf("problem retrieving user's UTXOs: %w", err)

View File

@ -7,14 +7,13 @@ import (
"github.com/ava-labs/gecko/database"
"github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/utils/crypto"
"github.com/ava-labs/gecko/utils/hashing"
)
var addresses = ids.Empty
type userState struct{ vm *VM }
func (s *userState) SetAddresses(db database.Database, addrs []ids.ID) error {
func (s *userState) SetAddresses(db database.Database, addrs []ids.ShortID) error {
bytes, err := s.vm.codec.Marshal(addrs)
if err != nil {
return err
@ -22,12 +21,12 @@ func (s *userState) SetAddresses(db database.Database, addrs []ids.ID) error {
return db.Put(addresses.Bytes(), bytes)
}
func (s *userState) Addresses(db database.Database) ([]ids.ID, error) {
func (s *userState) Addresses(db database.Database) ([]ids.ShortID, error) {
bytes, err := db.Get(addresses.Bytes())
if err != nil {
return nil, err
}
addresses := []ids.ID{}
addresses := []ids.ShortID{}
if err := s.vm.codec.Unmarshal(bytes, &addresses); err != nil {
return nil, err
}
@ -35,10 +34,10 @@ func (s *userState) Addresses(db database.Database) ([]ids.ID, error) {
}
func (s *userState) SetKey(db database.Database, sk *crypto.PrivateKeySECP256K1R) error {
return db.Put(hashing.ComputeHash256(sk.PublicKey().Address().Bytes()), sk.Bytes())
return db.Put(sk.PublicKey().Address().Bytes(), sk.Bytes())
}
func (s *userState) Key(db database.Database, address ids.ID) (*crypto.PrivateKeySECP256K1R, error) {
func (s *userState) Key(db database.Database, address ids.ShortID) (*crypto.PrivateKeySECP256K1R, error) {
factory := crypto.FactorySECP256K1R{}
bytes, err := db.Get(address.Bytes())