Interacción con un contrato inteligente implementado desde la línea de comando geth

Tengo un contrato que me gustaría poder sumar números enviados por cualquier otra dirección:

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

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

Usando esto como una guía aproximada, seguí los siguientes pasos en una red privada:

  1. Despliega el contrato usando niebla.
  2. Obtenga el código de la interfaz JSON usando el ícono "Mostrar interfaz" en la niebla
  3. Copie la dirección del contrato implementado 0x17d541b8aACFFe473e3dD32eBA83C82B51DB8EF9en mi cadena de bloques privada.
  4. En una consola 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');
    

Entonces recibo los siguientes errores:

Error: dirección no válida
en web3.js:3887:15
en web3.js:3713:20
en web3.js:4939:28
en el mapa ()
en web3.js:4938:12
en web3.js:4964:18
en web3 .js:4989:23
en web3.js:4055:16
en aplicar ()
en web3.js:4141:16

¿Qué significan estos errores?

¿Cómo debo depurar desde este punto?

Respuestas (2)

Debe agregar un objeto de transacción para decirle a geth qué cuenta usar para la transacción:

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

También puede hacer que este error desaparezca de esta manera, donde configura su cuenta predeterminada, para que no tenga que agregar opciones {desde:...} mientras interactúa con su contrato.

En tu consola 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

Si recibe este error a continuación: Error: se necesita autenticación: contraseña o desbloqueo , desbloquee su cuenta.

En tu consola geth :-

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