Exemple #1
0
        private void RunTest(TestVector test)
        {
            var       seed   = TestUtils.ParseHex(test.strHexMaster);
            ExtKey    key    = new ExtKey(seed);
            ExtPubKey pubkey = key.Neuter();

            foreach (TestDerivation derive in test.vDerive)
            {
                byte[] data = key.ToBytes();
                Assert.Equal(74, data.Length);
                data = pubkey.ToBytes();
                Assert.Equal(74, data.Length);
                // Test private key
                BitcoinExtKey b58key = Network.PurpleMain.CreateBitcoinExtKey(key);
                Assert.True(b58key.ToString() == derive.prv);
                // Test public key
                BitcoinExtPubKey b58pubkey = Network.PurpleMain.CreateBitcoinExtPubKey(pubkey);
                Assert.True(b58pubkey.ToString() == derive.pub);
                // Derive new keys
                ExtKey    keyNew    = key.Derive(derive.nChild);
                ExtPubKey pubkeyNew = keyNew.Neuter();
                if (!((derive.nChild & 0x80000000) != 0))
                {
                    // Compare with public derivation
                    ExtPubKey pubkeyNew2 = pubkey.Derive(derive.nChild);
                    Assert.True(pubkeyNew == pubkeyNew2);
                }
                key    = keyNew;
                pubkey = pubkeyNew;
            }
        }
        //https://github.com/libbitcoin/libbitcoin/blob/master/test/stealth.cpp
        public void BitFieldCorrectlyMatchData()
        {
            var bit   = (uint)1358086238;
            var o     = new BitField(bit, 32);
            var tests = new[]
            {
                new
                {
                    Encoded  = (uint)0x691cf48b,
                    BitCount = 27,
                    Data     = "8bf42c79",
                    Match    = false
                },
                new
                {
                    Encoded  = (uint)0x691cf48b,
                    BitCount = 27,
                    //Data miss match (1 instead of 2)
                    Data  = "8bf41c79",
                    Match = true
                }
            };

            foreach (var test in tests)
            {
                BitField field = new BitField(test.Encoded, test.BitCount);
                Assert.Equal(test.Match, field.Match(Utils.ToUInt32(TestUtils.ParseHex(test.Data), true)));
            }
        }
        //https://wiki.unsystem.net/index.php/DarkWallet/Stealth#Bitfield_value
        public void BitFieldCorrectlyInterpreted()
        {
            var tests = new[]
            {
                new
                {
                    Encoded  = (uint)1763505291,
                    BitCount = 32,
                    Raw      = "8bf41c69"
                },
                new
                {
                    Encoded  = (uint)1,
                    BitCount = 8,
                    Raw      = "0100"
                },
                new
                {
                    Encoded  = (uint)1,
                    BitCount = 7,
                    Raw      = "01"
                }
            };

            foreach (var test in tests)
            {
                var bitField = new BitField(test.Encoded, test.BitCount);
                Assert.Equal(TestUtils.ParseHex(test.Raw), bitField.GetRawForm());
                Assert.Equal(test.Encoded, bitField.GetEncodedForm());

                bitField = new BitField(TestUtils.ParseHex(test.Raw), test.BitCount);
                Assert.Equal(test.Encoded, bitField.GetEncodedForm());
                Assert.Equal(TestUtils.ParseHex(test.Raw), bitField.GetRawForm());
            }
        }
        private static void PlaySplit()
        {
            var scan = new Key(TestUtils.ParseHex("cc411aab02edcd3bccf484a9ba5280d4a774e6f81eac8ebec9cb1c2e8f73020a"));
            var addr = new BitcoinStealthAddress("waPYjXyrTrvXjZHmMGdqs9YTegpRDpx97H5G3xqLehkgyrrZKsxGCmnwKexpZjXTCskUWwYywdUvrZK7L2vejeVZSYHVns61gm8VfU", Network.TestNet);

            var sender   = new BitcoinSecret("privatekey", Network.TestNet);
            var receiver = new BitcoinSecret("privatekey", Network.TestNet);

            MakePayment(sender, receiver, Money.Parse("1.00"));
        }
        public void CanParseStealthAddress()
        {
            var tests = new[]
            {
                //Test vector created with sx
                //sx stealth-newkey -> ScanSecret,SpendSecret,StealthAddress
                //sx stealth-show-addr StealthAddress -> ScanPubKey,SpendPubKey,RequiredSignature...
                new
                {
                    ScanSecret   = "9ac9fdee7c2c19611bcbed8959e1c61d00cdc27cf17bb50a1f4d29db7f953632",
                    SpendSecrets = new[] {
                        "4e2fa767cc241c3fa4c512d572b2758a3960a06d374f2c819fe409b161d72ad4"
                    },
                    StealthAddress = "vJmsmwE8cVt9ytJxBuY2jayh8RAfvpG42CyNVYpeVZAkHaiwASobUEzskpXMwbH1TZNBLoxWWYem5WuZewTL8xz3upJ75zKcdVmTfg",
                    ScanPubKey     = "021ce89be99a229d123e8bc13ffbcb66722d6200bbeb1d90ddddbf97df82ed2672",
                    SpendPubKeys   = new[]
                    {
                        "03c197525241d3d70bbf33bb2b54d41e6b9595a92a2c6b7bf7157727c017f0154a"
                    },
                    RequiredSignature = 1,
                    Options           = 0,
                    PrefixLength      = 0,
                    PrefixValue       = "",
                }
            };

            foreach (var test in tests)
            {
                var scanSecret = new Key(TestUtils.ParseHex(test.ScanSecret));
                AssertEx.CollectionEquals(scanSecret.PubKey.ToBytes(), TestUtils.ParseHex(test.ScanPubKey));

                var stealth = new BitcoinStealthAddress(test.StealthAddress, Network.Main);
                Assert.Equal(test.RequiredSignature, stealth.SignatureCount);
                Assert.Equal(test.PrefixLength, stealth.Prefix.BitCount);
                AssertEx.CollectionEquals(stealth.Prefix.GetRawForm(), TestUtils.ParseHex(test.PrefixValue));
                Assert.Equal(test.Options, stealth.Options);

                AssertEx.CollectionEquals(stealth.ScanPubKey.ToBytes(),
                                          TestUtils.ParseHex(test.ScanPubKey));
                for (int i = 0; i < test.SpendPubKeys.Length; i++)
                {
                    AssertEx.CollectionEquals(stealth.SpendPubKeys[i].ToBytes(),
                                              TestUtils.ParseHex(test.SpendPubKeys[i]));

                    var spendSecret = new Key(TestUtils.ParseHex(test.SpendSecrets[i]));
                    AssertEx.CollectionEquals(stealth.SpendPubKeys[i].ToBytes(), TestUtils.ParseHex(test.SpendPubKeys[i]));
                }
            }
        }
        private Key AssertKeys(string key, string pub)
        {
            if (key == null)
            {
                return(null);
            }
            Key k = new Key(TestUtils.ParseHex(key));

            if (pub != null)
            {
                PubKey p = new PubKey(TestUtils.ParseHex(pub));
                AssertEx.Equal(k.PubKey.ToBytes(), p.ToBytes());
            }
            return(k);
        }
