public override IEnumerable <TxIn> FindSpent(IEnumerable <Transaction> transactions) { return (transactions .SelectMany(t => t.Inputs) .Select(i => new { TxIn = i, Parameters = template.ExtractScriptSigParameters(i.ScriptSig) }) .Where(r => r.Parameters != null && r.Parameters.PublicKey.ID == KeyId) .Select(r => r.TxIn)); }
public void CanParseAndGeneratePayToPubKeyScript() { var payToPubHash = new PayToPubkeyHashTemplate(); var scriptPubKey = new Script("OP_DUP OP_HASH160 b72a6481ec2c2e65aa6bd9b42e213dce16fc6217 OP_EQUALVERIFY OP_CHECKSIG"); var pubKey = payToPubHash.ExtractScriptPubKeyParameters(scriptPubKey); Assert.Equal("b72a6481ec2c2e65aa6bd9b42e213dce16fc6217", pubKey.ToString()); var scriptSig = new Script("3044022064f45a382a15d3eb5e7fe72076eec4ef0f56fde1adfd710866e729b9e5f3383d02202720a895914c69ab49359087364f06d337a2138305fbc19e20d18da78415ea9301 0364bd4b02a752798342ed91c681a48793bb1c0853cbcd0b978c55e53485b8e27c"); var sigResult = payToPubHash.ExtractScriptSigParameters(scriptSig); Assert.Equal("3044022064f45a382a15d3eb5e7fe72076eec4ef0f56fde1adfd710866e729b9e5f3383d02202720a895914c69ab49359087364f06d337a2138305fbc19e20d18da78415ea9301", Encoders.Hex.EncodeData(sigResult.TransactionSignature.ToBytes())); Assert.Equal("0364bd4b02a752798342ed91c681a48793bb1c0853cbcd0b978c55e53485b8e27c", sigResult.PublicKey.ToString()); Assert.Equal(payToPubHash.GenerateScriptSig(sigResult.TransactionSignature, sigResult.PublicKey).ToString(), scriptSig.ToString()); Assert.Equal(payToPubHash.GenerateScriptPubKey(pubKey).ToString(), scriptPubKey.ToString()); }
public async Task <Transaction> GetTransaction(string id) { var tx = await _client.GetRawTransactionAsync(id); if (tx == null) { return(null); } var transaction = new Transaction { Blockhash = tx.Blockhash, TransactionId = tx.Txid, Size = tx.Size, TransactionIn = new List <In>(), TransactionsOut = new List <Out>(), }; // this fails b/c no input validation // Debug.Assert(id == transaction.TransactionId); int index = 0; foreach (var rpcIn in tx.Vin) { var inp = new In { Index = index }; if (rpcIn.Coinbase == null) { string hexScript = rpcIn.ScriptSig.Hex; byte[] decodedScript = Encoders.Hex.DecodeData(hexScript); Script script = new Script(decodedScript); PayToPubkeyHashTemplate template = new PayToPubkeyHashTemplate(); PayToPubkeyHashScriptSigParameters param = template.ExtractScriptSigParameters(script); if (param != null) { PubKey pubKey = param.PublicKey; BitcoinPubKeyAddress address = pubKey.GetAddress(NetworkSpec.ObsidianMain()); inp.Address = address.ToString(); } else { inp.Address = "none"; } inp.TransactionId = rpcIn.Txid; inp.VOut = (int)rpcIn.Vout; inp.Sequence = rpcIn.Sequence; inp.ScriptSigHex = rpcIn.ScriptSig.Hex; } else { inp.Coinbase = rpcIn.Coinbase; inp.Sequence = rpcIn.Sequence; } transaction.TransactionIn.Add(inp); } if (transaction.TransactionIn[0].Coinbase != null) { //Debug.Assert(transaction.TransactionIn.Count == 1); transaction.IsCoinBase = true; } index = 0; foreach (var output in tx.Vout) { var @out = new Out { TransactionId = transaction.TransactionId, Value = output.Value, Quantity = output.N, AssetId = null, Index = index++ }; if (output.ScriptPubKey.Addresses != null) // Satoshi 14.2 { @out.Address = output.ScriptPubKey.Addresses.FirstOrDefault(); } else { string hexScript = output.ScriptPubKey.Hex; if (!string.IsNullOrEmpty(hexScript)) { byte[] decodedScript = Encoders.Hex.DecodeData(hexScript); Script script = new Script(decodedScript); var pubKey = PayToPubkeyTemplate.Instance.ExtractScriptPubKeyParameters(script); BitcoinPubKeyAddress address = pubKey.GetAddress(NetworkSpec.ObsidianMain()); @out.Address = address.ToString(); } else { @out.Address = "none"; } } transaction.TransactionsOut.Add(@out); } return(transaction); }