Beispiel #1
0
        private IEnumerable <MapTransactionAddress> CreateInputs(long blockIndex, IEnumerable <NBitcoin.Transaction> transactions)
        {
            foreach (var transaction in transactions)
            {
                var rawTransaction = transaction;

                var id = rawTransaction.GetHash().ToString();

                for (int index = 0; index < rawTransaction.Outputs.Count; index++)
                {
                    var output = rawTransaction.Outputs[index];

                    var address = ScriptToAddressParser.GetAddress(this.syncConnection.Network, output.ScriptPubKey);

                    if (address == null)
                    {
                        continue;
                    }

                    yield return(new MapTransactionAddress
                    {
                        Id = string.Format("{0}-{1}", id, index),
                        TransactionId = id,
                        Value = output.Value,
                        Index = index,
                        Addresses = address.ToList(),
                        ScriptHex = output.ScriptPubKey.ToHex(),
                        BlockIndex = blockIndex,
                        CoinBase = rawTransaction.IsCoinBase,
                        CoinStake = this.syncConnection.Network.Consensus.IsProofOfStake && rawTransaction.IsCoinStake,
                    });
                }
            }
        }
Beispiel #2
0
        private IEnumerable <MapTransactionAddress> PoolToMapTransactionAddress(IEnumerable <NBitcoin.Transaction> pool, string address)
        {
            foreach (var transaction in pool)
            {
                var rawTransaction = transaction;

                var index = 0;
                foreach (var output in rawTransaction.Outputs)
                {
                    var addressIndex = ScriptToAddressParser.GetAddress(this.syncConnection.Network, output.ScriptPubKey);

                    if (address == addressIndex.FirstOrDefault())
                    {
                        continue;
                    }

                    var id = rawTransaction.GetHash().ToString();

                    yield return(new MapTransactionAddress
                    {
                        Id = string.Format("{0}-{1}", id, index),
                        TransactionId = id,
                        Value = output.Value,
                        Index = index++,
                        Addresses = new List <string> {
                            address
                        },
                        ScriptHex = output.ScriptPubKey.ToHex(),
                        BlockIndex = -1,
                        CoinBase = rawTransaction.IsCoinBase,
                        CoinStake = rawTransaction.IsCoinStake,
                    });
                }
            }
        }
Beispiel #3
0
        public SyncTransactionItems TransactionItemsGet(string transactionId)
        {
            NBitcoin.Transaction transaction;

            // Try to find the trx in disk
            SyncRawTransaction rawtrx = TransactionGetByHash(transactionId);

            if (rawtrx == null)
            {
                BitcoinClient client = CryptoClientFactory.Create(syncConnection.ServerDomain, syncConnection.RpcAccessPort, syncConnection.User, syncConnection.Password, syncConnection.Secure);

                Client.Types.DecodedRawTransaction res = client.GetRawTransactionAsync(transactionId, 0).Result;

                if (res.Hex == null)
                {
                    return(null);
                }

                transaction = syncConnection.Network.Consensus.ConsensusFactory.CreateTransaction(res.Hex);
                transaction.PrecomputeHash(false, true);
            }
            else
            {
                transaction = syncConnection.Network.Consensus.ConsensusFactory.CreateTransaction(rawtrx.RawTransaction);
                transaction.PrecomputeHash(false, true);
            }

            var ret = new SyncTransactionItems
            {
                RBF         = transaction.RBF,
                LockTime    = transaction.LockTime.ToString(),
                Version     = transaction.Version,
                IsCoinbase  = transaction.IsCoinBase,
                IsCoinstake = syncConnection.Network.Consensus.IsProofOfStake && transaction.IsCoinStake,
                Inputs      = transaction.Inputs.Select(v => new SyncTransactionItemInput
                {
                    PreviousTransactionHash = v.PrevOut.Hash.ToString(),
                    PreviousIndex           = (int)v.PrevOut.N,
                    WitScript    = v.WitScript.ToScript().ToHex(),
                    ScriptSig    = v.ScriptSig.ToHex(),
                    SequenceLock = v.Sequence.ToString(),
                }).ToList(),
                Outputs = transaction.Outputs.Select((output, index) => new SyncTransactionItemOutput
                {
                    Address      = ScriptToAddressParser.GetAddress(syncConnection.Network, output.ScriptPubKey)?.FirstOrDefault(),
                    Index        = index,
                    Value        = output.Value,
                    OutputType   = StandardScripts.GetTemplateFromScriptPubKey(output.ScriptPubKey)?.Type.ToString(),
                    ScriptPubKey = output.ScriptPubKey.ToHex()
                }).ToList()
            };


            // try to fetch spent outputs
            foreach (SyncTransactionItemOutput output in ret.Outputs)
            {
                output.SpentInTransaction = GetSpendingTransaction(transactionId, output.Index);
            }

            return(ret);
        }