Esempio n. 1
0
        public void AdaptorUtilTest()
        {
            var msg          = new ByteData("024bdd11f2144e825db05759bdd9041367a420fad14b665fd08af5b42056e5e2");
            var adaptor      = new Pubkey("038d48057fc4ce150482114d43201b333bf3706f3cd527e8767ceb4b443ab5d349");
            var sk           = new Privkey("90ac0d5dc0a1a9ab352afb02005a5cc6c4df0da61d8149d729ff50db9b5a5215");
            var pubkey       = new Pubkey("03490cec9a53cd8f2f664aea61922f26ee920c42d2489778bb7c9d9ece44d149a7");
            var adaptorSig   = new ByteData("00cbe0859638c3600ea1872ed7a55b8182a251969f59d7d2da6bd4afedf25f5021a49956234cbbbbede8ca72e0113319c84921bf1224897a6abd89dc96b9c5b208");
            var adaptorProof = new ByteData("00b02472be1ba09f5675488e841a10878b38c798ca63eff3650c8e311e3e2ebe2e3b6fee5654580a91cc5149a71bf25bcbeae63dea3ac5ad157a0ab7373c3011d0fc2592a07f719c5fc1323f935569ecd010db62f045e965cc1d564eb42cce8d6d");
            var adaptorSig2  = new ByteData("01099c91aa1fe7f25c41085c1d3c9e73fe04a9d24dac3f9c2172d6198628e57f47bb90e2ad6630900b69f55674c8ad74a419e6ce113c10a21a79345a6e47bc74c1");
            // var sigDer = new ByteData("30440220099c91aa1fe7f25c41085c1d3c9e73fe04a9d24dac3f9c2172d6198628e57f4702204d13456e98d8989043fd4674302ce90c432e2f8bb0269f02c72aafec60b72de101");
            var sig    = new ByteData("099c91aa1fe7f25c41085c1d3c9e73fe04a9d24dac3f9c2172d6198628e57f474d13456e98d8989043fd4674302ce90c432e2f8bb0269f02c72aafec60b72de1");
            var secret = new Privkey("475697a71a74ff3f2a8f150534e9b67d4b0b6561fab86fcaa51f8c9d6c9db8c6");

            var pair = EcdsaAdaptorUtil.Sign(msg, sk, adaptor);

            Assert.Equal(adaptorSig.ToHexString(), pair.Signature.ToHexString());
            Assert.Equal(adaptorProof.ToHexString(), pair.Proof.ToHexString());

            var isVerify = EcdsaAdaptorUtil.Verify(pair.Signature, pair.Proof, adaptor, msg, pubkey);

            Assert.True(isVerify);

            var adaptSig = EcdsaAdaptorUtil.Adapt(adaptorSig2, secret);

            Assert.Equal(sig.ToHexString(), adaptSig.ToHexString());

            var adaptorSecret = EcdsaAdaptorUtil.ExtractSecret(adaptorSig2, adaptSig, adaptor);

            Assert.Equal(secret.ToHexString(), adaptorSecret.ToHexString());
        }
