Beispiel #1
0
            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);
                }
            }
Beispiel #2
0
            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);
            }
Beispiel #3
0
            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);
            }
Beispiel #4
0
            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
                //  };
            }