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