Esempio n. 2
0
        public void ScriptSignTest()
        {
            ExtPrivkey  privkey   = new ExtPrivkey("xprv9zt1onyw8BdEf7SQ6wUVH3bQQdGD9iy9QzXveQQRhX7i5iUN7jZgLbqFEe491LfjozztYa6bJAGZ65GmDCNcbjMdjZcgmdisPJwVjcfcDhV");
            Transaction tx        = new Transaction("020000000201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c00000000");
            OutPoint    outpoint2 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 3);
            long        amount    = 25000;

            Privkey privkey21      = privkey.DerivePrivkey(21).GetPrivkey();
            Privkey privkey22      = privkey.DerivePrivkey(22).GetPrivkey();
            Privkey privkey23      = privkey.DerivePrivkey(23).GetPrivkey();
            Pubkey  pubkey21       = privkey21.GetPubkey();
            Pubkey  pubkey22       = privkey22.GetPubkey();
            Pubkey  pubkey23       = privkey23.GetPubkey();
            Script  multisigScript = Script.CreateMultisigScript(2, new[] {
                pubkey21, pubkey22, pubkey23,
            });
            SignatureHashType sighashType = new SignatureHashType(CfdSighashType.All, false);
            ByteData          sighash     = tx.GetSignatureHash(outpoint2, CfdHashType.P2shP2wsh, multisigScript, amount, sighashType);
            SignParameter     sig22       = privkey22.CalculateEcSignature(sighash);
            SignParameter     sig23       = privkey23.CalculateEcSignature(sighash);

            sig22.SetDerEncode(sighashType);
            sig22.SetRelatedPubkey(pubkey22);
            sig23.SetDerEncode(sighashType);
            sig23.SetRelatedPubkey(pubkey23);
            tx.AddScriptSign(outpoint2, CfdHashType.P2shP2wsh, new[] { new SignParameter(), sig22, sig23 }, multisigScript);
            output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("0200000000010201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff0100000000000000000000000000000000000000000000000000000000000000030000002322002064a0e02e723ce71d8f18441a39bedd5cefc9c5411c3045614c34bba1a8fbd94fffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c0004004730440220749cbe5080a3ce49c2a89f897be537b2b5449b75c64b57030dea1859b22c183f02200573f5be5170bfe4ca617edec0eb021638dd78b90209bbd8eede8a9e8138a32c01473044022019105df75884ff34111282f32c22986db295596983a87bf0df1d16905b4f9a50022075f8a2c8e3335a4265265b428df185fb045d9614ed1b08929bfa9f3f9d294a72016952210334bd4f1bab7f3e6f6bfc4a4aeaa890b858a9a146c6bd6bc5a3fbc00a12524ca72103ff743075c59596729d74b79694ca99b2c57bed6a77a06871b123b6e0d729823021036759d0dc7623e781de940a9bc9162f69c6ad68cc5be1c748e960ae4613e658e053ae00000000",
                         tx.ToHexString());
        }
Esempio n. 3
0
        public void CreateScriptTreeTest()
        {
            var sk  = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            var spk = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool _);

            Assert.Equal("1777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", spk.ToHexString());

            var scriptCheckSig  = Script.CreateFromAsm(new string[] { spk.ToHexString(), "OP_CHECKSIG" });
            var scriptOpTrue    = Script.CreateFromAsm("OP_TRUE");
            var scriptCheckSig2 = Script.CreateFromAsm(new string[] {
                "ac52f50b28cdd4d3bcb7f0d5cb533f232e4c4ef12fbf3e718420b84d4e3c3440",
                "OP_CHECKSIG",
            });

            var tree = new TaprootScriptTree(scriptCheckSig);

            tree.AddBranch(scriptOpTrue);
            tree.AddBranch(scriptCheckSig2);
            output.WriteLine("tree1: " + tree.ToString());
            Assert.Equal(
                "{tl(20ac52f50b28cdd4d3bcb7f0d5cb533f232e4c4ef12fbf3e718420b84d4e3c3440ac),{tl(51),tl(201777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfbac)}}",
                tree.ToString());
            var count = tree.GetBranchCount();

            Assert.Equal((uint)2, count);
        }
Esempio n. 4
0
        public void GenerateTest()
        {
            Privkey key = Privkey.Generate();

            Assert.NotEqual("0000000000000000000000000000000000000000000000000000000000000000", key.ToHexString());
            Assert.True(key.IsValid());
        }
Esempio n. 5
0
        public void NegateTest()
        {
            Privkey key    = new Privkey("036b13c5a0dd9935fe175b2b9ff86585c231e734b2148149d788a941f1f4f566");
            Privkey negate = key.Negate();

            output.WriteLine(negate.ToHexString());
            Assert.Equal("fc94ec3a5f2266ca01e8a4d460079a78f87cf5b1fd341ef1e849b54ade414bdb",
                         negate.ToHexString());
            Assert.Equal(key.ToHexString(), negate.Negate().ToHexString());
        }
Esempio n. 6
0
        public void TweakTest()
        {
            Privkey  key   = new Privkey("036b13c5a0dd9935fe175b2b9ff86585c231e734b2148149d788a941f1f4f566");
            ByteData tweak = new ByteData("98430d10471cf697e2661e31ceb8720750b59a85374290e175799ba5dd06508e");

            Assert.Equal("9bae20d5e7fa8fcde07d795d6eb0d78d12e781b9e957122b4d0244e7cefb45f4",
                         key.TweakAdd(tweak).ToHexString());
            Assert.Equal("aa71b12accba23b49761a7521e661f07a7e5742ac48cf708b8f9497b3a72a957",
                         key.TweakMul(tweak).ToHexString());
        }