Exemple #7
0
        public void CanCreateAssetAddress()
        {
            var key     = new Key(TestUtils.ParseHex("18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725"));
            var address = key.PubKey.Decompress().GetAddress(Network.Main);

            Assert.Equal("16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM", address.ToString());

            Script script = Script.FromBitcoinAddress(address);

            Assert.Equal("OP_DUP OP_HASH160 010966776006953D5567439E5E39F86A0D273BEE OP_EQUALVERIFY OP_CHECKSIG", script.ToString().ToUpper());

            var scriptAddress = script.GetAddress(Network.Main);

            Assert.Equal("36hBrMeUfevFPZdY2iYSHVaP9jdLd9Np4R", scriptAddress.ToString());
        }
Exemple #8
0
        public void CanParseAlertAndChangeUpdatePayloadAndSignature()
        {
            var          alertStr = "73010000003766404f00000000b305434f00000000f2030000f1030000001027000048ee00000064000000004653656520626974636f696e2e6f72672f666562323020696620796f7520686176652074726f75626c6520636f6e6e656374696e67206166746572203230204665627275617279004730450221008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e8a4f1";
            AlertPayload alert    = new AlertPayload();

            alert.FromBytes(TestUtils.ParseHex(alertStr));
            Assert.True(alert.CheckSignature(Network.Main));
            Assert.Equal("See bitcoin.org/feb20 if you have trouble connecting after 20 February", alert.StatusBar);
            alert.StatusBar = "Changing...";
            Assert.True(alert.CheckSignature(Network.Main));
            alert.UpdatePayload();
            Assert.False(alert.CheckSignature(Network.Main));
            Key key = new Key();

            alert.UpdateSignature(key);
            Assert.True(alert.CheckSignature(key.PubKey));
        }
