コード例 #1
0
        public override IEnumerable <byte> Serialize()
        {
            // https://bitcoin.org/en/developer-reference#raw-transaction-format
            var result = new List <byte>();

            result.AddRange(BitConverter.GetBytes(Version));
            result.Add((byte)TransactionCategories.Monetary);
            result.Add((byte)TransactionType);
            var inputCompactSize = new CompactSize();

            inputCompactSize.Size = (ulong)TransactionIn.Count();
            result.AddRange(inputCompactSize.Serialize());
            foreach (var input in TransactionIn)
            {
                result.AddRange(input.Serialize());
            }

            var outputCompactSize = new CompactSize();

            outputCompactSize.Size = (ulong)TransactionOut.Count();
            result.AddRange(outputCompactSize.Serialize());
            foreach (var output in TransactionOut)
            {
                result.AddRange(output.Serialize());
            }

            result.AddRange(BitConverter.GetBytes(LockTime));
            return(result);
        }
コード例 #2
0
        private static bool ValidateTransactionIns(TransactionIn txIn, Transaction transaction, UnspentTransactionOut[] unspentTxsOut)
        {
            var referencedUTxOut = unspentTxsOut.FirstOrDefault((uTxO) => uTxO.TransactionOutId == txIn.TransactionOutId && uTxO.TransactionOutIndex == txIn.TransactionOutIndex);

            if (referencedUTxOut == null)
            {
                return(false);
            }

            var address = referencedUTxOut.Address;

            byte[] signature64 = Convert.FromBase64String(txIn.Signature);
            var    publicKey   = CngKey.Import(signature64, CngKeyBlobFormat.EccFullPublicBlob);

            using (ECDsaCng dsa = new ECDsaCng(publicKey))
            {
                byte[] transactionIdBytes = Encoding.UTF8.GetBytes(transaction.Id);

                if (!dsa.VerifyData(transactionIdBytes, signature64))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #3
0
 public TransactionDTO(TransactionIn transactionIn)
 {
     TotalPrice          = transactionIn.TotalPrice;
     ProductIDs          = transactionIn.ProductIDs;
     ProductQuantity     = transactionIn.ProductQuantity;
     TransactionDateTime = transactionIn.TransactionDateTime;
     CustomerID          = transactionIn.CustomerID;
 }
コード例 #4
0
        public ActionResult DeleteConfirmed(int id)
        {
            TransactionIn transactionIn = db.TransactionIns.Find(id);

            db.TransactionIns.Remove(transactionIn);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
コード例 #5
0
        private static long GetTxInAmmount(TransactionIn transactionIn, UnspentTransactionOut[] unspentTransactionOuts)
        {
            var unspentAmount = FindUnspentTxOut(transactionIn.TransactionOutId, transactionIn.TransactionOutIndex, unspentTransactionOuts).FirstOrDefault();

            if (unspentAmount != null)
            {
                return(unspentAmount.Amount);
            }

            return(0);
        }
コード例 #6
0
 public ActionResult Edit([Bind(Include = "TransactionNoIn,Emp_ID,Stock_ID,IQuantity,IPrice,Date")] TransactionIn transactionIn)
 {
     if (ModelState.IsValid)
     {
         db.Entry(transactionIn).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.Emp_ID   = new SelectList(db.Employees, "Emp_ID", "password", transactionIn.Emp_ID);
     ViewBag.Stock_ID = new SelectList(db.Stocks, "Stock_ID", "Stock_Name", transactionIn.Stock_ID);
     return(View(transactionIn));
 }
コード例 #7
0
        // GET: TransactionIns/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            TransactionIn transactionIn = db.TransactionIns.Find(id);

            if (transactionIn == null)
            {
                return(HttpNotFound());
            }
            return(View(transactionIn));
        }
コード例 #8
0
        // GET: TransactionIns/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            TransactionIn transactionIn = db.TransactionIns.Find(id);

            if (transactionIn == null)
            {
                return(HttpNotFound());
            }
            ViewBag.Emp_ID   = new SelectList(db.Employees, "Emp_ID", "password", transactionIn.Emp_ID);
            ViewBag.Stock_ID = new SelectList(db.Stocks, "Stock_ID", "Stock_Name", transactionIn.Stock_ID);
            return(View(transactionIn));
        }
コード例 #9
0
        public async Task <ActionResult <TransactionOut> > PostTransaction([FromForm] TransactionIn transactionIn)
        {
            try
            {
                TransactionDTO transactionDTO = new TransactionDTO(transactionIn);
                _context.Transactions.Add(transactionDTO);
                await _context.SaveChangesAsync();

                //TODO: Customer amount update

                return(await GetTransaction(transactionDTO.ID));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw;
            }
        }
コード例 #10
0
        public static string SignTransaction(Transaction transaction,
                                             long transactionInIndex,
                                             string privateKey,
                                             UnspentTransactionOut[] unspentTransactionsOut)
        {
            TransactionIn transactionIn = transaction.TransactionsIn[transactionInIndex];
            string        dataToSign    = transaction.Id;

            UnspentTransactionOut refUnspentTransaction = FindUnspentTxOut(transactionIn.TransactionOutId, transactionIn.TransactionOutIndex, unspentTransactionsOut).FirstOrDefault();

            if (refUnspentTransaction == null)
            {
                throw new Exception("Could not find the referenced transaction out.");
            }

            var referencedAddress = refUnspentTransaction.Address;

            // Verify that the public key generated with the private key == referencedAddress, if false throw;

            string signature64;

            byte[] privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
            var    publicKey       = CngKey.Import(privateKeyBytes, CngKeyBlobFormat.EccFullPrivateBlob);

            using (ECDsaCng dsa = new ECDsaCng(publicKey))
            {
                byte[] dataAsBytes = Encoding.UTF8.GetBytes(dataToSign);

                //CngProperty prop = new CngProperty("privateKey", privateKeyBytes, CngPropertyOptions.None);
                //dsa.Key.SetProperty(prop);
                byte[] signature = dsa.SignData(dataAsBytes);
                signature64 = Convert.ToBase64String(signature);
            }

            return(signature64);
        }