public string SignTransaction(string key, string to, BigInteger amount, BigInteger nonce, BigInteger gasPrice, BigInteger gasLimit, string data) { var transaction = new Transaction(to, amount, nonce, gasPrice, gasLimit, data); transaction.Sign(new ECKey(key.HexToByteArray(), true)); return transaction.GetRLPEncoded().ToHex(); }
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()); }
public void ShouldResolveAddress() { //data from https://github.com/ethereum/go-ethereum/blob/506c9277911746dfbab0a585aee736bd3095f206/tests/files/TransactionTests/Homestead/ttTransactionTest.json var rlp = "0xf87c80018261a894095e7baea6a6c7c4c2dfeb977efac326af552d870a9d00000000000000000000000000010000000000000000000000000000001ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a01fffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804"; var tx = new Transaction(rlp.HexToByteArray()); Assert.Equal("67719a47cf3e3fe77b89c994d85395ad0f899d86", tx.Key.GetPublicAddress()); rlp = "0xf85f800182520894095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a01fffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804"; tx = new Transaction(rlp.HexToByteArray()); Assert.Equal("963f4a0d8a11b758de8d5b99ab4ac898d6438ea6", tx.Key.GetPublicAddress()); }
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); //Create a transaction from scratch var tx = new Transaction("0x13f022d72158410433cbd66f5dd8bf6d2d129924", 10000, 324, 10000000000000, 21000); 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 Transaction(rlp.HexToByteArray()); Assert.Equal(tx.Data, tx3.Data ?? new byte[] { }); Debug.WriteLine(tx.ToJsonHex()); var tx2 = new Transaction(tx.GetRLPEncoded()); Assert.Equal(EthECKey.GetPublicAddress(privateKey), tx2.Key.GetPublicAddress()); Assert.Equal(tx.GasLimit.ToHex(), tx3.GasLimit.ToHex()); Assert.Equal(tx.Nonce.ToHex(), tx3.Nonce.ToHex()); Assert.Equal(tx.GasPrice.ToHex(), tx3.GasPrice.ToHex()); Assert.Equal(tx.Value.ToHex(), tx3.Value.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()); }
public void TestTransactionFromSignedRLP() { var tx = new Transaction(RLP_ENCODED_SIGNED_TX.HexToByteArray()); Assert.Equal(HASH_TX, tx.RawHash.ToHex()); Assert.Equal(RLP_ENCODED_SIGNED_TX, tx.GetRLPEncoded().ToHex()); Assert.Equal(BigInteger.Zero, tx.Nonce.ToBigIntegerFromRLPDecoded()); Assert.Equal(testGasPrice.ToBigIntegerFromRLPDecoded(), tx.GasPrice.ToBigIntegerFromRLPDecoded()); Assert.Equal(testGasLimit.ToBigIntegerFromRLPDecoded(), tx.GasLimit.ToBigIntegerFromRLPDecoded()); Assert.Equal(testReceiveAddress.ToHex(), tx.ReceiveAddress.ToHex()); Assert.Equal(testValue.ToBigIntegerFromRLPDecoded(), tx.Value.ToBigIntegerFromRLPDecoded()); Assert.Null(tx.Data); Assert.Equal(27, tx.Signature.V); Assert.Equal("eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4", tx.Signature.R.ToByteArrayUnsigned().ToHex()); Assert.Equal("14a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1", tx.Signature.S.ToByteArrayUnsigned().ToHex()); }
public void TestTransactionFromUnSignedRLP() { var tx = new Transaction(RLP_ENCODED_UNSIGNED_TX.HexToByteArray()); Assert.Equal(RLP_ENCODED_UNSIGNED_TX, tx.GetRLPEncoded().ToHex()); Assert.Equal(BigInteger.Zero, tx.Nonce.ToBigIntegerFromRLPDecoded()); Assert.Equal(testGasPrice.ToBigIntegerFromRLPDecoded(), tx.GasPrice.ToBigIntegerFromRLPDecoded()); Assert.Equal(testGasLimit.ToBigIntegerFromRLPDecoded(), tx.GasLimit.ToBigIntegerFromRLPDecoded()); Assert.Equal(testReceiveAddress.ToHex(), tx.ReceiveAddress.ToHex()); Assert.Equal(testValue.ToBigIntegerFromRLPDecoded(), tx.Value.ToBigIntegerFromRLPDecoded()); Assert.Equal(HASH_TX, tx.RawHash.ToHex()); tx.Sign(new ECKey(KEY.HexToByteArray(), true)); tx.Key.Verify(tx.RawHash, tx.Signature); Assert.Equal(EthECKey.GetPublicAddress(KEY), tx.Key.GetPublicAddress()); }
public bool VerifyTransaction(string rlp) { var transaction = new Transaction(rlp.HexToByteArray()); return transaction.Key.VerifyAllowingOnlyLowS(transaction.RawHash, transaction.Signature); }
public string GetSenderAddress(string rlp) { var transaction = new Transaction(rlp.HexToByteArray()); return transaction.Key.GetPublicAddress(); }
public byte[] GetPublicKey(string rlp) { var transaction = new Transaction(rlp.HexToByteArray()); return transaction.Key.GetPubKey(false); }