Пример #1
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);
        }
Пример #2
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());
        }
Пример #3
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);
        }
Пример #4
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());
        }
Пример #5
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);
        }
Пример #6
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);
        }
Пример #7
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);
        }