Esempio n. 7
0
        public void GetPubkeyTest()
        {
            Privkey key = new Privkey("cQNmd1D8MqzijUuXHb2yS5oRSm2F3TSTTMvcHC3V7CiKxArpg1bg");

            output.WriteLine(key.GetPubkey(false).ToHexString());
            Assert.Equal("02e3cf2c4dca39b502a6f8ba37e5d63a9757492c2155bf99418d9532728cd23d93",
                         key.GetPubkey(true).ToHexString());
            Assert.Equal("04e3cf2c4dca39b502a6f8ba37e5d63a9757492c2155bf99418d9532728cd23d935c5e615b970a67025cfce674d98f29b6fce161d99b74059a428c1164811ba7d4",
                         key.GetPubkey(false).ToHexString());
        }
Esempio n. 8
0
        public void PrivkeySignTest()
        {
            ExtPrivkey  privkey   = new ExtPrivkey("xprv9zt1onyw8BdEf7SQ6wUVH3bQQdGD9iy9QzXveQQRhX7i5iUN7jZgLbqFEe491LfjozztYa6bJAGZ65GmDCNcbjMdjZcgmdisPJwVjcfcDhV");
            Transaction tx        = new Transaction("020000000201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c00000000");
            OutPoint    outpoint1 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 2);

            Privkey           privkey1    = privkey.DerivePrivkey(11).GetPrivkey();
            SignatureHashType sighashType = new SignatureHashType(CfdSighashType.All, false);

            tx.AddSignWithPrivkeySimple(outpoint1, CfdHashType.P2wpkh, privkey1, 50000, sighashType);
            // output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("0200000000010201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c02473044022034db802aad655cd9be589075fc8ef325b6ffb8c24e5b27eb87bde8ad38f5fd7a0220364c916c8e8fc0adf714d7148cd1c6dc6f3e67d55471e57233b1870c65ec2727012103782f0ea892d7000e5f0f82b6ff283382a76500137a542bb0a616530094a8f54c0000000000",
                         tx.ToHexString());
        }
Esempio n. 9
0
        public void CreateRawTransactionTest()
        {
            ExtPrivkey privkey = new ExtPrivkey("xprv9zt1onyw8BdEf7SQ6wUVH3bQQdGD9iy9QzXveQQRhX7i5iUN7jZgLbqFEe491LfjozztYa6bJAGZ65GmDCNcbjMdjZcgmdisPJwVjcfcDhV");
            Address    addr1   = new Address(privkey.DerivePubkey(1).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);
            Address    addr2   = new Address(privkey.DerivePubkey(2).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);
            Address    addr3   = new Address(privkey.DerivePubkey(3).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);

            OutPoint    outpoint1 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 2);
            OutPoint    outpoint2 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 3);
            Transaction tx        = new Transaction("02000000000000000000", new[] {
                new TxIn(outpoint1),
                new TxIn(outpoint2),
            }, new[] {
                new TxOut(10000, addr1.GetLockingScript()),
                new TxOut(10000, addr2.GetLockingScript()),
            });

            tx.AddTxOut(50000, addr3);
            output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("020000000201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c00000000",
                         tx.ToHexString());

            Privkey           privkey1    = privkey.DerivePrivkey(11).GetPrivkey();
            Pubkey            pubkey1     = privkey1.GetPubkey();
            SignatureHashType sighashType = new SignatureHashType(CfdSighashType.All, false);
            ByteData          sighash     = tx.GetSignatureHash(outpoint1, CfdHashType.P2wpkh, pubkey1, 50000, sighashType);
            SignParameter     signature   = privkey1.CalculateEcSignature(sighash);

            signature.SetDerEncode(sighashType);
            tx.AddSign(outpoint1, CfdHashType.P2wpkh, signature, true);
            tx.AddSign(outpoint1, CfdHashType.P2wpkh, new SignParameter(pubkey1.ToHexString()), false);
            output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("0200000000010201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c02473044022034db802aad655cd9be589075fc8ef325b6ffb8c24e5b27eb87bde8ad38f5fd7a0220364c916c8e8fc0adf714d7148cd1c6dc6f3e67d55471e57233b1870c65ec2727012103782f0ea892d7000e5f0f82b6ff283382a76500137a542bb0a616530094a8f54c0000000000",
                         tx.ToHexString());

            Address addr11 = new Address(pubkey1, CfdAddressType.P2wpkh, CfdNetworkType.Regtest);

            try
            {
                tx.VerifySign(outpoint1, addr11, addr11.GetAddressType(), 50000);
            }
            catch (Exception e)
            {
                Assert.Null(e);
            }

            string json = Transaction.DecodeRawTransaction(tx);

            output.WriteLine(json);
        }
