Respuesta JSON RPC no válida al llamar a una función

Creé un script web3js en un sitio web de wordpress, pero al ejecutar el siguiente código, obtengo una respuesta JSON RPC no válida.

var Web3 = require("web3");
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("https://ropsten.infura.io/xxxxxxxxxxx"));
var accounts = web3.eth.accounts;
var abi=[{"constant":false,"inputs":[{"name":"document","type":"string"},{"name":"timestamp","type":"uint256"}],"name":"notarize2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"document","type":"string"}],"name":"checkDocument","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proof","type":"bytes32"},{"name":"timestamp","type":"uint256"}],"name":"storeProof","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"source","type":"string"}],"name":"stringToBytes32","outputs":[{"name":"result","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proof","type":"bytes32"}],"name":"hasProof","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}];
web3.eth.defaultAccount="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var poe = web3.eth.contract(abi).at("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY");
console.log(poe.address);
result="test";
var today = new Date();
var todayI = today.getFullYear()*10000+ (today.getMonth()+1)*100+today.getDate();
console.log(todayI);                     
poe.notarize2(result,todayI,{gas:2000000});

La configuración funciona perfectamente a través de testrpc (localhost) y a través de Remix / Metamask pude verificar que el contrato se implementa correctamente en Ropsten y funciona bien.

¿Algunas ideas? esta es la primera vez que intento esto.

Respuestas (2)

Intente configurar la cuenta en una dirección de cadena en su lugar. Como Smarx, el nodo público como infura no maneja métodos privados como cuentas. Además, al usar metamask, esta cuenta se configura también como web.accounts[0]

No estoy seguro de que este sea su único problema, pero no ha especificado una cuenta desde la cual realizar esta transacción. Infura, como nodo público, no puede retener las claves privadas de nadie, por lo que no conoce cuentas.

Si desea que el espectador de la página realice la transacción, deberá usar algo como MetaMask en lugar de conectarse directamente a un nodo.

Si desea realizar la transacción de alguna manera con su propia cuenta, eso tendría que ocurrir en el lado del servidor, ya que no puede dar acceso a su clave privada a los visitantes de su sitio web.

https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/ podría ayudar, particularmente la sección "Conectarse a un nodo", que explica el rol de MetaMask.

Gracias por el enlace. A través de la información proporcionada allí, pude hacerlo funcionar con Metamask. Eso significa que cada usuario usa su propia billetera ether. Ahora estoy buscando configurarlo para que cada usuario use la misma billetera predeterminada.
¿Que estás tratando de hacer? Si deja que su clave privada se filtre, ¿qué impedirá que el primer usuario robe todos los fondos?
La idea es que un usuario normal que no sepa de wallets, metamask, etcétera, pueda usar la Dapp. Piense como pagar x USD por un servicio que consume éteres de la billetera del sitio. Sin embargo, no estoy seguro de que esto sea realmente posible.
Si realiza las transacciones (o al menos las firma) del lado del servidor, esto es posible.