public async void ShouldSignCorrectly() { await Task.Yield(); string privateKey = "0xa07cb7889ab3a164dcc72cb6103f2573c7ef2d4a855810594d2bf25df60bc39e"; PlasmaCore.Transactions.Transaction transaction = new PlasmaCore.Transactions.Transaction(); transaction.AddInput(2000, 0, 1); transaction.AddOutput("0xf86b5b1c2c8de1ea4dc737c849272340fa3561c5", "0x0000000000000000000000000000000000000000", 123); transaction.AddOutput("0xf86b5b1c2c8de1ea4dc737c849272340fa3561c5", "0x0000000000000000000000000000000000000000", 5555308); TypedDataTransactionEncoder txEncoder = new TypedDataTransactionEncoder(omgDomain); byte[] encodedTx = txEncoder.EncodeRaw(transaction); var rawHash = new Sha3Keccack().CalculateHash(encodedTx); var ecKey = new Nethereum.Signer.EthECKey(privateKey); var ecdsaSignature = ecKey.SignAndCalculateV(rawHash); string signature = Nethereum.Signer.EthECDSASignature.CreateStringSignature(ecdsaSignature); Assert.Equal("0xed0ff5633cb85aa0f64684759185f8a9f94fd1b654be5942d562bf64f504e3a96a83b90a5e50e50b8a75d4f711d1c0e56066519237dbd94e564084a561b8ba2f1b", signature.EnsureHexPrefix()); transaction.SetSignature(0, signature.HexToByteArray()); var signedEncodedTx = txEncoder.EncodeSigned(transaction).ToHex(true); Assert.Equal("0xf9012ef843b841ed0ff5633cb85aa0f64684759185f8a9f94fd1b654be5942d562bf64f504e3a96a83b90a5e50e50b8a75d4f711d1c0e56066519237dbd94e564084a561b8ba2f1bd2c58207d08001c3808080c3808080c3808080f8b3eb94f86b5b1c2c8de1ea4dc737c849272340fa3561c59400000000000000000000000000000000000000007bee94f86b5b1c2c8de1ea4dc737c849272340fa3561c59400000000000000000000000000000000000000008354c46ceb94000000000000000000000000000000000000000094000000000000000000000000000000000000000080eb94000000000000000000000000000000000000000094000000000000000000000000000000000000000080a00000000000000000000000000000000000000000000000000000000000000000", signedEncodedTx.EnsureHexPrefix()); }
/// <summary> /// Signs transaction /// </summary> /// <param name="profile">profile of the signer</param> /// <param name="transaction">transaction to sign</param> /// <returns>encoded signed transaction</returns> public async Task <string> SignTransaction(Profile profile, PlasmaCore.Transactions.Transaction transaction) { byte[] encodedTx = transactionEncoder.EncodeRaw(transaction); string signature = await profile.SignTransaction(encodedTx); transaction.SetSignature(profile.ID, signature.HexToByteArray()); return(transactionEncoder.EncodeSigned(transaction).ToHex(true)); }
/// <inheritdoc/> public Transaction CreateTransaction(byte[] rlpEncodedTrasaction) { Transaction transaction = new Transaction(); RLPCollection decodedList = (RLPCollection)RLP.Decode(rlpEncodedTrasaction)[0]; bool isSigned = (decodedList.Count == 4); int inputIdx = isSigned ? 1 : 0; int outputIdx = isSigned ? 2 : 1; int metadataIdx = isSigned ? 3 : 2; RLPCollection inputData = (RLPCollection)decodedList[inputIdx]; foreach (RLPCollection input in inputData) { if (input.Count == 3) { transaction.AddInput(Transaction.ToUInt64FromRLPDecoded(input[0].RLPData), Transaction.ToUInt16FromRLPDecoded(input[1].RLPData), Transaction.ToUInt16FromRLPDecoded(input[2].RLPData)); } } RLPCollection outputData = (RLPCollection)decodedList[outputIdx]; foreach (RLPCollection output in outputData) { if (output.Count == 3) { transaction.AddOutput(output[0].RLPData.ToHex().PadLeft(32, '0').EnsureHexPrefix(), output[1].RLPData.ToHex().PadLeft(32, '0').EnsureHexPrefix(), output[2].RLPData.ToBigIntegerFromRLPDecoded()); } } if (metadataIdx < decodedList.Count) { RLPItem metadata = (RLPItem)decodedList[metadataIdx]; transaction.SetMetadata(metadata.RLPData.ToHex().HexToByteArray()); } if (isSigned) { RLPCollection signatureData = (RLPCollection)decodedList[0]; for (Int32 i = 0; i < signatureData.Count; ++i) { transaction.SetSignature(i, signatureData[i].RLPData); } } return(transaction); }