コード例 #1
0
        public void util_ParseHex()
        {
            // Basic test vector
            var result = Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0EA1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f");

            AssertEx.CollectionEquals(result, ParseHex_expected);

            // Spaces between bytes must not be supported
            Assert.Throws <FormatException>(() => Encoders.Hex.DecodeData("12 34 56 78"));

            // Stop parsing at invalid value
            Assert.Throws <FormatException>(() => Encoders.Hex.DecodeData("1234 invalid 1234"));
        }
コード例 #2
0
        public void CanGetBlockFromRPC()
        {
            using (var builder = NodeBuilder.Create())
            {
                var rpc = builder.CreateNode(true).CreateRPCClient();

                var response = rpc.GetBlockHeader(0);
                AssertEx.CollectionEquals(Network.RegTest.GetGenesis().Header.ToBytes(), response.ToBytes());

                response = rpc.GetBlockHeader(0);
                Assert.Equal(Network.RegTest.GenesisHash, response.GetHash());
            }
        }
コード例 #3
0
        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]));
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public void CanStoreInNoSql()
        {
            NoSqlRepository[] repositories = new NoSqlRepository[]
            {
                new InMemoryNoSqlRepository(),
                new CachedNoSqlRepository(new InMemoryNoSqlRepository())
            };

            foreach (NoSqlRepository repository in repositories)
            {
                byte[] data1 = new byte[] { 1, 2, 3, 4, 5, 6 };
                byte[] data2 = new byte[] { 11, 22, 33, 4, 5, 66 };
                Assert.Null(repository.Get <RawData>("data1"));

                repository.Put("data1", new RawData(data1));
                RawData actual = repository.Get <RawData>("data1");
                Assert.NotNull(actual);
                AssertEx.CollectionEquals(actual.Data, data1);

                repository.Put("data1", new RawData(data2));
                actual = repository.Get <RawData>("data1");
                Assert.NotNull(actual);
                AssertEx.CollectionEquals(actual.Data, data2);

                repository.Put("data1", null as RawData);
                actual = repository.Get <RawData>("data1");
                Assert.Null(actual);

                repository.Put("data1", null as RawData);
                actual = repository.Get <RawData>("data1");
                Assert.Null(actual);

                //Test batch
                repository.PutBatch(new[] { new Tuple <string, IBitcoinSerializable>("data1", new RawData(data1)),
                                            new Tuple <string, IBitcoinSerializable>("data2", new RawData(data2)) });

                actual = repository.Get <RawData>("data1");
                Assert.NotNull(actual);
                AssertEx.CollectionEquals(actual.Data, data1);

                actual = repository.Get <RawData>("data2");
                Assert.NotNull(actual);
                AssertEx.CollectionEquals(actual.Data, data2);
            }
        }
コード例 #6
0
        public void CanCheckChildKey()
        {
            var parent   = new ExtKey();
            var child    = parent.Derive(1);
            var notchild = new ExtKey();

            Assert.True(child.IsChildOf(parent));
            Assert.True(parent.IsParentOf(child));
            Assert.False(notchild.IsChildOf(parent));
            Assert.False(parent.IsParentOf(notchild));

            Assert.True(child.Neuter().IsChildOf(parent.Neuter()));
            Assert.True(parent.Neuter().IsParentOf(child.Neuter()));
            Assert.False(notchild.Neuter().IsChildOf(parent.Neuter()));
            Assert.False(parent.Neuter().IsParentOf(notchild.Neuter()));

            var keyA = parent.Neuter();
            var keyB = new ExtPubKey(keyA.ToBytes());

            AssertEx.CollectionEquals(keyA.ToBytes(), keyB.ToBytes());
        }
コード例 #7
0
        public void CanCacheNoSqlRepository()
        {
            var cached = new CachedNoSqlRepository(new InMemoryNoSqlRepository());

            byte[] data1 = new byte[] { 1, 2, 3, 4, 5, 6 };
            byte[] data2 = new byte[] { 11, 22, 33, 4, 5, 66 };
            cached.InnerRepository.Put("data1", new RawData(data1));
            Assert.NotNull(cached.Get <RawData>("data1"));

            cached.InnerRepository.Put("data1", new RawData(data2));
            cached.Flush();
            RawData data1Actual = cached.InnerRepository.Get <RawData>("data1");

            AssertEx.CollectionEquals(data1Actual.Data, data2);

            cached.Put("data1", new RawData(data1));
            data1Actual = cached.InnerRepository.Get <RawData>("data1");
            AssertEx.CollectionEquals(data1Actual.Data, data2);

            cached.Flush();
            data1Actual = cached.InnerRepository.Get <RawData>("data1");
            AssertEx.CollectionEquals(data1Actual.Data, data1);

            cached.Put("data1", null);
            cached.Flush();
            Assert.Null(cached.InnerRepository.Get <RawData>("data1"));

            cached.Put("data1", new RawData(data1));
            cached.Put("data1", null);
            cached.Flush();
            Assert.Null(cached.InnerRepository.Get <RawData>("data1"));

            cached.Put("data1", null);
            cached.Put("data1", new RawData(data1));
            cached.Flush();
            Assert.NotNull(cached.InnerRepository.Get <RawData>("data1"));
        }
