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?
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.
await proposalsFunction.SendTransactionAsync(AccountHelper.AddressFrom,...)
. Dasselbe passiert auch hier:await Web3.Personal.UnlockAccount.SendRequestAsync(AddressFrom, ...);
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;
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);
}
Juan Blanco
mechanik