Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }