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());
        }
Exemple #2
0
        /// <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);
        }