Ich habe eingesetzt:
contract test {
function multiply(uint a) returns(uint d) {
return a * 7;
}
}
Ich kann den Vertrag mit " eth_call " aufrufen:
mpsp@ubuntu-slave2:~$ curl http://10.10.67.217:8545 --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to": "0x8e6f99f04148b1fb918cde7e44a94375f94dc745","data":"0xc6888fa10000000000000000000000000000000000000000000000000000000000000007"},"latest"],"id":1}'
die ausgabe ist:
{"jsonrpc":"2.0","id":1,"result":"0x0000000000000000000000000000000000000000000000000000000000000031"}
Aber als ich " eth_sendTransaction " verwendet habe, um den Vertrag aufzurufen, und nach dem Mining habe ich " eth_getTransactionReceipt " verwendet, um das Ergebnis zu erhalten, und der Vertrag schien nicht aufgerufen zu werden. Hier sind meine Schritte:
eth_sendTransaction
run: mpsp@ubuntu-slave2:~$ curl http://10.10.67.217:8545 --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xc60ec7c68d47814288bdfdaa71b88ff922d735a7","to":"0x8e6f99f04148b1fb918cde7e44a94375f94dc745","gas":"0xC350","gasPrice":"0x1388","data":"0xc6888fa10000000000000000000000000000000000000000000000000000000000000003"}],"id":1}'
outputs: {"jsonrpc":"2.0","id":1,"result":"0xcff6d91d1693abe876c25ba03a58bc6ca693078b3a90e836f656e0dddb08a4cd"}
eth_getTransactionReceipt
run: curl http://10.10.67.217:8545 --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xcff6d91d1693abe876c25ba03a58bc6ca693078b3a90e836f656e0dddb08a4cd"],"id":1}'
outputs: {"jsonrpc":"2.0","id":1,"result":{"blockHash":"0x26e23d45caf0c57159e88d9835c573a79f59a4fad0e7a7d70ea7a49780d14448","blockNumber":"0xc3a1","contractAddress":null,"cumulativeGasUsed":"0x5449","from":"0xc60ec7c68d47814288bdfdaa71b88ff922d735a7","gasUsed":"0x5449","logs":[],"root":"c42b14419677df59e3f593fccf03ea28f65bbd8927dcc9239dad6e77eb85f1a3","to":"0x8e6f99f04148b1fb918cde7e44a94375f94dc745","transactionHash":"0xcff6d91d1693abe876c25ba03a58bc6ca693078b3a90e836f656e0dddb08a4cd","transactionIndex":"0x0"}}
logs war in den Ausgaben von eth_getTransactionReceipt leer.
Haben Sie einige Vorschläge?
Vielen Dank!
Der Testvertrag gibt kein Ereignis aus, deshalb gibt es keine Protokolle. Rückgabewerte werden nicht automatisch als Protokoll aufgenommen.
Versuchen:
contract test {
event R(uint x);
function multiply(uint a) returns(uint d) {
R(a * 7);
return a * 7;
}
}
Falls das nicht funktioniert, müssen Sie möglicherweise das Gas erhöhen (Sie haben noch etwa 28.423 Gas übrig).
Wenn ich neben der Verwendung von Ereignissen wirklich nur Protokolleinträge im Transaktionsbeleg generieren möchte, finde ich es manchmal einfacher, die Solidity-Protokollierungsfunktionen auf niedriger Ebene direkt aufzurufen:
log1( value, 'log_topic');
erstellt einen Log-Eintrag value
mit dem Thema "log_topic"
.
log2(value,topic1,topic2)
können Sie einen Eintrag mit 2 Themen erstellen usw.
eth_call()
. Das Schreiben in eine Variable kostet mehr Gas als das Schreiben eines Protokolleintrags, aber das Auslesen aus dem Vertrag mit call()
ist viel einfacher und kostet kein Gas.
Panda
eth
eth_call
; oder einen anderen Vertrag und siehe ethereum.stackexchange.com/questions/765/… für weitere Informationen.