Ejemplo n.º 1
0
        public void CanParseDerivationScheme()
        {
            var network = Network.Main;
            var factory = new DerivationStrategy.DerivationStrategyFactory(network);
            var tata    = new BitcoinExtPubKey("xpub661MyMwAqRbcFiadHioAunPTeic3C17HKPABCBvURz3W2ivn63jzEYYXWpDePLGncjLuRvQKx7jrKweSkoEvgQTvAo5zw4z8HPGC8Y4E4Wr", network);
            var toto    = new BitcoinExtPubKey("xpub661MyMwAqRbcFqyJE6zy5jMF7bjUtvNHgHJPbENEZtEQKRrukKWJP5xLMKntBaNya7CLMLL6u1KEk8GnrEv8pur5DFSgEMf1hRGjsJrcQKS", network);

            var direct = (DirectDerivationStrategy)factory.Parse($"{toto}-[legacy]");

            Assert.Equal($"{toto}-[legacy]", direct.ToString());
            var generated = Generate(direct);

            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Null(generated.Redeem);

            var p2wpkh = (DirectDerivationStrategy)factory.Parse($"{toto}");

            Assert.Equal($"{toto}", p2wpkh.ToString());
            generated = Generate(p2wpkh);
            Assert.Null(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.ScriptPubKey);

            var p2shp2wpkh = (P2SHDerivationStrategy)factory.Parse($"{toto}-[p2sh]");

            generated = Generate(p2shp2wpkh);
            Assert.NotNull(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.Redeem);

            //Same thing as above, reversed attribute
            p2shp2wpkh = (P2SHDerivationStrategy)factory.Parse($"{toto}-[p2sh]");
            Assert.Equal($"{toto}-[p2sh]", p2shp2wpkh.ToString());
            Assert.NotNull(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.Redeem);

            var multiSig = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[legacy]");

            generated = Generate(multiSig);
            Assert.Equal(new Script("2 025ca59b2007a67f24fdd26acefbe8feb5e8849c207d504b16d4801a8290fe9409 03d15f88de692693e0c25cec27b68da49ae4c29805efbe08154c4acfdf951ccb54 2 OP_CHECKMULTISIG"), generated.Redeem);
            multiSig = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[legacy]-[keeporder]");
            Assert.Equal($"2-of-{toto}-{tata}-[legacy]-[keeporder]", multiSig.ToString());
            generated = Generate(multiSig);
            Assert.Equal(new Script("2 03d15f88de692693e0c25cec27b68da49ae4c29805efbe08154c4acfdf951ccb54 025ca59b2007a67f24fdd26acefbe8feb5e8849c207d504b16d4801a8290fe9409 2 OP_CHECKMULTISIG"), generated.Redeem);

            var multiP2SH = (P2WSHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}");

            Assert.Equal($"2-of-{toto}-{tata}", multiP2SH.ToString());
            generated = Generate(multiP2SH);
            Assert.IsType <WitScriptId>(generated.ScriptPubKey.GetDestination());
            Assert.NotNull(PayToMultiSigTemplate.Instance.ExtractScriptPubKeyParameters(generated.Redeem));

            var multiP2WSHP2SH = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[p2sh]");

            Assert.Equal($"2-of-{toto}-{tata}-[p2sh]", multiP2WSHP2SH.ToString());
            generated = Generate(multiP2WSHP2SH);
            Assert.IsType <ScriptId>(generated.ScriptPubKey.GetDestination());
            Assert.NotNull(PayToMultiSigTemplate.Instance.ExtractScriptPubKeyParameters(generated.Redeem));
        }
Ejemplo n.º 2
0
 public static bool TryParse(ReadOnlySpan <char> strSpan, out DerivationSchemeTrackedSource derivationSchemeTrackedSource, Network network)
 {
     if (strSpan == null)
     {
         throw new ArgumentNullException(nameof(strSpan));
     }
     if (network == null)
     {
         throw new ArgumentNullException(nameof(network));
     }
     derivationSchemeTrackedSource = null;
     if (!strSpan.StartsWith("DERIVATIONSCHEME:".AsSpan(), StringComparison.Ordinal))
     {
         return(false);
     }
     try
     {
         var factory          = new DerivationStrategy.DerivationStrategyFactory(network);
         var derivationScheme = factory.Parse(strSpan.Slice("DERIVATIONSCHEME:".Length).ToString());
         derivationSchemeTrackedSource = new DerivationSchemeTrackedSource(derivationScheme);
         return(true);
     }
     catch { return(false); }
 }