Esempio n. 10
0
        public void AddressTaprootTest()
        {
            var sk  = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            var spk = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool _);

            Assert.Equal("1777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", spk.ToHexString());

            Address addr = new Address(spk, CfdAddressType.Taproot, CfdNetworkType.Testnet);

            Assert.Equal("tb1pzamhq9jglfxaj0r5ahvatr8uc77u973s5tm04yytdltsey5r8naskf8ee6", addr.ToAddressString());
            Assert.Equal("51201777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", addr.GetLockingScript().ToHexString());

            Address addr2 = Address.GetAddressByLockingScript(addr.GetLockingScript(), CfdNetworkType.Testnet);

            Assert.Equal(CfdAddressType.Taproot, addr2.GetAddressType());
        }
Esempio n. 11
0
        public void CalculateEcSignatureTest()
        {
            Privkey  key     = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            ByteData sighash = new ByteData("2a67f03e63a6a422125878b40b82da593be8d4efaafe88ee528af6e5a9955c6e");

            SignParameter signData = key.CalculateEcSignature(sighash);

            Assert.Equal("0e68b55347fe37338beb3c28920267c5915a0c474d1dcafc65b087b9b3819cae6ae5e8fb12d669a63127abb4724070f8bd232a9efe3704e6544296a843a64f2c",
                         signData.ToHexString());
            signData.SetSignatureHashType(new SignatureHashType(CfdSighashType.Single, false));
            Assert.True(signData.IsDerEncode());

            SignParameter signData2 = key.CalculateEcSignature(sighash, false);

            Assert.Equal("0e68b55347fe37338beb3c28920267c5915a0c474d1dcafc65b087b9b3819cae6ae5e8fb12d669a63127abb4724070f8bd232a9efe3704e6544296a843a64f2c",
                         signData2.ToHexString());
            Assert.True(signData.IsDerEncode());
        }
Esempio n. 12
0
        public void ConstructorTest()
        {
            Privkey emptyKey = new Privkey("");

            Assert.False(emptyKey.IsValid());

            Privkey key = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");

            Assert.Equal("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27", key.ToHexString());
            Assert.True(key.IsValid());

            Privkey wif = new Privkey("5JBb5A38fjjeBnngkvRmCsXN6EY4w8jWvckik3hDvYQMcddGY23");

            Assert.Equal("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27", wif.ToHexString());
            Assert.Equal("5JBb5A38fjjeBnngkvRmCsXN6EY4w8jWvckik3hDvYQMcddGY23", wif.GetWif());
            Assert.Equal(CfdNetworkType.Mainnet, wif.GetNetworkType());
            Assert.False(wif.IsCompressPubkey());
            Assert.True(wif.IsValid());
        }
Esempio n. 13
0
        public void GetWifTest()
        {
            Privkey key = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            string  wif = key.GetWif(CfdNetworkType.Mainnet, false);

            output.WriteLine(wif);
            Assert.Equal("5JBb5A38fjjeBnngkvRmCsXN6EY4w8jWvckik3hDvYQMcddGY23", wif);

            wif = key.GetWif(CfdNetworkType.Mainnet, true);
            output.WriteLine(wif);
            Assert.Equal("KxqjPLtQqydD8d6eUrpJ7Q1266k8Mw8f5eoyEztY3Kc5z4f2RQTG", wif);

            wif = key.GetWif(CfdNetworkType.Testnet, false);
            output.WriteLine(wif);
            Assert.Equal("91xDetrgFxon9rHyPGKg5U5Kjttn6JGiGZcfpg3jGH9QPd4tmrm", wif);

            wif = key.GetWif(CfdNetworkType.Testnet, true);
            output.WriteLine(wif);
            Assert.Equal("cPCirFtGH3KUJ4ZusGdRUiW5iL3Y2PEM9gxSMRM3YSG6Eon9heJj", wif);
        }