Exemple #9
0
        //https://en.bitcoin.it/wiki/Difficulty
        public void CanReadConvertTargetToDifficulty()
        {
            var packed   = new Target(TestUtils.ParseHex("1b0404cb"));
            var unpacked = new Target(uint256.Parse("00000000000404CB000000000000000000000000000000000000000000000000"));

            Assert.Equal(packed, unpacked);
            Assert.Equal(packed, new Target(0x1b0404cb));

            packed = new Target(TestUtils.ParseHex("1b8404cb"));
            Assert.True(packed.ToBigInteger().CompareTo(BigInteger.Zero) < 0);
            Assert.Equal(packed, new Target(0x1b8404cb));

            packed = new Target(TestUtils.ParseHex("1d00ffff"));
            Assert.Equal(1, packed.Difficulty);
            Assert.Equal(Target.Difficulty1, packed);

            packed = new Target(TestUtils.ParseHex("1b0404cb"));
            Assert.Equal(16307.420938523983D, packed.Difficulty, "420938523983".Length);

            Assert.Equal(packed, new Target((uint)0x1b0404cb));
            Assert.Equal((uint)packed, (uint)0x1b0404cb);

            packed = new Target((uint)0x1b0404d1);
            Assert.Equal(16307.04943863739, packed.Difficulty, "420938523983".Length);

            packed = new Target(0x1d00ffff);
            Assert.Equal((uint)packed, (uint)0x1d00ffff);

            //Check http://blockchain.info/block-index/392672/0000000000000000511e193e22d2dfc02aea8037988f0c58e9834f4550e97702
            packed = new Target(419470732);
            Assert.Equal(6978842649.592383, packed.Difficulty, "592383".Length);
            Assert.Equal((uint)packed, (uint)419470732);
            Assert.True(uint256.Parse("0x0000000000000000511e193e22d2dfc02aea8037988f0c58e9834f4550e97702") < packed.ToUInt256());

            //Check http://blockchain.info/block-index/394713/0000000000000000729a4a7e084c90f932d038c407a6535a51dfecdfba1c8906
            Assert.True(uint256.Parse("0x0000000000000000729a4a7e084c90f932d038c407a6535a51dfecdfba1c8906 ") < new Target(419470732).ToUInt256());

            var genesis = Network.Main.GetGenesis();

            Assert.True(genesis.GetHash() < genesis.Header.Bits.ToUInt256());
            Assert.True(Target.Difficulty1 == Target.Difficulty1);
        }
        public void CanCreateAssetAddress()
        {
            //The issuer first generates a private key: 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725.
            var key = new Key(TestUtils.ParseHex("18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725"));
            //He calculates the corresponding address: 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM.
            var address = key.PubKey.Decompress().GetAddress(Network.Main);

            Assert.Equal("16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM", address.ToString());

            //Next, he builds the Pay-to-PubKey-Hash script associated to that address: OP_DUP OP_HASH160 010966776006953D5567439E5E39F86A0D273BEE OP_EQUALVERIFY OP_CHECKSIG
            Script script = Script.CreateFromDestinationAddress(address);

            Assert.Equal("OP_DUP OP_HASH160 010966776006953D5567439E5E39F86A0D273BEE OP_EQUALVERIFY OP_CHECKSIG", script.ToString().ToUpper());

            //36hBrMeUfevFPZdY2iYSHVaP9jdLd9Np4R.
            var scriptAddress = script.GetScriptAddress(Network.Main);

            Assert.Equal("36hBrMeUfevFPZdY2iYSHVaP9jdLd9Np4R", scriptAddress.ToString());


            Assert.Equal("36hBrMeUfevFPZdY2iYSHVaP9jdLd9Np4R", key.PubKey.Decompress().GetAddress(Network.Main).GetScriptAddress().ToString());
        }
        //https://github.com/libbitcoin/libbitcoin/blob/master/test/stealth.cpp
        public void BitFieldCanFetchTransaction()
        {
            var tests = new[]
            {
                new
                {
                    Encoded     = "deadbeef",
                    BitCount    = 5,
                    Transaction = "0100000001bd365d65c6eeee2d3ae29c6e1b0fb22f70f0135220eac1273c92a13b6039ecdf000000006b48304502202551626a52a088ea585f2aaa8afe1c1b7bc52ea8e577e149f20f0f5f2fc54485022100913643c6a1e54b5284d1c108519d9243213373256ff95ab6c7e3d162175c9e28012102881c1427e826f230246197f7f693f1c923ad2afea1dad901d1c870f7e310c895ffffffff020000000000000000286a2606ab3099ae0359222b4a2dd9a21ebd70331794fb05b0bd605bd9660fdf895906b1a227edcbec306c3402000000001976a9142f62432f367dc3cf67e68f814cc2a3ed5b2e8cec88ac00000000",
                }
                , new
                {
                    Encoded     = "deadbeef",
                    BitCount    = 5,
                    Transaction = "01000000028d8d968818e464db9dc876eb4edd59e62913d849603ba10afe033159b55652dc010000006b483045022100992e7ce4516cdabffae823557f5854c6ca7a424cc2fe7a9b94f439ecca839f84022025b871cf499f7b0eebcf751a83e7ffe9473b6c5227f95d9989ef8e98937112760121038795ff1d07ef7092e03d612f187d1281705b36d0c11ecf4b11167beb7efc3437ffffffff723372d920d8eaa6bd1fe6ec5adaf913b6d8a48655acded49a3f09191cdf9f3a010000006a47304402206f6ca054242fe5b410d743ae238049799eccdd88637d555ad48d8da1a854bd0802201b13217d0a6a7cf3467074aa8964f3f365541304142503d91813baa0117d1a8101210258cedc6e590493838c612a394d53ffbb283638f9d1d49e1c571b15a885f405d9ffffffff05f0874b00000000001976a914cd08dcd94ba88488b4c02c82fc11fc63fee4e30c88acc0e1e400000000001976a9148784cbfe99e86135d40d276c58fcbbf37af1b48e88ac0000000000000000286a260689d0267d021cc402cf764f2c88138028b6d5c0f06d5caa34edffc1d2286048f0162756ebf1f0874b00000000001976a914923d77bbdd3d29dd4844a51629514bac9e8a2c4d88aca30c0000000000001976a9143aaa9db7a3fbc5dcc9d121a157bf63aaaee9d8f588ac00000000",
                },
                new
                {
                    Encoded     = "deadbeef",
                    BitCount    = 5,
                    Transaction = "010000000288b6952f8357b5a8271f6c0608ea779549bf0a9ae72213ce433f7a9c90190be6000000006b4830450221008b1b7369d7bf8a1dd99e6a260ef969840d633ba81fc379bf4f5469afd3b288e2022077e21dd12c1d8b2a4ab2e58fb0113b9e3bb77db4439483f7a8311cac3ad6ce9a012102b0c2eb0cc505a4c9fb62df8a7fcdcc00ddab43ff5752ebc51a0dae11fbfb0648ffffffff4ca2f8960e17b56e690739158994ed23427ffc08445ba3223edacb322db12d4b000000006b483045022100f94d50d846d85a545693574f9e1a680a858f085257c827cd8b211df8d27c558202201bca0407ad67960937999a88c95e52417442703a16036bbe55f071cdff804f69012102884d0c845bff3158e88033bce236cdbfeadba0a7e7381258379612f355681d6dffffffff052f750000000000001976a914a34a179dc97cbb84992d2960ee240b56f1b2ae3088acbca15400000000001976a914139e314f94a8e4fc2864ef2544e7640ba033725b88ac0000000000000000286a26061d6b629c024c7daf682da4afd61aadf401fae316a265c3244d912b375a75b55551d52a583f2f750000000000001976a9142888cb9f0b0f489106bc13f56fdd2ceec1b6883788ac51c30000000000001976a91404316e7db781481d1419feda2c8d7fa9f7b68a6e88ac00000000",
                },
            };



            foreach (var test in tests)
            {
                var         field       = new BitField(TestUtils.ParseHex(test.Encoded), test.BitCount);
                Transaction transaction = new Transaction();
                transaction.FromBytes(TestUtils.ParseHex(test.Transaction));

                var stealthOutput = field.GetPayments(transaction).FirstOrDefault();
                Assert.NotNull(stealthOutput);

                Assert.True(field.Match(stealthOutput.Metadata.BitField));
            }
        }
