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,
                    });
                }
            }
        }
        public void CreateTransactionFromHexAndVerifyInputAndOutputAddress()
        {
            IHost          app        = Program.CreateHostBuilder(new string[] { "--chain=CITY" }).Build();
            SyncConnection connection = app.Services.GetService <SyncConnection>();

            string      transactionHex = "0100000017a7d45b01390aaba0b4ea98b86b0276795cb95419ec5a952039f7a38987e8b1b93c69d86c000000006a47304402201fd3c470ce90701e6c3f3211e5c92c49fb77926b9e522d9ec387c868255db0b90220698fe2c9b978b69af96f83db990e53bb5d90af342b9467c98ad50eefad9983a4012103d815bebdc04a6afe739764bc4afc12ddf6048b780c9e6dfd958084b1f65f2028ffffffff0244a1eb0b000000001976a9147a877414603e5566a5ce09a63188c97091f3ea1388ac0000b26c6200d0031976a9147fb4ccdfb80d6f9b55cf53cf94acddeeabc33a5088ac00000000";
            Transaction transaction    = connection.Network.Consensus.ConsensusFactory.CreateTransaction(transactionHex);

            TxOut            output1    = transaction.Outputs[0];
            TxIn             input1     = transaction.Inputs[0];
            ScriptOutputInfo outputInfo = ScriptToAddressParser.GetAddressInternal(connection.Network, output1.ScriptPubKey);

            Assert.Equal("CTdmGuyx1DM2uWLSNR9LyHP7m6SE45n4z8", outputInfo.Addresses[0]);
            Assert.Equal(199991620, output1.Value.Satoshi);

            string sender = ScriptToAddressParser.GetSignerAddressInternal(connection.Network, input1.ScriptSig);

            Assert.Equal("CTdmGuyx1DM2uWLSNR9LyHP7m6SE45n4z8", sender);
        }
Beispiel #4
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);
        }