Ungültige JSON-RPC-Antwort beim Aufrufen einer Funktion

Ich habe ein web3js-Skript auf einer WordPress-Website erstellt, aber wenn ich den folgenden Code ausführe, erhalte ich eine ungültige JSON-RPC-Antwort.

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});

Das Setup funktioniert perfekt über testrpc (localhost) und über Remix / Metamask konnte ich überprüfen, ob der Vertrag korrekt auf Ropsten bereitgestellt wird und einwandfrei funktioniert.

Irgendwelche Ideen? das ist das erste Mal, dass ich das versuche.

Antworten (2)

Versuchen Sie stattdessen, das Konto auf eine Zeichenfolgenadresse einzustellen. Als Smarx behandeln öffentliche Knoten wie Infura keine privaten Methoden wie Konten. Auch bei Verwendung von Metamask wird dieses Konto gesetzt sowie web.accounts[0]

Ich bin mir nicht sicher, ob dies Ihr einziges Problem ist, aber Sie haben kein Konto angegeben, von dem aus Sie diese Transaktion durchführen möchten. Infura kann als öffentlicher Knoten die privaten Schlüssel von niemandem speichern und kennt daher keine Konten.

Wenn Sie möchten, dass der Betrachter der Seite die Transaktion durchführt, müssen Sie so etwas wie MetaMask verwenden, anstatt sich direkt mit einem Knoten zu verbinden.

Wenn Sie die Transaktion irgendwie mit Ihrem eigenen Konto durchführen möchten, müsste dies serverseitig geschehen, da Sie den Besuchern Ihrer Website keinen Zugriff auf Ihren privaten Schlüssel gewähren können.

https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/ könnte hilfreich sein, insbesondere der Abschnitt „Connecting to a Node“, der die Rolle von MetaMask erklärt.

Danke für den Link. Durch die dort bereitgestellten Informationen konnte ich es mit Metamask zum Laufen bringen. Das bedeutet, dass jeder Benutzer sein eigenes Ether-Wallet verwendet. Ich versuche jetzt, es so einzurichten, dass jeder Benutzer dieselbe vorgegebene Brieftasche verwendet.
Was versuchst du zu machen? Wenn Sie Ihren privaten Schlüssel preisgeben, was hindert den ersten Benutzer daran, einfach alle Gelder zu stehlen?
Die Idee ist, dass ein normaler Benutzer, der sich mit Brieftaschen, Metamasken usw. nicht auskennt, die Dapp verwenden kann. Stellen Sie sich vor, Sie zahlen x USD für einen Dienst, der Ether aus der Brieftasche der Website verbraucht. Ich bin mir aber nicht sicher, ob das wirklich möglich ist.
Wenn Sie die Transaktionen serverseitig durchführen (oder zumindest signieren), ist dies möglich.