Взаимодействие с развернутым смарт-контрактом из командной строки geth

У меня есть контракт, по которому я хотел бы иметь возможность суммировать числа, отправленные по любому другому адресу:

contract UnitCounter {
    mapping (address => uint256) public UnitsFrom;
    uint256 public TotalUnits;

    function submitUnits(uint256 Units) {
        UnitsFrom[msg.sender] = Units;
        TotalUnits += Units;
    }
}

Используя это как примерное руководство, я выполнил следующие шаги в частной сети:

  1. Разверните контракт с помощью тумана
  2. Получите код интерфейса JSON, используя значок «Показать интерфейс» в тумане.
  3. Скопируйте адрес развернутого контракта 0x17d541b8aACFFe473e3dD32eBA83C82B51DB8EF9в мой приватный блокчейн.
  4. На консоли Geth:

    var abi=[ { "constant": false, "inputs": [ { "name": "Units", "type": "uint256" } ], "name": "submitUnits", "outputs": [], "type": "function" }, { "constant": true, "inputs": [], "name": "TotalUnits", "outputs": [ { "name": "", "type": "uint256" } ], "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "UnitsFrom", "outputs": [ { "name": "", "type": "uint256", "value": "0" } ], "type": "function" } ]

    var MyContract = web3.eth.contract(abi);
    
    var MyContractInstance = MyContract.at('0x17d541b8aACFFe473e3dD32eBA83C82B51DB8EF9');
    
    MyContractInstance.submitUnits('10');
    

Затем я получаю следующие ошибки:

Ошибка: неверный адрес
в web3.js:3887:15
в web3.js:3713:20
в web3.js:4939:28
в карте ()
в web3.js:4938:12
в web3.js:4964:18
в web3 .js:4989:23
в web3.js:4055:16
в применить ()
в web3.js:4141:16

Что означают эти ошибки?

Как мне отладить с этого момента?

Ответы (2)

Вам нужно добавить объект транзакции, чтобы сообщить geth, какую учетную запись использовать для транзакции:

MyContractInstance.submitUnits('10', {from: eth.accounts[0], gas:3000000});

Вы также можете устранить эту ошибку таким образом, установив учетную запись по умолчанию, чтобы вам не приходилось добавлять параметры {from:...} при взаимодействии с вашим контрактом.

В вашей консоли geth : -

// default account set to first account in your geth accounts
eth.defaultAccount = eth.accounts[0]
// Note: If eth.accounts is empty, you can create a new account with personal.newAccount()
// default account set to coinbase(Etherbase), the default primary local account in geth
eth.defaultAccount = eth.coinbase

Если вы получите эту ошибку в следующий раз — Ошибка: требуется аутентификация: пароль или разблокировка , разблокируйте свою учетную запись.

В вашей консоли geth : -

// unlocks your account for calls/transactions after you give password 
personal.unlockAccount(eth.defaultAccount)