public void AddTxNoOutput(TransactionMsg transaction) { if (IsolateTxHashes.Contains(transaction.Hash)) { return; } Storage.Instance.PutData(IsolateTxsContainerName, transaction.Hash, transaction); var myAccounts = AccountDac.Default.GetAccountBook(); var outputs = transaction.GetUtxoSets(); var myOutputs = outputs.Where(x => myAccounts.Contains(x.Account)); var spents = transaction.Inputs.Select(x => $"{x.OutputTransactionHash}_{x.OutputIndex}").ToArray(); Monitor.Enter(isolateObj); IsolateTxHashes.Add(transaction.Hash); foreach (var myOutput in myOutputs) { var key = $"{myOutput.TransactionHash}_{myOutput.Index}"; MyIsolateUtxoSets.Add(key, myOutput); } IsolateSpentUtxos.AddRange(spents); Monitor.Exit(isolateObj); if (IsolateTxsExecThread == null || !IsolateTxsExecThread.IsAlive) { IsolateTxsExecThread = new Thread(new ParameterizedThreadStart(Start)); IsolateTxsExecThread.Start(); } }
public static TransOM ConvertToOM(this TransactionMsg transaction) { TransOM result = new TransOM(); result.Hash = transaction.Hash; result.Size = transaction.Size; result.Timestamp = transaction.Timestamp; var firstUtxo = UtxoSetDac.Default.Get(transaction.Hash, 0); result.OutputAffirm = GlobalParameters.LocalHeight - firstUtxo.BlockHeight; result.OutputAmount = transaction.Outputs.Sum(x => x.Amount); result.InputList = new List <InputOM>(); if (transaction.InputCount == 1 && transaction.Inputs[0].OutputTransactionHash.Equals(DbDomains.EmptyHash)) { result.InputList.Add(new InputOM { AccountId = "Coinbase", Amount = 0, OutputTransactionHash = DbDomains.EmptyHash, UnlockScript = transaction.Inputs[0].UnlockScript }); } else { var spentHashIndexs = transaction.Inputs.Select(x => $"{x.OutputTransactionHash}_{x.OutputIndex}"); var utxos = UtxoSetDac.Default.Get(spentHashIndexs); transaction.Inputs.ForEach(x => { var utxo = utxos.FirstOrDefault(p => p.Index == x.OutputIndex && p.TransactionHash == x.OutputTransactionHash); if (utxo != null) { InputOM input = new InputOM(); input.AccountId = utxo.Account; input.Amount = utxo.Amount; input.OutputTransactionHash = utxo.TransactionHash; input.UnlockScript = utxo.LockScript; result.InputList.Add(input); } }); } result.OutputList = new List <OutputOM>(); var newUtxos = transaction.GetUtxoSets(); newUtxos.ForEach(x => { OutputOM output = new OutputOM(); output.Amount = x.Amount; output.LockScript = x.LockScript; output.ReceiverId = x.Account; output.Spent = UtxoSetDac.Default.Get(x.TransactionHash, x.Index).IsSpent; result.OutputList.Add(output); }); return(result); }
public static bool HasAddress(this TransactionMsg transaction, string account) { var newUtxos = transaction.GetUtxoSets(); if (newUtxos.Any(x => x.Account.Equals(account))) { return(true); } var spentHashIndexs = transaction.Inputs.Select(x => $"{x.OutputTransactionHash}_{x.OutputIndex}"); foreach (var input in transaction.Inputs) { var utxo = UtxoSetDac.Default.Get(input.OutputTransactionHash, input.OutputIndex); if (utxo != null && utxo.Account.Equals(account)) { return(true); } } return(false); }
public static List <PaymentCache> GetPayments(this TransactionMsg transaction, List <string> accounts = null) { List <PaymentCache> payments = new List <PaymentCache>(); if (accounts == null) { accounts = AccountDac.Default.GetAccountBook(); } var spentHashIndexs = transaction.Inputs.Select(x => $"{x.OutputTransactionHash}_{x.OutputIndex}"); var outUtxos = UtxoSetDac.Default.Get(spentHashIndexs); var hasmyInput = outUtxos.Any(x => accounts.Contains(x.Account)); var newUtxos = transaction.GetUtxoSets(); var otherUtxos = newUtxos.Where(x => !accounts.Contains(x.Account)); var hasOtherOuput = otherUtxos.Any(); if (!hasmyInput && newUtxos.Count == otherUtxos.Count()) { return(payments); } if (hasmyInput) { if (transaction.InputCount == 1 && transaction.Inputs[0].OutputTransactionHash == DbDomains.EmptyHash) { //挖矿所得 var myUtxo = newUtxos.FirstOrDefault(); PaymentCache payment = new PaymentCache(); payment.address = myUtxo.Account; payment.account = ""; payment.category = PaymentCatelog.Generate; payment.totalInput = 0; payment.totalOutput = myUtxo.Amount; payment.amount = myUtxo.Amount; payment.fee = 0; payment.txId = myUtxo.TransactionHash; payment.vout = 0; payment.time = myUtxo.TransactionTime; payment.size = transaction.Outputs.FirstOrDefault().Size; payments.Add(payment); } else if (!hasOtherOuput) { //给自己 var totalInput = outUtxos.Sum(x => x.Amount); //总输入 var totalOuput = newUtxos.Sum(x => x.Amount); //总支出 var totalfee = totalInput - totalOuput; //手续费 var output = newUtxos.FirstOrDefault(); PaymentCache payment = new PaymentCache(); payment.address = output.Account; payment.account = ""; payment.category = PaymentCatelog.Self; payment.amount = output.Amount; payment.fee = totalfee; payment.size = transaction.Outputs.Sum(x => x.Size); payment.time = output.TransactionTime; payment.totalInput = totalInput; payment.totalOutput = output.Amount; payment.txId = output.TransactionHash; payment.vout = 0; payments.Add(payment); } else { //发送 var totalInput = outUtxos.Sum(x => x.Amount); //总输入 var totalOuput = newUtxos.Sum(x => x.Amount); //总支出 var totalfee = totalInput - totalOuput; //手续费 bool useFee = false; foreach (var newUtxo in newUtxos) { if (accounts.Contains(newUtxo.Account)) { continue; } PaymentCache payment = new PaymentCache(); payment.category = PaymentCatelog.Send; payment.address = newUtxo.Account; payment.account = ""; if (!useFee) { payment.fee = totalfee; useFee = true; } payment.amount = newUtxo.Amount + payment.fee; payment.size = 85; payment.time = newUtxo.TransactionTime; payment.totalInput = totalInput; payment.totalOutput = newUtxo.Amount; payment.txId = newUtxo.TransactionHash; payment.vout = newUtxo.Index; payments.Add(payment); } } } else { //接收 var totalInput = outUtxos.Sum(x => x.Amount); //总输入 var totalOuput = newUtxos.Sum(x => x.Amount); //总支出 var totalfee = totalInput - totalOuput; //手续费 foreach (var newUtxo in newUtxos) { if (!accounts.Contains(newUtxo.Account)) { continue; } PaymentCache payment = new PaymentCache(); payment.category = PaymentCatelog.Receive; payment.address = newUtxo.Account; payment.account = ""; if (newUtxo.Index == 0) { payment.fee = totalfee; } payment.amount = newUtxo.Amount; payment.size = 85; payment.time = newUtxo.TransactionTime; payment.totalInput = totalInput; payment.totalOutput = newUtxo.Amount; payment.txId = newUtxo.TransactionHash; payment.vout = newUtxo.Index; payments.Add(payment); } } return(payments); }