Search code examples
gethavalanche

Send transaction on local avalanche node using geth


I've spun up a local avalanche network using the avalanche network runner and I've successfully connected to it using geth:

 ❮❮❮ geth attach ws://127.0.0.1:35260/ext/bc/C/ws
Welcome to the Geth JavaScript console!

instance: v0.8.4-rc.3
coinbase: 0x0100000000000000000000000000000000000000
at block: 0 (Wed Dec 31 1969 18:00:00 GMT-0600 (CST))
 modules: eth:1.0 net:1.0 rpc:1.0 web3:1.0

To exit, press ctrl-d or type exit

I'm trying to send a transaction from one account to another. I've found that this avalanche network pre-seeds account 0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC with some ETH based on this comment and confirmed it using geth:

> eth.getBalance("0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52Fc")
5e+25

However, when I try to send a transaction from this account, it fails:

> eth.getBalance("0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52Fc")
5e+25
> eth.sendTransaction({from:"0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC", to:"0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FD", value: web3.toWei(0.05, "ether")})
Error: unknown account
        at web3.js:6365:37(47)
        at send (web3.js:5099:62(35))
        at <eval>:1:20(15)

I suspect it's because I don't have the account in the list of accounts:

> eth.accounts
[]

I've tried to import the account using geth account import <path to keyfile> but that did not result in eth.accounts having an entry.

I've also tried to use the personal.importRawKey function, but that doesn't work either:

> personal.importRawKey("56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027", "lol")
Error: the method personal_importRawKey does not exist/is not available
        at web3.js:6365:37(47)
        at send (web3.js:5099:62(35))
        at <eval>:1:22(5)

> personal
{
  listAccounts: undefined,
  ecRecover: function(),
  getListAccounts: function(callback),
  importRawKey: function(),
  lockAccount: function(),
  newAccount: function github.com/ethereum/go-ethereum/internal/jsre.MakeCallback.func1(),
  openWallet: function github.com/ethereum/go-ethereum/internal/jsre.MakeCallback.func1(),
  sendTransaction: function(),
  sign: function github.com/ethereum/go-ethereum/internal/jsre.MakeCallback.func1(),
  unlockAccount: function github.com/ethereum/go-ethereum/internal/jsre.MakeCallback.func1()
}
  1. Do I need to import this account? If so, how?
  2. How do I send a transaction using geth on a local avalanche network using the default funded address by the avalanche network runner?

Solution

  • Turns out I was on the right track with importing the private key but I had to enable the personal namespace in the avalanche node.

    The personal namespace can be enabled by adding internal-private-personal to the C Chain config being used by the node.

    Once this namespace is enabled, you can connect to your node with geth and issue

    > personal.importRawKey("56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027", "lol")
    "0x8db97c7cece249c2b98bdc0226cc4c2a57bf52fc"
    > personal.unlockAccount("0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC", "lol", 300)
    

    which then enables the account for spending.