public void LoadImage(string pathImage) { string pathFile = Path.Combine( pathImage, "ImageWallet"); int index = 0; byte[] buffer = File.ReadAllBytes(pathFile); while (index < buffer.Length) { var tXOutput = new TXOutputWallet(); tXOutput.TXID = new byte[HASH_BYTE_SIZE]; Array.Copy(buffer, index, tXOutput.TXID, 0, HASH_BYTE_SIZE); index += HASH_BYTE_SIZE; tXOutput.TXIDShort = BitConverter.ToInt32(tXOutput.TXID, 0); tXOutput.OutputIndex = BitConverter.ToInt32(buffer, index); index += 4; tXOutput.Value = BitConverter.ToUInt64(buffer, index); index += 8; tXOutput.ScriptPubKey = new byte[LENGTH_P2PKH]; Array.Copy(buffer, index, tXOutput.ScriptPubKey, 0, LENGTH_P2PKH); index += LENGTH_P2PKH; TXOutputsSpendable.Add(tXOutput); } }
public bool TrySpend(TXInput tXInput) { TXOutputWallet output = TXOutputsSpendable.Find(o => o.TXIDShort == tXInput.TXIDOutputShort && o.OutputIndex == tXInput.OutputIndex); if (output == null || !output.TXID.IsEqual(tXInput.TXIDOutput)) { return(false); } TXOutputsSpendable.Remove(output); Console.WriteLine( "Spent output {0} in tx {1} with {2} satoshis.", output.OutputIndex, output.TXID.ToHexString(), output.Value); return(true); }
public TX CreateAnchorToken( byte[] dataOPReturn) { ulong fee = 28000; TXOutputWallet outputSpendable = TXOutputsSpendable.Find(t => t.Value > fee); if (outputSpendable == null) { throw new BitcoinException("No spendable output found."); } List <byte> tXRaw = new List <byte>(); byte[] version = { 0x01, 0x00, 0x00, 0x00 }; tXRaw.AddRange(version); byte countInputs = 1; tXRaw.Add(countInputs); tXRaw.AddRange(outputSpendable.TXID); tXRaw.AddRange(BitConverter.GetBytes( outputSpendable.OutputIndex)); int indexScriptSig = tXRaw.Count; tXRaw.Add(LENGTH_P2PKH); tXRaw.AddRange(outputSpendable.ScriptPubKey); byte[] sequence = { 0xFF, 0xFF, 0xFF, 0xFF }; tXRaw.AddRange(sequence); byte countOutputs = 2; //(byte)(valueChange == 0 ? 1 : 2); tXRaw.Add(countOutputs); ulong valueChange = outputSpendable.Value - fee; tXRaw.AddRange(BitConverter.GetBytes( valueChange)); tXRaw.Add(LENGTH_P2PKH); tXRaw.AddRange(PREFIX_P2PKH); tXRaw.AddRange(PublicKeyHash160); tXRaw.AddRange(POSTFIX_P2PKH); tXRaw.AddRange(BitConverter.GetBytes( (ulong)0)); tXRaw.Add((byte)(dataOPReturn.Length + 2)); tXRaw.Add(OP_RETURN); tXRaw.Add((byte)dataOPReturn.Length); tXRaw.AddRange(dataOPReturn); var lockTime = new byte[4]; tXRaw.AddRange(lockTime); byte[] sigHashType = { 0x01, 0x00, 0x00, 0x00 }; tXRaw.AddRange(sigHashType); byte[] signature = Crypto.GetSignature( PrivKeyDec, tXRaw.ToArray()); var scriptSig = new List <byte>(); scriptSig.Add((byte)(signature.Length + 1)); scriptSig.AddRange(signature); scriptSig.Add(0x01); byte[] publicKey = Crypto.GetPubKeyFromPrivKey(PrivKeyDec); scriptSig.Add((byte)publicKey.Length); scriptSig.AddRange(publicKey); var tXRawPreScriptSig = tXRaw.Take(indexScriptSig); var tXRawPostScriptSig = tXRaw.Skip(indexScriptSig + LENGTH_P2PKH + 1); tXRaw = tXRawPreScriptSig .Concat(new byte[] { (byte)scriptSig.Count }) .Concat(scriptSig) .Concat(tXRawPostScriptSig) .ToList(); tXRaw.RemoveRange(tXRaw.Count - 4, 4); var parser = new BlockParser(); int indexTXRaw = 0; byte[] tXRawArray = tXRaw.ToArray(); TX tX = parser.ParseTX( false, tXRawArray, ref indexTXRaw); tX.TXRaw = tXRawArray; return(tX); }
public void SendAnchorToken( byte[] dataOPReturn) { ulong fee = 49400; TXOutputWallet outputSpendable = TXOutputsSpendable.Find(t => t.Value > fee); outputSpendable = new TXOutputWallet { TXID = "391196f04bbf34ee921a6cbc93cfa198729281bd369e486d0377fabbf86c8c2f".ToBinary().ToArray(), OutputIndex = 0, ScriptPubKey = "76a914d4dc5e7b47130caae480d11a325856029f2cd87388ac".ToBinary().Reverse().ToArray(), Value = 50000 }; if (outputSpendable == null) { throw new ProtocolException("No spendable output found."); } List <byte> tXRaw = new List <byte>(); byte[] version = { 0x01, 0x00, 0x00, 0x00 }; tXRaw.AddRange(version); byte countInputs = 1; tXRaw.Add(countInputs); tXRaw.AddRange(outputSpendable.TXID); tXRaw.AddRange(BitConverter.GetBytes( outputSpendable.OutputIndex)); int indexScriptSig = tXRaw.Count; tXRaw.Add(LENGTH_P2PKH); tXRaw.AddRange(outputSpendable.ScriptPubKey); byte[] sequence = { 0xFF, 0xFF, 0xFF, 0xFF }; tXRaw.AddRange(sequence); byte countOutputs = 2; //(byte)(valueChange == 0 ? 1 : 2); tXRaw.Add(countOutputs); ulong valueChange = outputSpendable.Value - fee; tXRaw.AddRange(BitConverter.GetBytes( valueChange)); tXRaw.Add(LENGTH_P2PKH); tXRaw.AddRange(PREFIX_P2PKH); tXRaw.AddRange(PublicKeyHash160); tXRaw.AddRange(POSTFIX_P2PKH); tXRaw.AddRange(BitConverter.GetBytes( (ulong)0)); tXRaw.Add((byte)(dataOPReturn.Length + 2)); tXRaw.Add(OP_RETURN); tXRaw.Add((byte)dataOPReturn.Length); tXRaw.AddRange(dataOPReturn); byte[] lockTime = new byte[4]; tXRaw.AddRange(lockTime); byte[] sigHashType = { 0x01, 0x00, 0x00, 0x00 }; tXRaw.AddRange(sigHashType); byte[] signature = Crypto.GetSignature( PrivKeyDec, tXRaw.ToArray()); List <byte> scriptSig = new List <byte>(); scriptSig.Add((byte)(signature.Length + 1)); scriptSig.AddRange(signature); scriptSig.Add(0x01); byte[] publicKey = Crypto.GetPubKeyFromPrivKey( PrivKeyDec); scriptSig.Add((byte)publicKey.Length); scriptSig.AddRange(publicKey); var tXRawPreScriptSig = tXRaw.Take(indexScriptSig); var tXRawPostScriptSig = tXRaw.Skip(indexScriptSig + LENGTH_P2PKH + 1); tXRaw = tXRawPreScriptSig .Concat(new byte[] { (byte)scriptSig.Count }) .Concat(scriptSig) .Concat(tXRawPostScriptSig) .ToList(); tXRaw.RemoveRange(tXRaw.Count - 4, 4); var txArray = tXRaw.ToArray(); txArray = txArray.Reverse().ToArray(); Console.WriteLine(txArray.ToHexString()); //byte[] script = PREFIX_OP_RETURN.Concat(data).ToArray(); //var tXOutputOPReturn = // new TXOutput // { // Value = 0, // Buffer = script, // StartIndexScript = 0, // LengthScript = script.Length // }; }