public void ShouldCreateASignedTransaction()
{
var privateKey = "b5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
var sendersAddress = "12890d2cce102216644c59daE5baed380d84830c";
var publicKey =
"87977ddf1e8e4c3f0a4619601fc08ac5c1dcf78ee64e826a63818394754cef52457a10a599cb88afb7c5a6473b7534b8b150d38d48a11c9b515dd01434cceb08";
//data use for other tools for comparison
Debug.WriteLine(new HexBigInteger(10000).HexValue);
Debug.WriteLine(new HexBigInteger(324).HexValue);
Debug.WriteLine(new HexBigInteger(10000000000000).HexValue);
Debug.WriteLine(new HexBigInteger(21000).HexValue);
//*****************************
//order in transaction = nonce, gasPrice, gasLimit, receiveAddress, value, data
//***************************
var nonce = 324.ToBytesForRLPEncoding();
var amount = 10000.ToBytesForRLPEncoding();
var to = "0x13f022d72158410433cbd66f5dd8bf6d2d129924".HexToByteArray();
var gasPrice = 10000000000000.ToBytesForRLPEncoding();
var gasLimit = 21000.ToBytesForRLPEncoding();
var data = "".HexToByteArray();
//Create a transaction from scratch
var tx = new SimpleRLPSigner(new byte[][] {nonce, gasPrice, gasLimit, to, amount, data});
tx.Sign(new ECKey(privateKey.HexToByteArray(), true));
var encoded = tx.GetRLPEncoded();
var rlp =
"f8698201448609184e72a0008252089413f022d72158410433cbd66f5dd8bf6d2d129924822710801ca0b1874eb8dab80e9072e57b746f8f0f281890568fd655488b0a1f5556a117775ea06ea87e03a9131cae14b5420cbfeb984bb2641d76fb32327d87cf0c9c0ee8f234";
Assert.Equal(rlp, encoded.ToHex());
//data used for other tools for comparison
Debug.WriteLine(encoded.ToHex());
Assert.Equal(EthECKey.GetPublicAddress(privateKey), tx.Key.GetPublicAddress());
var tx3 = new SimpleRLPSigner(rlp.HexToByteArray(), 6);
Assert.Equal(tx.Data[5], tx3.Data[5] ?? new byte[] {});
var tx2 = new Transaction(tx.GetRLPEncoded());
Assert.Equal(EthECKey.GetPublicAddress(privateKey), tx2.Key.GetPublicAddress());
//gas limit order 3
Assert.Equal(tx.Data[2].ToHex(), tx3.Data[2].ToHex());
//nonce order 1
Assert.Equal(tx.Data[0].ToHex(), tx3.Data[0].ToHex());
// gas price order 2
Assert.Equal(tx.Data[1].ToHex(), tx3.Data[1].ToHex());
//value order 5
Assert.Equal(tx.Data[4].ToHex(), tx3.Data[4].ToHex());
Assert.Equal(tx.RawHash.ToHex(), tx3.RawHash.ToHex());
Assert.Equal(tx3.Key.GetPublicAddress(), tx.Key.GetPublicAddress());
Assert.Equal(tx2.RawHash.ToHex(), tx3.RawHash.ToHex());
Assert.Equal(tx2.Key.GetPublicAddress(), tx.Key.GetPublicAddress());
}