Esempio n. 14
0
        public void TaprootSchnorrSignTest1()
        {
            var sk  = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            var spk = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool _);

            Assert.Equal("1777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", spk.ToHexString());

            var addr = new Address(spk, CfdAddressType.Taproot, CfdNetworkType.Testnet);

            var txHex    = "020000000116d975e4c2cea30f72f4f5fe528f5a0727d9ea149892a50c030d44423088ea2f0000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d500000000";
            var outpoint = new OutPoint("2fea883042440d030ca5929814ead927075a8f52fef5f4720fa3cec2e475d916", 0);
            var utxos    = new UtxoData[] {
                new UtxoData(outpoint, 2499999000, new Descriptor(addr)),
            };
            var tx      = new Transaction(txHex);
            var feeData = tx.EstimateFee(utxos, 2.0);

            Assert.Equal(202, feeData.GetTotalFee());

            tx.SetTxInUtxoData(utxos);
            var sighashType = new SignatureHashType(CfdSighashType.All);
            var sighash     = tx.GetSigHashByUtxoData(outpoint, sighashType, spk);

            Assert.Equal("e5b11ddceab1e4fc49a8132ae589a39b07acf49cabb2b0fbf6104bc31da12c02", sighash.ToHexString());

            var signature = SchnorrUtil.Sign(sighash, sk);
            var sig       = signature.GetSignData(sighashType);

            Assert.Equal("61f75636003a870b7a1685abae84eedf8c9527227ac70183c376f7b3a35b07ebcbea14749e58ce1a87565b035b2f3963baa5ae3ede95e89fd607ab7849f2087201", sig.ToHexString());

            tx.AddTaprootSchnorrSign(outpoint, sig);
            Assert.Equal("0200000000010116d975e4c2cea30f72f4f5fe528f5a0727d9ea149892a50c030d44423088ea2f0000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d5014161f75636003a870b7a1685abae84eedf8c9527227ac70183c376f7b3a35b07ebcbea14749e58ce1a87565b035b2f3963baa5ae3ede95e89fd607ab7849f208720100000000", tx.ToHexString());

            tx.VerifySignByUtxoList(outpoint);

            var isVerify = spk.Verify(signature, sighash);

            Assert.True(isVerify);
        }
Esempio n. 15
0
        public void SchnorrUtilTest()
        {
            var msg          = new ByteData("e48441762fb75010b2aa31a512b62b4148aa3fb08eb0765d76b252559064a614");
            var sk           = new Privkey("688c77bc2d5aaff5491cf309d4753b732135470d05b7b2cd21add0744fe97bef");
            var pubkey       = new SchnorrPubkey("b33cc9edc096d0a83416964bd3c6247b8fecd256e4efa7870d2c854bdeb33390");
            var auxRand      = new ByteData("02cce08e913f22a36c5648d6405a2c7c50106e7aa2f1649e381c7f09d16b80ab");
            var nonce        = new ByteData("8c8ca771d3c25eb38de7401818eeda281ac5446f5c1396148f8d9d67592440fe");
            var schnorrNonce = new SchnorrPubkey("f14d7e54ff58c5d019ce9986be4a0e8b7d643bd08ef2cdf1099e1a457865b547");
            var signature    = new SchnorrSignature("6470fd1303dda4fda717b9837153c24a6eab377183fc438f939e0ed2b620e9ee5077c4a8b8dca28963d772a94f5f0ddf598e1c47c137f91933274c7c3edadce8");

            var sig = SchnorrUtil.Sign(msg, sk, auxRand);

            Assert.Equal(signature.ToHexString(), sig.ToHexString());

            var expectedSig =
                "5da618c1936ec728e5ccff29207f1680dcf4146370bdcfab0039951b91e3637a958e91d68537d1f6f19687cec1fd5db1d83da56ef3ade1f3c611babd7d08af42";
            var sig2 = SchnorrUtil.SignWithNonce(msg, sk, nonce);

            Assert.Equal(expectedSig, sig2.ToHexString());

            string expectedSigPoint =
                "03735acf82eef9da1540efb07a68251d5476dabb11ac77054924eccbb4121885e8";
            var sigPoint = SchnorrUtil.ComputeSigPoint(msg, schnorrNonce, pubkey);

            Assert.Equal(expectedSigPoint, sigPoint.ToHexString());

            var isVerify = SchnorrUtil.Verify(signature, msg, pubkey);

            Assert.True(isVerify);

            var expectedNonce =
                "6470fd1303dda4fda717b9837153c24a6eab377183fc438f939e0ed2b620e9ee";
            var expectedPrivkey =
                "5077c4a8b8dca28963d772a94f5f0ddf598e1c47c137f91933274c7c3edadce8";

            Assert.Equal(expectedNonce, sig.GetNonce().ToHexString());
            Assert.Equal(expectedPrivkey, sig.GetKey().ToHexString());
        }
