Ich möchte mehrere Transaktionen von derselben Adresse gleichzeitig erstellen. Da jede Transaktion Nonce benötigt (TX-Zähler der Absenderadresse), kann ich Geth nach dem aktuellen Zählerstand fragen und das erste TX erstellen, dann Nonce erhöhen und das nächste erstellen und so weiter. Probleme, wie ich sie sehe, sind:
Wenn dies nicht der Fall ist, frage ich mich, ob es für diesen Fall einen besseren Ansatz gibt.
Sie haben nicht angegeben, ob Sie Ihre Transaktionen senden, während Sie über Geth (On-Blockchain) mit der Blockchain verbunden sind, oder ob Sie Ihre Transaktion erstellen, während Sie nicht mit der Blockchain verbunden sind (Off-Blockchain).
Die Antwort von Paul S. bezieht sich auf das Erstellen von Transaktionen außerhalb der Blockchain, bei dem Sie eine Nonce in den Rohtransaktionen angeben müssen, die Sie dann auf der Blockchain ausführen.
Wenn Sie Ihre Transaktion über die Blockchain senden, können Sie eth.sendTransaction(...) ohne weiteres verwenden.
Hier sind zum Beispiel 3 Transaktionen vom gleichen „Von“-Konto zum gleichen „Bis“-Konto. Es ist nicht erforderlich, eine Nonce anzugeben, da sie automatisch generiert wird:
> eth.sendTransaction({from: '0x5e83b635f96da0752f991f0ebddc31249f452dea', to: '0x68acc3a13441b69016560d23e134c7931bbb27bb', value: web3.toWei(1, "ether")});
"0x92d6d2285b198b6b5cf80eca6d4292c9675fb53f47f786063df600d3be06dd09"
> eth.sendTransaction({from: '0x5e83b635f96da0752f991f0ebddc31249f452dea', to: '0x68acc3a13441b69016560d23e134c7931bbb27bb', value: web3.toWei(2, "ether")});
"0x0c1280c8b2f38aec032494913c1d0e65edd511fcd15e2424483f9bbf51c7172e"
> eth.sendTransaction({from: '0x5e83b635f96da0752f991f0ebddc31249f452dea', to: '0x68acc3a13441b69016560d23e134c7931bbb27bb', value: web3.toWei(3, "ether")});
"0x8b6998eea8b343a0f754cf2732a1f28caac3acdfbe97cca69f244f0614ea546a"
> eth.getTransaction("0x92d6d2285b198b6b5cf80eca6d4292c9675fb53f47f786063df600d3be06dd09");
{
blockHash: "0x8456088424a4cacd8b394b4e11732e3c96ca77ab4a999c6ba62b38ab61116b58",
blockNumber: 225,
from: "0x5e83b635f96da0752f991f0ebddc31249f452dea",
gas: 90000,
gasPrice: 20000000000,
hash: "0x92d6d2285b198b6b5cf80eca6d4292c9675fb53f47f786063df600d3be06dd09",
input: "0x",
nonce: 0,
to: "0x68acc3a13441b69016560d23e134c7931bbb27bb",
transactionIndex: 0,
value: 1000000000000000000
}
> eth.getTransaction("0x0c1280c8b2f38aec032494913c1d0e65edd511fcd15e2424483f9bbf51c7172e");
{
blockHash: "0x8456088424a4cacd8b394b4e11732e3c96ca77ab4a999c6ba62b38ab61116b58",
blockNumber: 225,
from: "0x5e83b635f96da0752f991f0ebddc31249f452dea",
gas: 90000,
gasPrice: 20000000000,
hash: "0x0c1280c8b2f38aec032494913c1d0e65edd511fcd15e2424483f9bbf51c7172e",
input: "0x",
nonce: 1,
to: "0x68acc3a13441b69016560d23e134c7931bbb27bb",
transactionIndex: 1,
value: 2000000000000000000
}
> eth.getTransaction("0x8b6998eea8b343a0f754cf2732a1f28caac3acdfbe97cca69f244f0614ea546a");
{
blockHash: "0x8456088424a4cacd8b394b4e11732e3c96ca77ab4a999c6ba62b38ab61116b58",
blockNumber: 225,
from: "0x5e83b635f96da0752f991f0ebddc31249f452dea",
gas: 90000,
gasPrice: 20000000000,
hash: "0x8b6998eea8b343a0f754cf2732a1f28caac3acdfbe97cca69f244f0614ea546a",
input: "0x",
nonce: 2,
to: "0x68acc3a13441b69016560d23e134c7931bbb27bb",
transactionIndex: 2,
value: 3000000000000000000
}
Wenn Sie Transaktionsabhängigkeiten in Ihrer Off-Blockchain-Anwendung haben, sollten Sie warten, bis die vorherige Transaktion abgebaut wurde, bevor Sie die nächste Transaktion einreichen.
Im Allgemeinen ist der Prozess
Es gibt keine guten prägnanten Beispiele dafür, die ich in einen Stackexchange-Beitrag einfügen kann, aber hier sind einige Links, die verschiedene Möglichkeiten zeigen, dies zu tun:
So erkennen Sie, wann Ihre Transaktion abgebaut wurde Stack Exchange Frage
Ether Pudding hat dies eingebaut, sehen Sie sich also die Zeitsynchronisierung in index.js an, um zu erfahren, wie das funktioniert. Macht Ihren Anwendungscode mithilfe von Versprechungen sehr sauber. Allerdings ist index.js ziemlich schwer zu lesen ... vertrau mir einfach, es funktioniert ;-)
Sie können den Transaktionsbeleg abfragen
Sie können die Transaktion abfragen, um zu sehen, ob ihr Block gültig ist . Das macht Ätherpudding.
Sie können einen Ereignisfilter erstellen , dessen Rückruf bei jedem abgebauten Block ausgelöst wird, und jedes Mal, wenn ein Block abgebaut wird, können Sie eine der oben genannten Abfragemethoden verwenden, um zu sehen, ob Ihre Transaktion abgebaut wurde. Dies ist möglicherweise besser als beschäftigtes Polling, obwohl ich einige Probleme mit dem Eventing-System hatte, die sehr schwer zu reproduzieren sind.
In all diesen Fällen möchten Sie nicht ewig warten, sondern eine Art Auszeit. Im Allgemeinen werden Sie in Javascript entweder einen Rückruf an Ihre Anwendung auslösen oder ein erfülltes Versprechen zurückgeben, wenn eine Transaktion abgebaut wird. Ich nehme an, Sie könnten einige der anderen Javascript-Idiome wie RXJS oder Event verwenden, aber ich habe diese für diesen Zweck nicht ausprobiert.
Müssen sie alle gleichzeitig sein, oder können Sie eine willkürliche Verzögerung von beispielsweise 30 Sekunden einfügen, bevor die nächste ausgelöst wird? Dies würde sicherlich alle von Ihnen beschriebenen Probleme beseitigen. Viel kürzere Zeiten könnten fast sicher verwendet werden.
Es besteht die reale Möglichkeit, dass Transaktionen nicht in der gleichen Reihenfolge gesendet / verarbeitet werden und daher fehlschlagen, aber dies hängt vom gelieferten Gas, dem Grad der Netzaktivität, der tatsächlichen Geschwindigkeit „gleichzeitig“ usw. ab.
Taywano
Datenschutz ist ein Menschenrecht.eth
eth
Datenschutz ist ein Menschenrecht.eth