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); }
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); }
public TransactionDTO(TransactionIn transactionIn) { TotalPrice = transactionIn.TotalPrice; ProductIDs = transactionIn.ProductIDs; ProductQuantity = transactionIn.ProductQuantity; TransactionDateTime = transactionIn.TransactionDateTime; CustomerID = transactionIn.CustomerID; }
public ActionResult DeleteConfirmed(int id) { TransactionIn transactionIn = db.TransactionIns.Find(id); db.TransactionIns.Remove(transactionIn); db.SaveChanges(); return(RedirectToAction("Index")); }
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); }
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)); }
// 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)); }
// 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)); }
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; } }
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); }