Exemple #12
0
        public void CanCreateAssetAddress()
        {
            //The issuer first generates a private key: 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725.
            var key = new Key(TestUtils.ParseHex("18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725"));
            //He calculates the corresponding address: 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM.
            BitcoinPubKeyAddress address = key.PubKey.Decompress().GetAddress(this.networkMain);

            Assert.Equal("16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM", address.ToString());

            //Next, he builds the Pay-to-PubKey-Hash script associated to that address: OP_DUP OP_HASH160 010966776006953D5567439E5E39F86A0D273BEE OP_EQUALVERIFY OP_CHECKSIG
            Script script = address.ScriptPubKey;

            Assert.Equal("OP_DUP OP_HASH160 010966776006953D5567439E5E39F86A0D273BEE OP_EQUALVERIFY OP_CHECKSIG", script.ToString().ToUpper());

            BitcoinScriptAddress oo = script.GetScriptAddress(this.networkMain);

            //The script is hashed: 36e0ea8e93eaa0285d641305f4c81e563aa570a2.
            Assert.Equal("36e0ea8e93eaa0285d641305f4c81e563aa570a2", script.Hash.ToString());

            Assert.Equal("36e0ea8e93eaa0285d641305f4c81e563aa570a2", key.PubKey.Decompress().Hash.ScriptPubKey.Hash.ToString());
            //Finally, the hash is converted to a base 58 string with checksum using version byte 23: ALn3aK1fSuG27N96UGYB1kUYUpGKRhBuBC.
            Assert.Equal("ALn3aK1fSuG27N96UGYB1kUYUpGKRhBuBC", script.Hash.ToAssetId().GetWif(this.networkMain).ToString());
        }
