Error no detectado: no se pudo decodificar, json: no se puede descomponer la matriz en el valor Go de tipo cadena (…)

Estoy tratando de usar mi contrato ya implementado usando web3.js desde mi consola, pero tengo problemas.

Obtengo mi contrato compilado de browser-solidity y luego hago:

var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
var MyContract = web3.eth.contract(abi);
var myContractInstance = MyContract.at('address');
web3.eth.getCode(address)  => returns my contract code

luego, si escribo myContractinstance, obtengo la lista de métodos que construí en Solidity.

El problema es: Recibo este error para todas las llamadas a funciones.

Error no detectado: no se pudo decodificar, json: no se puede descomponer la matriz en el valor Go de tipo cadena

Alguien tiene idea de lo que puede estar pasando?

Editar: Lo siento por la edición tardía

Estoy usando una versión ligeramente modificada de ese contrato estandarizado:

moneda del contrato {

                struct Account {
                    uint balance;
                    mapping ( address => uint) withdrawers;
                }

                mapping ( address => Account ) accounts;

                event CoinSent(address indexed from, uint256 value, address indexed to);

                function currency() {
                    accounts[msg.sender].balance = 1000000;
                }

                function sendCoin(uint _value, address _to) returns (bool _success) {
                    if (accounts[msg.sender].balance >= _value && _value < 340282366920938463463374607431768211456) {
                        accounts[msg.sender].balance -= _value;
                        accounts[_to].balance += _value;
                        CoinSent(msg.sender, _value, _to);
                        _success = true;
                    }
                    else _success = false;
                }

                function sendCoinFrom(address _from, uint _value, address _to) returns (bool _success) {
                    uint auth = accounts[_from].withdrawers[msg.sender];
                    if (accounts[_from].balance >= _value && auth >= _value && _value < 340282366920938463463374607431768211456) {
                        accounts[_from].withdrawers[msg.sender] -= _value;
                        accounts[_from].balance -= _value;
                        accounts[_to].balance += _value;
                        CoinSent(_from, _value, _to);
                        _success = true;
                        _success = true;
                    }
                    else _success = false;
                }

                function coinBalance() constant returns (uint _r) {
                    _r = accounts[msg.sender].balance;
                }

                function coinBalanceOf(address _addr) constant returns (uint _r) {
                    _r = accounts[_addr].balance;
                }

                function approve(address _addr) {
                    accounts[msg.sender].withdrawers[_addr] = 340282366920938463463374607431768211456;
                }

                function isApproved(address _proxy) returns (bool _r) {
                    _r = (accounts[msg.sender].withdrawers[_proxy] > 0);
                }

                function approveOnce(address _addr, uint256 _maxValue) {
                    accounts[msg.sender].withdrawers[_addr] += _maxValue;
                }

                function isApprovedOnceFor(address _target, address _proxy) returns (uint256 _r) {
                    _r = accounts[_target].withdrawers[_proxy];
                }

                function disapprove(address _addr) {
                    accounts[msg.sender].withdrawers[_addr] = 0;
                }
            }

Mi contrato abi:

    var currencyContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"disapprove","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"},{"name":"_proxy","type":"address"}],"name":"isApprovedOnceFor","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_proxy","type":"address"}],"name":"isApproved","outputs":[{"name":"_r","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendCoinFrom","outputs":[{"name":"_success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_maxValue","type":"uint256"}],"name":"approveOnce","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"coinBalanceOf","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendCoin","outputs":[{"name":"_success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"coinBalance","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"approve","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"to","type":"address"}],"name":"CoinSent","type":"event"}]);

después

var currency = currencyContract.at(["0x956440edc6115aab375ab1b96603b79376484d86"]);

Y cada vez que llamo a un método me sale el error.(currency.coinBalance() )

Ir a la versión ir a la versión go1.5.3 darwin/amd64

Hay una serie de problemas tipográficos con su pregunta: no está claro si ha modificado su código para la pregunta o si el problema radica en estos errores tipográficos. Por ejemplo, especifica la dirección del contrato como la cadena 'dirección' en lugar de la dirección del contrato real.
También será útil mostrar una muestra de la llamada real, incluso si inicialmente es solo foo con algunos parámetros.
También sería útil un fragmento de la solidez o simplemente decirnos qué tipos debe aceptar el contrato.
También puede especificar la versión del cliente Go que está utilizando.
¡Actualizado! siguió esas instrucciones inicialmente: github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

Respuestas (1)

Descubrí lo que estaba haciendo mal en mi proceso de implementación y por qué es posible acceder al contrato después de la creación, pero arrojaría el error con la dirección.

Resulta que este no es el contrato ABI:

var currencyContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"disapprove","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"},{"name":"_proxy","type":"address"}],"name":"isApprovedOnceFor","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_proxy","type":"address"}],"name":"isApproved","outputs":[{"name":"_r","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendCoinFrom","outputs":[{"name":"_success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_maxValue","type":"uint256"}],"name":"approveOnce","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"coinBalanceOf","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendCoin","outputs":[{"name":"_success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"coinBalance","outputs":[{"name":"_r","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"approve","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"to","type":"address"}],"name":"CoinSent","type":"event"}]);

Entonces, la solución del problema que tuve que hacer:

var MiContrato = web3.eth.contract(currencyContract. abi );

MiContrato.at("0xDIRECCION")

Por favor, aclare / edite la respuesta. ¿Cuál es el valor de currencyContractantes var MyContract = web3.eth.contract(currencyContract.abi);?
el escrito en el OP después de "Mi contrato abi:"
La respuesta sería más clara si fuera: var MyContract = web3.eth.contract(<put correct abi here>); . (Por qué tener dos llamadas web3.eth.contractcuando una sola es suficiente)