Nethereum // Infura/RPC-Clients

Ich habe eine verdammt lange Zeit, Transaktionen zum Posten im Mainnet zu bekommen. Das Problem ist nicht mein Wallet-Guthaben oder Benzin. Eine Kontostandssuche für denselben Vertrag funktioniert korrekt. Ich kann diese offline signierte Transaktion (Rohtransaktionsäquivalent) jedoch nicht abrufen.

Ich habe versucht, verschiedene Parameter auf alle Arten zu übergeben, ich habe defaultGas/Price über den Transaktionsmanager festgelegt und die Methode SendTransactionAsync() mit den Überladungen verwendet, die sie nicht benötigen. Ich habe die Methode mit den Vertragsparametern einzeln gesendet (nicht in einem Objektarray wie unten). Ich habe die Nonce noch einmal überprüft - sie erscheint als 0. Ich habe sowohl diese als auch die Variante andwaitforreceipt ausprobiert.

var contract = web3.Eth.GetContract(contractAbi,contractAddress);
var function = contract.GetFunction("transfer");
hash = await function.SendTransactionAsync(@from: accountAddress, gas: new HexBigInteger(60000),
       gasPrice: HexBigInteger(40), value: null, functionInput: new object[] {  recipient, Web3.Convert.ToWei(value) });

Der Vertrag ist ein Standard-ERC20-Token. Gibt es einen Einblick, warum die Transaktion keine Fehler zurückgibt, Infura jedoch nicht sendet? Ich habe denselben Code viele Male mit einem normalen privaten Geth-Knoten verwendet.

Bearbeiten: Ich habe auch versucht, einige der anderen RPC-JSON-APIs zu erhalten. Wenn jemand vertraut ist, würden Sie bestätigen, dass dies der richtige Weg ist, indem Sie die Datennutzlast auf diese Weise senden? Ich erhalte einen „underpriced error“ von der Etherscan-API

        var contract = web3.Eth.GetContract(contractAbi, contractAddress);
        var function = contract.GetFunction("transfer");
        string fdata = function.GetData(new object[] { recipient, Web3.Convert.ToWei(value) });
        var txCount = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(accountAddress);

        var encoded = Web3.OfflineTransactionSigner.SignTransaction(privateKey: accountKey, to: contractAddress, amount: 0, nonce: txCount.Value, gasPrice: new BigInteger(70), gasLimit: new HexBigInteger(60000), data: fdata);
        encoded = "0x" + encoded;

Antworten (1)

Ich sehe, dass der Preis, den Sie verwenden, bereits ziemlich niedrig ist (er muss von Gwei in Wei umgerechnet werden), aber Sie werden auch davon profitieren, das Gas der Transaktion zu schätzen und andere Funktionen von Nethereum zu nutzen.

Zunächst einmal können wir einfach eine TransferFunction haben. Dies ist hauptsächlich ein Objekt, das die Übertragungsfunktion aus dem ERC20-Vertrag und die verschiedenen Parameter beschreibt. Dies erbt von ContractMessage, das andere Eigenschaften wie AddressFrom, Gas, GasPrice, Value (Ether-Wert) enthält, die Teil einer normalen Transaktion sind.

[Function("transfer", "bool")]
public class TransferFunction : ContractMessage
{
    [Parameter("address", "_to", 1)]
    public string To { get; set; }

    [Parameter("uint256", "_value", 2)]
    public BigInteger TokenAmount { get; set; }
}

Lassen Sie uns nun unsere benutzerdefinierten Variablen definieren:

var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
var receiverAddress = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe";
var privatekey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
var url = "https://rinkeby.infura.io/";

und erstellen Sie eine neue Instanz von Web3.

var web3 =  new Web3.Web3(new Account(privatekey), url);

Diese Instanz von Web3 wurde mit einem neuen Account-Objekt unter Verwendung des privaten Schlüssels erstellt. Dies ermöglicht es Web3 hauptsächlich, alle Transaktionen "offline" zu signieren, bevor sie gesendet werden, sodass Sie nicht alles selbst erstellen müssen.

Der nächste Schritt besteht darin, eine Instanz der Nachricht zu erstellen, die wir senden werden.

var transactionMessage = new TransferFunction()
            {
                FromAddress = senderAddress,
                To = receiverAddress,
                TokenAmount = 100,
                //Set our own price
                GasPrice =  Web3.Web3.Convert.ToWei(25, UnitConversion.EthUnit.Gwei)

            };

Hier wurde die FromAddress ausgefüllt (dies ist nicht erforderlich, da diese aus dem bereits festgelegten Konto ausgewählt wird), der Empfänger (To) aus dem Smart Contract, der Betrag und schließlich der GasPrice.

Dieser GasPrice ist ein benutzerdefinierter Preis (ohne Verwendung des Nethereum-Standards, der aufgrund von Preisschwankungen zu teuer sein könnte, und das ist er jetzt).

Um den Preis festzulegen, haben wir ihn von Gwei, der Einheit, die normalerweise für die Preisgestaltung verwendet wird, in Wei umgerechnet.

Nachdem wir unsere "Nachricht" / Transaktion bereit haben, können wir einen Transaktionshandler erstellen, der für das Senden der Transaktion verantwortlich ist.

var transferHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();

Ein weiterer Schritt (der optional ist), da dies automatisch für Sie erfolgt, ist die Schätzung der Kosten (in Gas) der Transaktion.

var estimate = await transferHandler.EstimateGasAsync(transactionMessage, ContractAddress);
transactionMessage.Gas = estimate.Value;

Und schließlich senden Sie die Transaktion:

var transactionHash = await transferHandler.SendRequestAsync(transactionMessage, ContractAddress);

Das vollständige Beispiel finden Sie hier: https://github.com/Nethereum/Nethereum.CQS.SimpleTokenTransfer/blob/master/Nethereum.CQS.SimpleTokenTransfer/Program.cs#L111-L155