Exemple #13
0
        private static void PlaySplit()
        {
            var scan = new Key(TestUtils.ParseHex("cc411aab02edcd3bccf484a9ba5280d4a774e6f81eac8ebec9cb1c2e8f73020a"));
            var addr = new BitcoinStealthAddress("waPYjXyrTrvXjZHmMGdqs9YTegpRDpx97H5G3xqLehkgyrrZKsxGCmnwKexpZjXTCskUWwYywdUvrZK7L2vejeVZSYHVns61gm8VfU", Network.TestNet);

            var sender = new BitcoinSecret("cRjSUV1LqN2F8MsGnLE2JKfCP75kbWGFRroNQeXHC429jqVFgmW3", Network.TestNet);
            var tx     = new Transaction();

            tx.Version = 1;

            RPCClient client = RPCClientTests.CreateRPCClient();
            var       coins  = client.ListUnspent();

            foreach (var unspent in coins)
            {
                tx.Inputs.Add(new TxIn(unspent.OutPoint));
            }
            var amount = coins.Select(c => c.Amount).Sum();

            var perOut = (long)(amount.Satoshi / 13);

            while (amount > 0)
            {
                var toSend = Math.Min(perOut, (long)amount);
                amount -= toSend;

                var tout = new TxOut(toSend, sender.GetAddress());
                if (!tout.IsDust)
                {
                    tx.Outputs.Add(tout);
                }
            }

            tx.SignAll(sender);
            client.SendRawTransaction(tx);
        }
