nethereum - Transaktionen werden ignoriert oder verschwinden?

Ich versuche, eine Transaktion mit Nethereum wie unten zu erstellen, aber ich kann das Ergebnis nirgendwo sehen. Ich habe die Brieftasche überprüft und vom benutzerdefinierten Client abgefragt.

var proposalsFunction = contract.GetFunction("newProposal");
var transactionOfProposal = await proposalsFunction.SendTransactionAsync( addressFrom,p.Recipient,p.Amount,p.Description,true);

Dies ist die Vertragsmethode, die ich auszuführen versuche. (Aus irgendeinem Grund will es bool als letzten Parameter)

 function newProposal(
    address beneficiary,
    uint etherAmount,
    string JobDescription,
    bytes transactionBytecode
)
    onlyMembers
    returns (uint proposalID)
{
... 
}

So sieht es im Geth-Primärknoten aus. Ich kann den TX auch in Unterknoten sehen. Der TX ist also irgendwo da, aber was ist passiert?Geben Sie hier die Bildbeschreibung ein

Hast du das gelöst? Haben Sie die Transaktion gemint? Haben Sie nach Aktivierung des Minings versucht, die Transaktionsquittung zu erhalten?
Ich habe es abgebaut und konnte den TX auf allen Knoten (in der Konsole) sehen, aber der Vorschlag wurde nicht in Kette angezeigt. Durch das Senden von Gas funktionierte es jedoch schließlich.

Antworten (2)

Ihr Hauptproblem ist, dass Ihnen das Benzin ausgegangen ist.

Die Ausführung von Verträgen erfordert „Gas“, in diesem Szenario haben Sie nicht genug Gas bereitgestellt und es wurde alles verbraucht. Verträge verbrauchen je nach Komplexität unterschiedliche Gasmengen, das Gas wird pro Auftrag berechnet.

Eine gängige Methode, dies zu validieren, besteht darin, zu prüfen, ob das Gas mit dem verwendeten Gas identisch ist

TransactionSource.Gas == TransactionReceipt.GasUsed

Wenn Sie geth als Client verwenden, können Sie den Stacktrace untersuchen und den Fehler finden, zuerst können Sie die Debug-Informationen abrufen:

await Web3.DebugGeth.TraceTransaction.SendRequestAsync(transactionHash,
                    new TraceTransactionOptions {DisableMemory = true, DisableStorage = true, DisableStack = true});        

und verwenden Sie dann die folgenden Funktionen, um dies zu validieren:

    public bool HasError(JObject stack)
    {
        return !string.IsNullOrEmpty(GetError(stack));
    }

    public string GetError(JObject stack)
    {
        var structsLogs = (JArray)stack["structLogs"];
        if (structsLogs.Count > 0)
        {
            var lastCall = structsLogs[structsLogs.Count - 1];
            return lastCall["error"].Value<string>();
        }
        return null;
    }

Diese Hilfsklasse ist in RC5 enthalten. Sie können also Folgendes tun:

web3.DebugGeth.StackErrorChecker.HasError("stacktrace");

Sie können das Gas vorher berechnen, indem Sie Folgendes tun:

var gas = await multiplyFunction.EstimateGasAsync(69);


Bytes-Problem, ein Bool-Konverter wurde anstelle eines Bytes-Konverters konfiguriert, dies wurde ab RC5 behoben.


Erwarten und langsame Antwort, dies hat nichts mit der Verwendung des Schlüsselworts await zu tun. Hauptsächlich dauert die Transaktion sehr lange, die Ursache dafür kann darin liegen, dass sie nicht vollständig synchronisiert ist. Die richtige Nonce muss für die Transaktion verwendet werden und wartet möglicherweise (geth) auf diese Informationen.

Sie könnten ohne die transactionId keine Quittung erhalten, wenn das Schlüsselwort not await vorhanden ist, weisen Sie einer Variablen das Task-Objekt zu.

