diff --git a/main/params.go b/main/params.go index 2c40976..7050652 100644 --- a/main/params.go +++ b/main/params.go @@ -29,7 +29,7 @@ import ( ) const ( - dbVersion = "v0.2.0" + dbVersion = "v0.3.0" ) // Results of parsing the CLI diff --git a/node/node.go b/node/node.go index 2433da9..dfa9549 100644 --- a/node/node.go +++ b/node/node.go @@ -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() ) diff --git a/vms/avm/service.go b/vms/avm/service.go index ed28421..f71d607 100644 --- a/vms/avm/service.go +++ b/vms/avm/service.go @@ -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) diff --git a/vms/avm/user_state.go b/vms/avm/user_state.go index 363b47f..7d198a3 100644 --- a/vms/avm/user_state.go +++ b/vms/avm/user_state.go @@ -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())