Skip to content

Commit

Permalink
remove keystore and related APIs (#748)
Browse files Browse the repository at this point in the history
  • Loading branch information
ceyonur authored Jan 16, 2025
1 parent 5013851 commit be859c9
Show file tree
Hide file tree
Showing 7 changed files with 7 additions and 530 deletions.
4 changes: 4 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Release Notes

## Pending Release

- Removed deprecated `ExportKey`, `ExportAVAX`, `Export`, `ImportKey`, `ImportAVAX`, `Import` APIs

## [v0.14.1](https://github.com/ava-labs/coreth/releases/tag/v0.14.1)

- IMPORTANT: `eth_getProof` calls for historical state will be rejected by default.
Expand Down
211 changes: 3 additions & 208 deletions plugin/evm/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/ava-labs/coreth/plugin/evm/atomic"
"github.com/ava-labs/coreth/plugin/evm/client"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
)

Expand All @@ -33,10 +32,9 @@ const (
)

var (
errNoAddresses = errors.New("no addresses provided")
errNoSourceChain = errors.New("no source chain provided")
errNilTxID = errors.New("nil transaction ID")
errMissingPrivateKey = errors.New("argument 'privateKey' not given")
errNoAddresses = errors.New("no addresses provided")
errNoSourceChain = errors.New("no source chain provided")
errNilTxID = errors.New("nil transaction ID")

initialBaseFee = big.NewInt(params.ApricotPhase3InitialBaseFee)
)
Expand Down Expand Up @@ -71,17 +69,6 @@ func (api *SnowmanAPI) IssueBlock(ctx context.Context) error {
// AvaxAPI offers Avalanche network related API methods
type AvaxAPI struct{ vm *VM }

// parseAssetID parses an assetID string into an ID
func (service *AvaxAPI) parseAssetID(assetID string) (ids.ID, error) {
if assetID == "" {
return ids.ID{}, fmt.Errorf("assetID is required")
} else if assetID == "AVAX" {
return service.vm.ctx.AVAXAssetID, nil
} else {
return ids.FromString(assetID)
}
}

type VersionReply struct {
Version string `json:"version"`
}
Expand All @@ -92,198 +79,6 @@ func (service *AvaxAPI) Version(r *http.Request, _ *struct{}, reply *VersionRepl
return nil
}

// ExportKey returns a private key from the provided user
func (service *AvaxAPI) ExportKey(r *http.Request, args *client.ExportKeyArgs, reply *client.ExportKeyReply) error {
log.Info("EVM: ExportKey called")

address, err := client.ParseEthAddress(args.Address)
if err != nil {
return fmt.Errorf("couldn't parse %s to address: %s", args.Address, err)
}

service.vm.ctx.Lock.Lock()
defer service.vm.ctx.Lock.Unlock()

db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
return fmt.Errorf("problem retrieving user '%s': %w", args.Username, err)
}
defer db.Close()

user := user{db: db}
reply.PrivateKey, err = user.getKey(address)
if err != nil {
return fmt.Errorf("problem retrieving private key: %w", err)
}
reply.PrivateKeyHex = hexutil.Encode(reply.PrivateKey.Bytes())
return nil
}

// ImportKey adds a private key to the provided user
func (service *AvaxAPI) ImportKey(r *http.Request, args *client.ImportKeyArgs, reply *api.JSONAddress) error {
log.Info("EVM: ImportKey called", "username", args.Username)

if args.PrivateKey == nil {
return errMissingPrivateKey
}

reply.Address = args.PrivateKey.EthAddress().Hex()

service.vm.ctx.Lock.Lock()
defer service.vm.ctx.Lock.Unlock()

db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
return fmt.Errorf("problem retrieving data: %w", err)
}
defer db.Close()

user := user{db: db}
if err := user.putAddress(args.PrivateKey); err != nil {
return fmt.Errorf("problem saving key %w", err)
}
return nil
}

// ImportAVAX is a deprecated name for Import.
func (service *AvaxAPI) ImportAVAX(_ *http.Request, args *client.ImportArgs, response *api.JSONTxID) error {
return service.Import(nil, args, response)
}