Du hattest Recht, Hauptsache ein Gasproblem, aber das andere Problem bleibt. Ich bekomme die Transaktionsinfo nicht, weil die App in der Funktionszeile hängen bleibt await proposalsFunction.SendTransactionAsync(AccountHelper.AddressFrom,...). Dasselbe passiert auch hier:await Web3.Personal.UnlockAccount.SendRequestAsync(AddressFrom, ...);
Übrigens, gibt es eine Möglichkeit, den genauen Gasbedarf vorher zu kennen, wie in der Brieftasche, damit ich diesen bestimmten Betrag senden kann. Und wofür ist das Wertefeld?
Wert ist die Menge an Ether, die Sie an eine Adresse senden möchten (kann ein Vertrag sein).
Was verwendest du RPC oder IPC? Hast du alle Flags aktiviert? persönlich, eth usw.?
Sie haben den RPC-Aufruf eth_estimateGas, mit dem Sie die Transaktion übergeben können. Ich werde in web3 eine einfache Methode dafür erstellen.
Ich verwende RPC. Offensichtlich war Personal nicht aktiviert, ich habe --rpcapi "eth,net,web3,personal" zu meiner Geth-Startzeichenfolge hinzugefügt. Diesmal bekam ich von meinem 1st tx im Kommentar eine "Zusätzliche Information: Konto ist gesperrt". Der 2. TX (Konto entsperren) hängt immer noch.
Fortschritt :) Haben Sie versucht, dies mit curl zu überprüfen? github.com/ethereum/wiki/wiki/JSON-RPC überprüfen Sie die Methoden hier

Ich stelle dies hier, weil es die ursprüngliche Frage beantwortet, aber ich werde jede andere Antwort akzeptieren, die sich ausführlich mit den folgenden Themen befasst.

Ich bin mir nicht sicher, wie das funktioniert hat, aber das Senden von Gas und einem Wert (?) war die Antwort.

var transactionOfProposal = proposalsFunction
                .SendTransactionAsync(addressFrom, new HexBigInteger(232805),
                new HexBigInteger(1), p.Recipient, p.Amount, p.Description, false);

Dinge, die ich immer noch nicht verstehe, sind;

  • Als ich die Miner gestartet habe, habe ich kein akzeptiertes Mindestniveau oder ähnliches festgelegt, daher verstehe ich nicht, warum der TX ignoriert wird, obwohl er auf allen Knotenkonsolen sichtbar ist.
  • Der letzte Parameter der Vertragsfunktion ist ein byte [], also warum besteht es auf bool, das verstehe ich nicht.
  • Ich kann Await nicht vor den Teil setzen, der mit ProposalsFunction beginnt, denn wenn ich Await hinzufüge, kehrt die Funktion nie zurück. Zumindest nicht für die 20 Minuten, auf die ich gewartet habe, und ganz sicher nicht, nachdem alle Bestätigungen erledigt sind. Bei anderen Transaktionen dauert es höchstens eine Minute.

Ich hatte vor, etwas wie unten zu verwenden, um eine Quittung zu erhalten.

while (receiptTransaction == null)
{
       receiptTransaction = await transactions.GetTransactionReceipt.SendRequestAsync(transactionOfProposal);
       await Task.Delay(1000);
}
Hallo, das Problem, das Sie haben, ist, dass Ihnen das Benzin ausgegangen ist, die Transaktion war gültig, aber es wird ein Fehler auftreten, weil nicht genug Benzin vorhanden ist.
Ihr Problem mit der nicht zurückgegebenen Transaktion ist wirklich seltsam, die Transaktionen erfolgen sofort. Was verwendest du RPC oder IPC?
Sie können feststellen, ob Ihnen normalerweise das Gas ausgegangen ist, wenn das verwendete Gas = das gesendete Gas ist. Oder wenn Sie debug verwenden, ist das letzte Element ein Fehler. Ich werde mit einer Antwort weiter expandieren.
Was die Bytes betrifft, es handelt sich um einen Fehler. Es sollte in ein paar Stunden in einer Notversion veröffentlicht werden.
Haben Sie in Bezug auf die Transaktion, die nicht gesendet wird, Ihre Brieftasche vollständig synchronisiert? Es könnte warten..
Ich verwende RPC und habe 4 Knoten aktiv. Alle sind synchron.