mirror of https://github.com/poanetwork/gecko.git
added listAddresses API to the AVM
This commit is contained in:
commit
bb11465d7e
|
@ -29,7 +29,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
dbVersion = "v0.2.0"
|
dbVersion = "v0.3.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Results of parsing the CLI
|
// Results of parsing the CLI
|
||||||
|
|
|
@ -55,7 +55,7 @@ const (
|
||||||
var (
|
var (
|
||||||
genesisHashKey = []byte("genesisID")
|
genesisHashKey = []byte("genesisID")
|
||||||
|
|
||||||
nodeVersion = version.NewDefaultVersion("ava", 0, 1, 0)
|
nodeVersion = version.NewDefaultVersion("avalanche", 0, 3, 0)
|
||||||
versionParser = version.NewDefaultParser()
|
versionParser = version.NewDefaultParser()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -544,7 +544,7 @@ func (service *Service) CreateAddress(r *http.Request, args *CreateAddressArgs,
|
||||||
}
|
}
|
||||||
|
|
||||||
addresses, _ := user.Addresses(db)
|
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 {
|
if err := user.SetAddresses(db, addresses); err != nil {
|
||||||
return fmt.Errorf("problem saving address: %w", err)
|
return fmt.Errorf("problem saving address: %w", err)
|
||||||
|
@ -554,6 +554,40 @@ func (service *Service) CreateAddress(r *http.Request, args *CreateAddressArgs,
|
||||||
return nil
|
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
|
// ExportKeyArgs are arguments for ExportKey
|
||||||
type ExportKeyArgs struct {
|
type ExportKeyArgs struct {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
|
@ -575,6 +609,10 @@ func (service *Service) ExportKey(r *http.Request, args *ExportKeyArgs, reply *E
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem parsing address: %w", err)
|
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)
|
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -583,7 +621,7 @@ func (service *Service) ExportKey(r *http.Request, args *ExportKeyArgs, reply *E
|
||||||
|
|
||||||
user := userState{vm: service.vm}
|
user := userState{vm: service.vm}
|
||||||
|
|
||||||
sk, err := user.Key(db, ids.NewID(hashing.ComputeHash256Array(address)))
|
sk, err := user.Key(db, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem retrieving private key: %w", err)
|
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, _ := 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 {
|
if err := user.SetAddresses(db, addresses); err != nil {
|
||||||
return fmt.Errorf("problem saving addresses: %w", err)
|
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)
|
addresses, _ := user.Addresses(db)
|
||||||
|
|
||||||
addrs := ids.Set{}
|
addrs := ids.Set{}
|
||||||
addrs.Add(addresses...)
|
for _, addr := range addresses {
|
||||||
|
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
|
||||||
|
}
|
||||||
utxos, err := service.vm.GetUTXOs(addrs)
|
utxos, err := service.vm.GetUTXOs(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem retrieving user's UTXOs: %w", err)
|
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 {
|
if err != nil {
|
||||||
return fmt.Errorf("problem parsing address '%s': %w", args.Minter, err)
|
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)
|
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -964,7 +1008,6 @@ func (service *Service) SignMintTx(r *http.Request, args *SignMintTxArgs, reply
|
||||||
|
|
||||||
user := userState{vm: service.vm}
|
user := userState{vm: service.vm}
|
||||||
|
|
||||||
addr := ids.NewID(hashing.ComputeHash256Array(minter))
|
|
||||||
sk, err := user.Key(db, addr)
|
sk, err := user.Key(db, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem retriving private key: %w", err)
|
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)
|
addresses, _ := user.Addresses(db)
|
||||||
|
|
||||||
addrs := ids.Set{}
|
addrs := ids.Set{}
|
||||||
addrs.Add(addresses...)
|
for _, addr := range addresses {
|
||||||
|
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
|
||||||
|
}
|
||||||
|
|
||||||
utxos, err := service.vm.GetAtomicUTXOs(addrs)
|
utxos, err := service.vm.GetAtomicUTXOs(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem retrieving user's atomic UTXOs: %w", err)
|
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)
|
addresses, _ := user.Addresses(db)
|
||||||
|
|
||||||
addrs := ids.Set{}
|
addrs := ids.Set{}
|
||||||
addrs.Add(addresses...)
|
for _, addr := range addresses {
|
||||||
|
addrs.Add(ids.NewID(hashing.ComputeHash256Array(addr.Bytes())))
|
||||||
|
}
|
||||||
|
|
||||||
utxos, err := service.vm.GetUTXOs(addrs)
|
utxos, err := service.vm.GetUTXOs(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("problem retrieving user's UTXOs: %w", err)
|
return fmt.Errorf("problem retrieving user's UTXOs: %w", err)
|
||||||
|
|
|
@ -7,14 +7,13 @@ import (
|
||||||
"github.com/ava-labs/gecko/database"
|
"github.com/ava-labs/gecko/database"
|
||||||
"github.com/ava-labs/gecko/ids"
|
"github.com/ava-labs/gecko/ids"
|
||||||
"github.com/ava-labs/gecko/utils/crypto"
|
"github.com/ava-labs/gecko/utils/crypto"
|
||||||
"github.com/ava-labs/gecko/utils/hashing"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var addresses = ids.Empty
|
var addresses = ids.Empty
|
||||||
|
|
||||||
type userState struct{ vm *VM }
|
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)
|
bytes, err := s.vm.codec.Marshal(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -22,12 +21,12 @@ func (s *userState) SetAddresses(db database.Database, addrs []ids.ID) error {
|
||||||
return db.Put(addresses.Bytes(), bytes)
|
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())
|
bytes, err := db.Get(addresses.Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
addresses := []ids.ID{}
|
addresses := []ids.ShortID{}
|
||||||
if err := s.vm.codec.Unmarshal(bytes, &addresses); err != nil {
|
if err := s.vm.codec.Unmarshal(bytes, &addresses); err != nil {
|
||||||
return nil, err
|
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 {
|
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{}
|
factory := crypto.FactorySECP256K1R{}
|
||||||
|
|
||||||
bytes, err := db.Get(address.Bytes())
|
bytes, err := db.Get(address.Bytes())
|
||||||
|
|
Loading…
Reference in New Issue