Esempio n. 16
0
        public void TaprootSchnorrSignTest2()
        {
            var sk  = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            var spk = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool _);

            Assert.Equal("1777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", spk.ToHexString());

            var addr = new Address(spk, CfdAddressType.Taproot, CfdNetworkType.Testnet);

            var txHex    = "020000000116d975e4c2cea30f72f4f5fe528f5a0727d9ea149892a50c030d44423088ea2f0000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d500000000";
            var outpoint = new OutPoint("2fea883042440d030ca5929814ead927075a8f52fef5f4720fa3cec2e475d916", 0);
            var utxos    = new UtxoData[] {
                new UtxoData(outpoint, 2499999000, new Descriptor(addr.GetLockingScript(), CfdNetworkType.Mainnet)),
            };
            var tx = new Transaction(txHex);

            tx.SetTxInUtxoData(utxos);
            var sighashType = new SignatureHashType(CfdSighashType.All);

            tx.AddSignWithPrivkeyByUtxoList(outpoint, sk, sighashType);
            Assert.Equal("0200000000010116d975e4c2cea30f72f4f5fe528f5a0727d9ea149892a50c030d44423088ea2f0000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d5014161f75636003a870b7a1685abae84eedf8c9527227ac70183c376f7b3a35b07ebcbea14749e58ce1a87565b035b2f3963baa5ae3ede95e89fd607ab7849f208720100000000", tx.ToHexString());

            tx.VerifySignByUtxoList(outpoint);
        }
Esempio n. 17
0
        public void SchnorrKeyTest()
        {
            var tweak        = new ByteData("e48441762fb75010b2aa31a512b62b4148aa3fb08eb0765d76b252559064a614");
            var sk           = new Privkey("688c77bc2d5aaff5491cf309d4753b732135470d05b7b2cd21add0744fe97bef");
            var pk           = new Pubkey("03b33cc9edc096d0a83416964bd3c6247b8fecd256e4efa7870d2c854bdeb33390");
            var pubkey       = new SchnorrPubkey("b33cc9edc096d0a83416964bd3c6247b8fecd256e4efa7870d2c854bdeb33390");
            var expTweakedPk = new SchnorrPubkey("1fc8e882e34cc7942a15f39ffaebcbdf58a19239bcb17b7f5aa88e0eb808f906");
            // bool expTweakedParity = true;
            var expTweakedSk = new Privkey("7bf7c9ba025ca01b698d3e9b3e40efce2774f8a388f8c390550481e1407b2a25");

            var schnorrPubkey = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool parity);

            Assert.Equal(pubkey.ToHexString(), schnorrPubkey.ToHexString());
            Assert.True(parity);

            var spk2 = SchnorrPubkey.GetPubkeyFromPubkey(pk, out parity);

            Assert.Equal(pubkey.ToHexString(), spk2.ToHexString());
            Assert.True(parity);

            var tweakedPubkey = schnorrPubkey.TweakAdd(tweak, out parity);

            Assert.Equal(expTweakedPk.ToHexString(), tweakedPubkey.ToHexString());
            Assert.True(parity);

            SchnorrPubkey.GetTweakAddKeyPair(sk, tweak, out SchnorrPubkey tweakedPubkey2, out parity, out Privkey tweakedPrivkey);
            Assert.Equal(expTweakedPk.ToHexString(), tweakedPubkey2.ToHexString());
            Assert.True(parity);
            Assert.Equal(expTweakedSk.ToHexString(), tweakedPrivkey.ToHexString());

            var isValid = tweakedPubkey.IsTweaked(parity, pubkey, tweak);

            Assert.True(isValid);
            isValid = tweakedPubkey.IsTweaked(!parity, pubkey, tweak);
            Assert.False(isValid);
        }