Exemple #14
0
        //Copied from https://en.bitcoin.it/wiki/Protocol_specification (19/04/2014)
        public void CanParseMessages()
        {
            TimeZoneInfo EST;

            try
            {
                EST = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
            }
            catch (TimeZoneNotFoundException)
            {
                EST = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
            }

            var tests = new[]
            {
                new
                {
                    Version = 209U,
                    Message = "f9beb4d976657273696f6e0000000000550000009c7c00000100000000000000e615104d00000000010000000000000000000000000000000000ffff0a000001208d010000000000000000000000000000000000ffff0a000002208ddd9d202c3ab457130055810100",
                    Test    = new Action <object>(o =>
                    {
                        var version = (VersionPayload)o;
                        Assert.Equal((ulong)0x1357B43A2C209DDD, version.Nonce);
                        Assert.Equal("", version.UserAgent);
                        Assert.Equal("::ffff:10.0.0.2", version.AddressFrom.Address.ToString());
                        Assert.Equal(8333, version.AddressFrom.Port);
                        Assert.Equal(0x00018155, version.StartHeight);
                        Assert.Equal <uint>(31900, version.Version);
                    })
                },
                new
                {
                    Version = 60002U,
                    Message = "f9beb4d976657273696f6e000000000064000000358d493262ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300",
                    Test    = new Action <object>(o =>
                    {
                        var version = (VersionPayload)o;
                        Assert.Equal("/Satoshi:0.7.2/", version.UserAgent);
                        Assert.Equal(0x00033EC0, version.StartHeight);
                    })
                },
                new
                {
                    Version = 70012U,
                    Message = "f9beb4d976657261636b000000000000000000005df6e0e2",
                    Test    = new Action <object>(o =>
                    {
                        var verack = (VerAckPayload)o;
                    })
                },
                new
                {
                    Version = 60002U,
                    Message = "f9beb4d96164647200000000000000001f000000ed52399b01e215104d010000000000000000000000000000000000ffff0a000001208d",
                    Test    = new Action <object>(o =>
                    {
                        var addr = (AddrPayload)o;
                        Assert.Single(addr.Addresses);
                        //"Mon Dec 20 21:50:10 EST 2010"
                        var date = TimeZoneInfo.ConvertTime(addr.Addresses[0].Time, EST);
                        Assert.Equal(20, date.Day);
                        Assert.Equal(12, date.Month);
                        Assert.Equal(2010, date.Year);
                        Assert.Equal(21, date.Hour);
                    })
                },
            };

            foreach (var test in tests)
            {
                var message = Network.Main.ParseMessage(TestUtils.ParseHex(test.Message), test.Version);
                test.Test(message.Payload);
                var bytes = message.ToBytes(test.Version);
                var old   = message;
                message = new Message();
                message.FromBytes(bytes, test.Version);
                test.Test(message.Payload);
                Assert.Equal(test.Message, Encoders.Hex.EncodeData(message.ToBytes(test.Version)));
            }
        }
Exemple #15
0
        public void base58_keys_valid_parse()
        {
            TestCase[] tests = TestCase.read_json(TestDataLocations.GetFileFromDataFolder("base58_keys_valid.json"));
            Network    network;

            foreach (TestCase test in tests)
            {
                string strTest = test.ToString();
                if (test.Count < 3) // Allow for extra stuff (useful for comments)
                {
                    Assert.True(false, "Bad test " + strTest);
                    continue;
                }

                string exp_base58string = (string)test[0];
                byte[] exp_payload      = TestUtils.ParseHex((string)test[1]);
                //const Object &metadata = test[2].get_obj();
                bool isPrivkey = (bool)test.GetDynamic(2).isPrivkey;
                bool isTestnet = (bool)test.GetDynamic(2).isTestnet;
                if (isTestnet)
                {
                    network = KnownNetworks.TestNet;
                }
                else
                {
                    network = KnownNetworks.Main;
                }

                if (isPrivkey)
                {
                    bool isCompressed = (bool)test.GetDynamic(2).isCompressed;

                    // Must be valid private key
                    // Note: CBitcoinSecret::SetString tests isValid, whereas CBitcoinAddress does not!
                    BitcoinSecret secret = network.CreateBitcoinSecret(exp_base58string);
                    //If not valid exception would throw

                    Key privkey = secret.PrivateKey;
                    Assert.True(privkey.IsCompressed == isCompressed, "compressed mismatch:" + strTest);
                    Assert.True(Utils.ArrayEqual(privkey.ToBytes(), exp_payload), "key mismatch:" + strTest);

                    // Private key must be invalid public key
                    Assert.Throws <FormatException>(() => network.CreateBitcoinAddress(exp_base58string));
                }
                else
                {
                    string exp_addrType = (string)test.GetDynamic(2).addrType; // "script" or "pubkey"
                                                                               // Must be valid public key
                    BitcoinAddress addr = network.CreateBitcoinAddress(exp_base58string);
                    Assert.True((addr is BitcoinScriptAddress) == (exp_addrType == "script"), "isScript mismatch" + strTest);

                    if (exp_addrType == "script")
                    {
                        Assert.True(addr.GetType() == typeof(BitcoinScriptAddress));
                    }
                    if (exp_addrType == "pubkey")
                    {
                        Assert.True(addr.GetType() == typeof(BitcoinPubKeyAddress));
                    }

                    Assert.Throws <FormatException>(() => network.CreateBitcoinSecret(exp_base58string));
                }
            }
        }
