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, }); } } }
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); }
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); }