Esempio n. 18
0
        public void GetTxInfoTest()
        {
            ExtPrivkey privkey = new ExtPrivkey("xprv9zt1onyw8BdEf7SQ6wUVH3bQQdGD9iy9QzXveQQRhX7i5iUN7jZgLbqFEe491LfjozztYa6bJAGZ65GmDCNcbjMdjZcgmdisPJwVjcfcDhV");
            Address    addr1   = new Address(privkey.DerivePubkey(1).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);
            Address    addr2   = new Address(privkey.DerivePubkey(2).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);
            Address    addr3   = new Address(privkey.DerivePubkey(3).GetPubkey(), CfdAddressType.P2wpkh, CfdNetworkType.Regtest);

            OutPoint outpoint1 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 2);
            OutPoint outpoint2 = new OutPoint("0000000000000000000000000000000000000000000000000000000000000001", 3);
            var      txins     = new[] {
                new TxIn(outpoint1),
                new TxIn(outpoint2),
            };
            var txouts = new[] {
                new TxOut(10000, addr1.GetLockingScript()),
                new TxOut(10000, addr2.GetLockingScript()),
            };
            Transaction tx = new Transaction("02000000000000000000", txins, txouts);

            tx.AddTxOut(50000, addr3);
            output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("020000000201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c00000000",
                         tx.ToHexString());

            Privkey           privkey1    = privkey.DerivePrivkey(11).GetPrivkey();
            SignatureHashType sighashType = new SignatureHashType(CfdSighashType.All, false);

            tx.AddSignWithPrivkeySimple(outpoint1, CfdHashType.P2wpkh, privkey1, 50000, sighashType);
            // output.WriteLine("tx:\n" + tx.ToHexString());
            Assert.Equal("0200000000010201000000000000000000000000000000000000000000000000000000000000000200000000ffffffff01000000000000000000000000000000000000000000000000000000000000000300000000ffffffff0310270000000000001600148b756cbd98f4f55e985f80437a619d47f0732a941027000000000000160014c0a3dd0b7c1b3281be91112e16ce931dbac2a97950c3000000000000160014ad3abd3c325e40e20d89aa054dd980b97494f16c02473044022034db802aad655cd9be589075fc8ef325b6ffb8c24e5b27eb87bde8ad38f5fd7a0220364c916c8e8fc0adf714d7148cd1c6dc6f3e67d55471e57233b1870c65ec2727012103782f0ea892d7000e5f0f82b6ff283382a76500137a542bb0a616530094a8f54c0000000000",
                         tx.ToHexString());

            Txid txid = tx.GetTxid();

            output.WriteLine("txid: " + txid.ToHexString());
            Assert.Equal("67e1878d1621e77e166bed9d726bff27b2afcde9eb3dbb1ae3088d0387f40be4",
                         txid.ToHexString());
            Txid wtxid = tx.GetWtxid();

            output.WriteLine("wtxid: " + wtxid.ToHexString());
            Assert.Equal("24c66461b4b38c750fa4528d0cf3aea9a13d3156c0a73cfd6fca6958523b97f7",
                         wtxid.ToHexString());
            Assert.Equal((uint)295, tx.GetSize());
            Assert.Equal((uint)213, tx.GetVsize());
            Assert.Equal((uint)850, tx.GetWeight());
            Assert.Equal((uint)2, tx.GetVersion());
            Assert.Equal((uint)0, tx.GetLockTime());

            Assert.Equal((uint)2, tx.GetTxInCount());
            Assert.Equal((uint)3, tx.GetTxOutCount());
            Assert.Equal((uint)1, tx.GetTxInIndex(outpoint2));
            Assert.Equal((uint)2, tx.GetTxOutIndex(addr3));
            Assert.Equal((uint)1, tx.GetTxOutIndex(addr2.GetLockingScript()));

            Assert.True(outpoint2.Equals(tx.GetTxIn(outpoint2).OutPoint));
            Assert.True(outpoint2.Equals(tx.GetTxIn(1).OutPoint));
            Assert.True(outpoint2.Equals(tx.GetTxInList()[1].OutPoint));

            Assert.True(addr2.GetLockingScript().Equals(tx.GetTxOut(addr2).ScriptPubkey));
            Assert.True(addr2.GetLockingScript().Equals(tx.GetTxOut(addr2.GetLockingScript()).ScriptPubkey));
            Assert.True(addr2.GetLockingScript().Equals(tx.GetTxOut(1).ScriptPubkey));
            Assert.True(addr2.GetLockingScript().Equals(tx.GetTxOutList()[1].ScriptPubkey));
        }