Exemple #16
0
        public void base58_keys_valid_gen()
        {
            TestCase[] tests = TestCase.read_json(TestDataLocations.GetFileFromDataFolder("base58_keys_valid.json"));
            tests = tests.Concat(TestCase.read_json(TestDataLocations.GetFileFromDataFolder("base58_keys_valid2.json"))).ToArray();
            Network network = null;

            foreach (TestCase test in tests)
            {
                string strTest = test.ToString();
                if (test.Count < 3) // Allow for extra stuff (useful for comments)
                {
                    Assert.False(true, "Bad test: " + strTest);
                    continue;
                }
                string  exp_base58string = (string)test[0];
                byte[]  exp_payload      = TestUtils.ParseHex((string)test[1]);
                dynamic metadata         = test.GetDynamic(2);
                bool    isPrivkey        = (bool)metadata.isPrivkey;
                bool    isTestnet        = (bool)metadata.isTestnet;

                if (isTestnet)
                {
                    network = KnownNetworks.TestNet;
                }
                else
                {
                    network = KnownNetworks.Main;
                }
                if (isPrivkey)
                {
                    bool          isCompressed = metadata.isCompressed;
                    var           key          = new Key(exp_payload, fCompressedIn: isCompressed);
                    BitcoinSecret secret       = network.CreateBitcoinSecret(key);
                    Assert.True(secret.ToString() == exp_base58string, "result mismatch: " + strTest);
                }
                else
                {
                    string        exp_addrType = (string)metadata.addrType;
                    TxDestination dest;
                    if (exp_addrType == "pubkey")
                    {
                        dest = new KeyId(new uint160(exp_payload));
                    }
                    else if (exp_addrType == "script")
                    {
                        dest = new ScriptId(new uint160(exp_payload));
                    }
                    else if (exp_addrType == "p2wpkh")
                    {
                        dest = new WitKeyId(new uint160(exp_payload));
                    }
                    else if (exp_addrType == "p2wsh")
                    {
                        dest = new WitScriptId(exp_payload);
                    }
                    else if (exp_addrType == "none")
                    {
                        continue;
                    }
                    else
                    {
                        Assert.True(false, "Bad addrtype: " + strTest);
                        continue;
                    }
                    try
                    {
                        BitcoinAddress addrOut = dest.GetAddress(network);
                        Assert.True(addrOut.ToString() == exp_base58string, "mismatch: " + strTest);
                        Assert.True(addrOut.ScriptPubKey == dest.ScriptPubKey);
                        Assert.True(dest.ScriptPubKey.GetDestination(KnownNetworks.Main) == dest);
                    }
                    catch (ArgumentException)
                    {
                        Assert.True(dest.GetType() == typeof(TxDestination));
                    }
                }
            }
        }
