I want to create a signed transaction using C#, which will later be used by Nethereum via JSON-RPC to call eth_sendRawTransaction.
I have the raw transaction and the private key, now how do I sign the data with the key?
To expand the other response, to provide offline transaction signing in Nethereum you can do the following:
First, you will need your private key, and sender address. You can retrieve the sender address from your private key using
Nethereum.Core.Signing.Crypto.EthECKey.GetPublicAddress(privateKey); if you only have the private key.
var privateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
Now using web3 first you will need to retrieve the total number of transactions of your sender address.
var web3 = new Web3();
var txCount = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(senderAddress);
The txCount will be used as the nonce to sign the transaction.
Now using web3 again, you can build an encoded transaction as following:
var encoded = web3.OfflineTransactionSigning.SignTransaction(privateKey, receiveAddress, 10, txCount.Value);
If you need to include the data and gas there are overloads for it.
You can verify an encoded transaction:
Or get the sender address from an encoded transaction:
To send the encoded transaction you will "SendRawTransaction"
var txId = await web3.Eth.Transactions.SendRawTransaction.SendRequestAsync("0x" + encoded);
You can see this example on the unit test
Or a "real" implementation on the Game sample
Nethereum now supports offline transaction signing, so there is no longer a need to use EdgeJs or similar to run node scripts inside the .NET environment.