// Import issues a transaction to import AVAX from the X-chain. The AVAX
// must have already been exported from the X-Chain.
func (service *AvaxAPI) Import(_ *http.Request, args *client.ImportArgs, response *api.JSONTxID) error {
log.Info("EVM: ImportAVAX called")

chainID, err := service.vm.ctx.BCLookup.Lookup(args.SourceChain)
if err != nil {
return fmt.Errorf("problem parsing chainID %q: %w", args.SourceChain, err)
}

service.vm.ctx.Lock.Lock()
defer service.vm.ctx.Lock.Unlock()

// Get the user's info
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
return fmt.Errorf("couldn't get user '%s': %w", args.Username, err)
}
defer db.Close()

user := user{db: db}
privKeys, err := user.getKeys()
if err != nil { // Get keys
return fmt.Errorf("couldn't get keys controlled by the user: %w", err)
}

var baseFee *big.Int
if args.BaseFee == nil {
// Get the base fee to use
baseFee, err = service.vm.estimateBaseFee(context.Background())
if err != nil {
return err
}
} else {
baseFee = args.BaseFee.ToInt()
}

tx, err := service.vm.newImportTx(chainID, args.To, baseFee, privKeys)
if err != nil {
return err
}

response.TxID = tx.ID()
if err := service.vm.mempool.AddLocalTx(tx); err != nil {
return err
}
service.vm.atomicTxPushGossiper.Add(&atomic.GossipAtomicTx{Tx: tx})
return nil
}

// ExportAVAX exports AVAX from the C-Chain to the X-Chain
// It must be imported on the X-Chain to complete the transfer
func (service *AvaxAPI) ExportAVAX(_ *http.Request, args *client.ExportAVAXArgs, response *api.JSONTxID) error {
return service.Export(nil, &client.ExportArgs{
ExportAVAXArgs: *args,
AssetID: service.vm.ctx.AVAXAssetID.String(),
}, response)
}

// Export exports an asset from the C-Chain to the X-Chain
// It must be imported on the X-Chain to complete the transfer
func (service *AvaxAPI) Export(_ *http.Request, args *client.ExportArgs, response *api.JSONTxID) error {
log.Info("EVM: Export called")

assetID, err := service.parseAssetID(args.AssetID)
if err != nil {
return err
}

if args.Amount == 0 {
return errors.New("argument 'amount' must be > 0")
}

// Get the chainID and parse the to address
chainID, to, err := service.vm.ParseAddress(args.To)
if err != nil {
chainID, err = service.vm.ctx.BCLookup.Lookup(args.TargetChain)
if err != nil {
return err
}
to, err = ids.ShortFromString(args.To)
if err != nil {
return err
}
}

service.vm.ctx.Lock.Lock()
defer service.vm.ctx.Lock.Unlock()

// Get this user's data
db, err := service.vm.ctx.Keystore.GetDatabase(args.Username, args.Password)
if err != nil {
return fmt.Errorf("problem retrieving user '%s': %w", args.Username, err)
}
defer db.Close()

user := user{db: db}
privKeys, err := user.getKeys()
if err != nil {
return fmt.Errorf("couldn't get addresses controlled by the user: %w", err)
}

var baseFee *big.Int
if args.BaseFee == nil {
// Get the base fee to use
baseFee, err = service.vm.estimateBaseFee(context.Background())
if err != nil {
return err
}
} else {
baseFee = args.BaseFee.ToInt()
}

// Create the transaction
tx, err := service.vm.newExportTx(
assetID, // AssetID
uint64(args.Amount), // Amount
chainID, // ID of the chain to send the funds to
to, // Address
baseFee,
privKeys, // Private keys
)
if err != nil {
return fmt.Errorf("couldn't create tx: %w", err)
}

response.TxID = tx.ID()
if err := service.vm.mempool.AddLocalTx(tx); err != nil {
return err
}
service.vm.atomicTxPushGossiper.Add(&atomic.GossipAtomicTx{Tx: tx})
return nil
}

// GetUTXOs gets all utxos for passed in addresses
func (service *AvaxAPI) GetUTXOs(r *http.Request, args *api.GetUTXOsArgs, reply *api.GetUTXOsReply) error {
log.Info("EVM: GetUTXOs called", "Addresses", args.Addresses)
Expand Down
Loading

0 comments on commit be859c9

Please sign in to comment.