Esempio n. 19
0
        public void TapScriptSignTest1()
        {
            var sk  = new Privkey("305e293b010d29bf3c888b617763a438fee9054c8cab66eb12ad078f819d9f27");
            var spk = SchnorrPubkey.GetPubkeyFromPrivkey(sk, out bool _);

            Assert.Equal("1777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb", spk.ToHexString());

            var scriptCheckSig = Script.CreateFromAsm(new string[] { spk.ToHexString(), "OP_CHECKSIG" });

            var tree = new TaprootScriptTree(scriptCheckSig);

            tree.AddBranches(new string[] {
                "4d18084bb47027f47d428b2ed67e1ccace5520fdc36f308e272394e288d53b6d",
                "dc82121e4ff8d23745f3859e8939ecb0a38af63e6ddea2fff97a7fd61a1d2d54",
            });
            var taprootData = tree.GetTaprootData(spk);

            Assert.Equal("3dee5a5387a2b57902f3a6e9da077726d19c6cc8c8c7b04bcf5a197b2a9b01d2", taprootData.Pubkey.ToHexString());
            Assert.Equal("dfc43ba9fc5f8a9e1b6d6a50600c704bb9e41b741d9ed6de6559a53d2f38e513", taprootData.TapLeafHash.ToHexString());
            Assert.Equal(
                "c01777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb4d18084bb47027f47d428b2ed67e1ccace5520fdc36f308e272394e288d53b6ddc82121e4ff8d23745f3859e8939ecb0a38af63e6ddea2fff97a7fd61a1d2d54",
                taprootData.ControlBlock.ToHexString());
            var tweakedPrivkey = tree.GetTweakedPrivkey(sk);

            Assert.Equal("a7d17bee0b6313cf864a1ac6f203aafd74a40703ffc050f66517e4f83ff41a03", tweakedPrivkey.ToHexString());

            var addr = new Address(taprootData.Pubkey, CfdAddressType.Taproot, CfdNetworkType.Mainnet);

            Assert.Equal("bc1p8hh955u8526hjqhn5m5a5pmhymgecmxgerrmqj70tgvhk25mq8fqw77n40", addr.ToAddressString());

            var txHex    = "02000000015b80a1af0e00c700bee9c8e4442bec933fcdc0c686dac2dc336caaaf186c5d190000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d500000000";
            var outpoint = new OutPoint("195d6c18afaa6c33dcc2da86c6c0cd3f93ec2b44e4c8e9be00c7000eafa1805b", 0);
            var utxos    = new UtxoData[] {
                new UtxoData(outpoint, 2499999000, new Descriptor(addr.GetLockingScript(), CfdNetworkType.Mainnet)),
            };
            var tx = new Transaction(txHex);

            tx.SetTxInUtxoData(utxos);
            var sighashType = new SignatureHashType(CfdSighashType.All);
            var sighash     = tx.GetSigHashByUtxoData(outpoint, sighashType, taprootData.TapLeafHash, Transaction.codeSeparatorPositionFinal);

            Assert.Equal("80e53eaee13048aee9c6c13fa5a8529aad7fe2c362bfc16f1e2affc71f591d36", sighash.ToHexString());

            var signature = SchnorrUtil.Sign(sighash, sk);
            var sig       = signature.GetSignData(sighashType);

            Assert.Equal(
                "f5aa6b260f9df687786cd3813ba83b476e195041bccea800f2571212f4aae9848a538b6175a4f8ea291d38e351ea7f612a3d700dca63cd3aff05d315c5698ee901",
                sig.ToHexString());

            tx.AddTapScriptSign(outpoint, new SignParameter[] { sig }, taprootData.TapScript, taprootData.ControlBlock);
            Assert.Equal(
                "020000000001015b80a1af0e00c700bee9c8e4442bec933fcdc0c686dac2dc336caaaf186c5d190000000000ffffffff0130f1029500000000160014164e985d0fc92c927a66c0cbaf78e6ea389629d50341f5aa6b260f9df687786cd3813ba83b476e195041bccea800f2571212f4aae9848a538b6175a4f8ea291d38e351ea7f612a3d700dca63cd3aff05d315c5698ee90122201777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfbac61c01777701648fa4dd93c74edd9d58cfcc7bdc2fa30a2f6fa908b6fd70c92833cfb4d18084bb47027f47d428b2ed67e1ccace5520fdc36f308e272394e288d53b6ddc82121e4ff8d23745f3859e8939ecb0a38af63e6ddea2fff97a7fd61a1d2d5400000000",
                tx.ToHexString());

            try
            {
                tx.VerifySignByUtxoList(outpoint);
                Assert.True(false);
            }
            catch (InvalidOperationException ae)
            {
                Assert.Equal("CFD error[IllegalStateError] message:The script analysis of tapscript is not supported.", ae.Message);
            }
            catch (Exception e)
            {
                Assert.Null(e);
            }

            var isVerify = spk.Verify(signature, sighash);

            Assert.True(isVerify);
        }