コード例 #8
0
        public void CanCreatePayment()
        {
            var tests = new[]
            {
                new CanCreatePaymentData
                {
                    //sx stealth-newkey
                    StealthAddress = "vJmtjxSDxNPXL4RNapp9ARdqKz3uJyf1EDGjr1Fgqs9c8mYsVH82h8wvnA4i5rtJ57mr3kor1EVJrd4e5upACJd588xe52yXtzumxj",

                    ScanSecret = "3e49e7257cb31db997edb1cf8299af0f37e2663e2260e4b8033e49d39a6d02f2",
                    ScanPubKey = "025e58a31122b38c86abc119b9379fe247410aee87a533f9c07b189aef6c3c1f52",

                    SpendSecret = "aa3db0cfb3edc94de4d10f873f8190843f2a17484f6021a95a7742302c744748",
                    SpendPubKey = "03616562c98e7d7b74be409a787cec3a912122f3fb331a9bee9b0b73ce7b9f50af",

                    //sx newkey | sx wif-to-secret
                    EphemSecret = "9e63abaf8dcd5ea3919e6de0b6c544e00bf51bf92496113a01d6e369944dc091",
                    EphemPubKey = "03403d306ec35238384c7e340393335f9bc9bb4a2e574eb4e419452c4ea19f14b0",

                    //sx steatlh-uncover-secret [EphemPubKey] [ScanSecret] [SpendSecret]
                    StealthSecret = "4e422fb1e5e1db6c1f6ab32a7706d368ceb385e7fab098e633c5c5949c3b97cd",
                    //sx stealth-initiate [EphemSecret] [ScanPubKey] [SpendPubKey] (for sender)
                    //or
                    //sx stealth-uncover [EphemPubKey] [ScanSecret] [SpendPubKey]  (for receiver)
                    StealthPubKey = "02726112ad39cb6bf848b1b1ef30b88e35286bf99f746c2be575f96c0e02a9357c",
                },

                //Need padding for to find the stealth secret
                new CanCreatePaymentData {
                    StealthAddress = "vJmyTEybwCKz7W8y6vP62jo7RoyfLneiANcPLBBNYwn98EXzQRStMKqKGRiZhqscuQ6WKy2J3U3zfx72V3b2J6YvxxBcxUj4XMDsw7",
                    ScanSecret     = "2f517d81cf30e47dbf4809321275bbfd92192af81a6141a17aa53e40bd28fe36",
                    ScanPubKey     = "039d91ae0eebea6dc500fb57b704abce3d3fa700cc762a52bc5dcaee27770a8402",
                    SpendSecret    = "71e33219884fc27011f8da9adcc730f0c2e940759bdb1b615764492bce04fcea",
                    SpendPubKey    = "021a3d5b40ec83fc58b5a23207eb9c99b741d8f0e9f8b80f04f49cec915b540c40",
                    EphemSecret    = "578ffe42c0fbfb324a31f41dbbcd8b1f910ce2f4d803444a83b18ae9f8ccd97e",
                    EphemPubKey    = "03c190be0a1c6e50577b3dd637b1fff9344de31c2544ff3d815535c0515711150f",
                    StealthSecret  = "006d138b4bcef0f09c8784c0cc68f2be4497a1a822d8d7b0519c5c0378b5cb45",
                    StealthPubKey  = "0223a99278a5279ea93718503a42377067e72960eb808d8bff6defdd95d4feff76"
                }
            };

            foreach (var test in tests)
            {
                var scan    = AssertKeys(test.ScanSecret, test.ScanPubKey);
                var spend   = AssertKeys(test.SpendSecret, test.SpendPubKey);
                var ephem   = AssertKeys(test.EphemSecret, test.EphemPubKey);
                var stealth = AssertKeys(test.StealthSecret, test.StealthPubKey);

                var address = spend.PubKey.CreateStealthAddress(scan.PubKey, Network.Main);
                Assert.Equal(test.StealthAddress, address.ToString());
                //Try roundtrip
                address = new BitcoinStealthAddress(address.ToBytes(), Network.Main);
                Assert.Equal(test.StealthAddress, address.ToString());

                var payment      = address.CreatePayment(ephem);
                var generatedKey = spend.Uncover(scan, payment.Metadata.EphemKey);
                if (stealth != null)
                {
                    Assert.Equal(stealth.PubKey.Hash, payment.StealthKeys[0].ID);
                    Assert.Equal(stealth.ToBytes(), generatedKey.ToBytes());
                }
                var uncoveredSender    = spend.PubKey.UncoverSender(ephem, scan.PubKey);
                var uncovertedReceiver = spend.PubKey.UncoverReceiver(scan, ephem.PubKey);

                AssertEx.CollectionEquals(uncoveredSender.ToBytes(), uncovertedReceiver.ToBytes());
                AssertEx.CollectionEquals(generatedKey.PubKey.ToBytes(), uncovertedReceiver.ToBytes());

                var transaction = new Transaction();
                payment.AddToTransaction(transaction, 100);
            }
        }