Exemple #17
0
        //Copied from https://en.bitcoin.it/wiki/Protocol_specification (19/04/2014)
        public void CanParseMessages()
        {
            if (pos_RPCClientTests.noClient)
            {
                return;
            }

            var EST   = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
            var tests = new[]
            {
                new
                {
                    Version = ProtocolVersion.INIT_PROTO_VERSION,
                    Message = "7035220576657273696f6e0000000000550000009c7c00000100000000000000e615104d00000000010000000000000000000000000000000000ffff0a000001208d010000000000000000000000000000000000ffff0a000002208ddd9d202c3ab457130055810100",
                    Test    = new Action <object>(o =>
                    {
                        var version = (VersionPayload)o;
                        Assert.Equal((ulong)0x1357B43A2C209DDD, version.Nonce);
                        Assert.Equal("", version.UserAgent);
                        Assert.Equal("::ffff:10.0.0.2", version.AddressFrom.Address.ToString());
                        Assert.Equal(8333, version.AddressFrom.Port);
                        Assert.Equal(0x00018155, version.StartHeight);
                        Assert.Equal((ProtocolVersion)31900, version.Version);
                    })
                },
                new
                {
                    Version = ProtocolVersion.MEMPOOL_GD_VERSION,
                    Message = "7035220576657273696f6e000000000064000000358d493262ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300",
                    Test    = new Action <object>(o =>
                    {
                        var version = (VersionPayload)o;
                        Assert.Equal("/Satoshi:0.7.2/", version.UserAgent);
                        Assert.Equal(0x00033EC0, version.StartHeight);
                    })
                },
                new
                {
                    Version = ProtocolVersion.PROTOCOL_VERSION,
                    Message = "7035220576657261636b000000000000000000005df6e0e2",
                    Test    = new Action <object>(o =>
                    {
                        var verack = (VerAckPayload)o;
                    })
                },
                new
                {
                    Version = ProtocolVersion.MEMPOOL_GD_VERSION,
                    Message = "703522056164647200000000000000001f000000ed52399b01e215104d010000000000000000000000000000000000ffff0a000001208d",
                    Test    = new Action <object>(o =>
                    {
                        var addr = (AddrPayload)o;
                        Assert.Equal(1, addr.Addresses.Length);
                        //"Mon Dec 20 21:50:10 EST 2010"
                        var date = TimeZoneInfo.ConvertTime(addr.Addresses[0].Time, EST);
                        Assert.Equal(20, date.Day);
                        Assert.Equal(12, date.Month);
                        Assert.Equal(2010, date.Year);
                        Assert.Equal(21, date.Hour);
                    })
                },
            };

            foreach (var test in tests)
            {
                var message = Network.StratisMain.ParseMessage(TestUtils.ParseHex(test.Message), test.Version);
                test.Test(message.Payload);
                var bytes = message.ToBytes(test.Version);
                var old   = message;
                message = new Message();
                message.FromBytes(bytes, test.Version);
                test.Test(message.Payload);
                Assert.Equal(test.Message, Encoders.Hex.EncodeData(message.ToBytes(test.Version)));
            }
        }
Exemple #18
0
        public void base58_keys_valid_gen()
        {
            var     tests   = TestCase.read_json("data/base58_keys_valid.json");
            Network network = null;

            foreach (var test in tests)
            {
                string strTest = test.ToString();
                if (test.Count < 3)                // Allow for extra stuff (useful for comments)
                {
                    Assert.False(true, "Bad test: " + strTest);
                    continue;
                }
                string  exp_base58string = (string)test[0];
                byte[]  exp_payload      = TestUtils.ParseHex((string)test[1]);
                dynamic metadata         = test.GetDynamic(2);
                bool    isPrivkey        = (bool)metadata.isPrivkey;
                bool    isTestnet        = (bool)metadata.isTestnet;

                if (isTestnet)
                {
                    network = Network.TestNet;
                }
                else
                {
                    network = Network.Main;
                }
                if (isPrivkey)
                {
                    bool          isCompressed = metadata.isCompressed;
                    Key           key          = new Key(exp_payload, fCompressedIn: isCompressed);
                    BitcoinSecret secret       = network.CreateBitcoinSecret(key);
                    Assert.True(secret.ToString() == exp_base58string, "result mismatch: " + strTest);
                }
                else
                {
                    string        exp_addrType = (string)metadata.addrType;
                    TxDestination dest;
                    if (exp_addrType == "pubkey")
                    {
                        dest = new KeyId(new uint160(exp_payload));
                    }
                    else if (exp_addrType == "script")
                    {
                        dest = new ScriptId(new uint160(exp_payload));
                    }
                    else if (exp_addrType == "none")
                    {
                        dest = new TxDestination(0);
                    }
                    else
                    {
                        Assert.True(false, "Bad addrtype: " + strTest);
                        continue;
                    }
                    try
                    {
                        BitcoinAddress addrOut = network.CreateBitcoinAddress(dest);
                        Assert.True(addrOut.ToString() == exp_base58string, "mismatch: " + strTest);
                    }
                    catch (ArgumentException)
                    {
                        Assert.True(dest.GetType() == typeof(TxDestination));
                    }
                }
            }

            // Visiting a CNoDestination must fail
            TxDestination nodest = new TxDestination();

            Assert.Throws <ArgumentException>(() => network.CreateBitcoinAddress(nodest));
        }