Wie kann ich „eth_sendTransaction“ verwenden, um einen Vertrag aufzurufen und Protokolle abzurufen?

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!

Antworten (2)

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).

Ich habe es versucht und es hat funktioniert, vielen Dank! Kann ich die Berechnung trotzdem erhalten, indem ich eth_sendTransaction ohne Protokoll verwende
Der Rückgabewert kann über eth_call; oder einen anderen Vertrag und siehe ethereum.stackexchange.com/questions/765/… für weitere Informationen.

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 valuemit dem Thema "log_topic".

log2(value,topic1,topic2)können Sie einen Eintrag mit 2 Themen erstellen usw.

Link zur Solidity-Dokumentation

Es ist viel einfacher, danke! Wenn ich keine Logeinträge erzeuge, kann ich dann trotzdem die Vertragsrechnung bekommen?
Diese können Sie nach der Berechnung in eine Contract-Storage-Variable schreiben und später direkt mit auslesen 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.