Ejemplo n.º 1
0
        public void ShouldSignV4()
        {
            var tx = new ZcashTransaction(v4);

            var privateKeys = new Key[]
            {
                Key.Parse("cVWdihupzUy3GyP5bha15Dk1W1ejbETBngMV51xATMJzr4Z6fnRk", ZcashNetworks.Instance.Testnet)
            };

            var coins = new Coin[]
            {
                new Coin(
                    new OutPoint(uint256.Parse("e7ab8fb7c05097e88a29a816bdc75c958e58a8deee659c14baf9ffe51da96307"), 1),
                    new TxOut(Money.Coins(2.70996151m), privateKeys[0].ScriptPubKey))
            };

            tx.Sign(privateKeys, coins);

            Assert.Equal(
                "0400008085202f89010763a91de5fff9ba149c65eedea8588e955cc7bd16a8298ae89750c0b78fabe7010000006a473044022018a289ad0bec96d8a6f17aef76df46c38e4932f17433f" +
                "133d3df309f33c712740220311906fa7c6baff0c2388a87e55272429f1de6f311f8d651dd0d9be4772b634d01210250b36ab2839e868e6c12c9cb252c3d7b71b61a7039e3c6a55a53ca" +
                "c6f8a1c17bffffffff0240420f00000000001976a9141fecb553b1cff0364a7308ffd9ec8169495cf47288ac6fc11710000000001976a9147176f5d11e11c59a1248ef0bf0d6dadb2be" +
                "1686188ac00000000c943ff020000000000000000000000",
                tx.ToHex());
        }
Ejemplo n.º 2
0
        public void ShouldSignV3()
        {
            var tx = new ZcashTransaction("030000807082c40301ac3e4e9435a8369e049b47906ddaa09601cd7e7cfe2f229e0bd305202a066f8e0100000000ffffffff02809698000000000019" +
                                          "76a91415b6246e9b88867cdc3e14b9a5085813ca6d8b4888acc9180202000000001976a9144faeeb51bcd0b49f238b323e5f1c6c8bf11ae02a88ac00" +
                                          "0000005782030000");

            var privateKeys = new Key[]
            {
                Key.Parse("cTD2Ew71UHXkn2XTJLyfu6Rbo1os5zCF9sKZm4oiXshcYo6YPcKY", ZcashNetworks.Instance.Testnet)
            };

            var coins = new Coin[]
            {
                new Coin(
                    new OutPoint(uint256.Parse("8e6f062a2005d30b9e222ffe7c7ecd0196a0da6d90479b049e36a835944e3eac"), 1),
                    new TxOut(Money.Coins(0.43695697m), privateKeys[0].ScriptPubKey))
            };

            tx.Sign(privateKeys, coins);

            var txHex = tx.ToHex();

            Assert.Equal(
                "030000807082c40301ac3e4e9435a8369e049b47906ddaa09601cd7e7cfe2f229e0bd305202a066f8e010000006b483045022100ee41236b2550aa334948e1b750b8f9dd12f30ea15b" +
                "879fe0bf7f9a86989bef230220336f17006636afc4165bef0a5fc1e79a1204f21ec1f1ad71c3c326e4091bc7fa012103f9e72f0713a4d4a980309a14a2ba563e0b1125ad067818e775" +
                "53a1eefbfc5be7ffffffff0280969800000000001976a91415b6246e9b88867cdc3e14b9a5085813ca6d8b4888acc9180202000000001976a9144faeeb51bcd0b49f238b323e5f1c6c" +
                "8bf11ae02a88ac000000005782030000",
                tx.ToHex());
        }
Ejemplo n.º 3
0
        public void ShouldDeserializeV3()
        {
            var tx = new ZcashTransaction(v3);

            Assert.Equal("bd3772485a22944991d3e29fa775d1a90b26b5f052b7869a9f2b41a5112ea9c5", tx.GetHash().ToString());
            Assert.Equal("9e57c9ace4f1c6797fbb12334d913838061d08264a7ae186824cd8b94b1e8791", tx.Inputs[0].PrevOut.Hash.ToString());
            Assert.Equal(300000000L, tx.Outputs[0].Value.Satoshi);
        }
Ejemplo n.º 4
0
        public void ShouldDeserializeV1()
        {
            var tx = new ZcashTransaction(v1);

            Assert.Equal("5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061", tx.GetHash().ToString());
            Assert.Equal("5e6e4ea05be96f47715c193444e77cf9f6bd18afa7fca7800db7dc5d69a024ea", tx.Inputs[0].PrevOut.Hash.ToString());
            Assert.Equal(288595012L, tx.Outputs[0].Value.Satoshi);
        }
Ejemplo n.º 5
0
        public void ShouldDeserializeV4()
        {
            var tx = new ZcashTransaction(v4);

            Assert.Equal("011bc69c232c8fa864d9647700a47452447f15c7913555c2291030809361172c", tx.GetHash().ToString());
            Assert.Equal("e7ab8fb7c05097e88a29a816bdc75c958e58a8deee659c14baf9ffe51da96307", tx.Inputs[0].PrevOut.Hash.ToString());
            Assert.Contains(tx.Outputs, x => x.Value.Satoshi == 001000000L);
            Assert.Contains(tx.Outputs, x => x.Value.Satoshi == 269992303L);
        }
Ejemplo n.º 6
0
        private string SignLocally(string tx, Utxo[] outputs, string[] keys, uint?branchId)
        {
            var transaction = new ZcashTransaction(tx, branchId);
            var privateKeys = keys.Select(k => Key.Parse(k)).ToArray();
            var coins       = outputs
                              .Select(x => new Coin(uint256.Parse(x.TxId), x.Vout, Money.Coins(x.Amount), new Script(Encoders.Hex.DecodeData(x.ScriptPubKey))))
                              .ToArray();

            transaction.Sign(privateKeys, coins);

            return(transaction.ToHex());
        }
Ejemplo n.º 7
0
        public void ShouldSignTestVectorsInline(string rawTransaction, string script, int vin, SigHash hashType, long money, string expected)
        {
            var trx = new ZcashTransaction(rawTransaction);
            var hex = trx.ToHex();

            Assert.Equal(rawTransaction, hex);

            var scriptCode = new Script(Encoders.Hex.DecodeData(script));
            var actual     = new uint256(trx.GetSignatureHash(scriptCode, vin, hashType, Money.Satoshis(money), HashVersion.Original, null)
                                         .ToBytes()
                                         .Reverse()
                                         .ToArray()).ToString();

            Assert.Equal(expected, actual);
        }
Ejemplo n.º 8
0
        protected override Transaction CreateOutputTransaction()
        {
            var txNetwork = Network.GetNetwork(networkParams.CoinbaseTxNetwork);
            var tx1       = Transaction.Create(txNetwork);
            var tx        = new ZcashTransaction(tx1.ToHex());

            // set versions
            tx.Version = txVersion;

            overwinterField.SetValue(tx, true);
            versionGroupField.SetValue(tx, txVersionGroupId);

            // pool reward (t-addr)
            rewardToPool = new Money(blockReward + rewardFees, MoneyUnit.Satoshi);
            tx.Outputs.Add(rewardToPool, poolAddressDestination);


            return(tx);
        }
Ejemplo n.º 9
0
        public void ShouldSignTestVectors(string rawTransaction, string script, int vin, uint hashType, uint branchId, string expected)
        {
            try
            {
                var trx = new ZcashTransaction(rawTransaction, branchId);
                var hex = trx.ToHex();

                Assert.Equal(rawTransaction, hex);

                var scriptCode = new Script(Encoders.Hex.DecodeData(script));
                var actual     = trx.GetSignatureHash(scriptCode, vin, (SigHash)hashType, Money.Zero, HashVersion.Original, null)
                                 .ToString();

                Assert.Equal(expected, actual);
            }
            catch (NotSupportedException)
            {
                Console.WriteLine($"Unsupported tx {rawTransaction.Substring(0, Math.Min(rawTransaction.Length, 32))}...");
            }
        }
Ejemplo n.º 10
0
        public void ShouldSignV1()
        {
            var prevTx = Transaction.Parse("01000000018d600e5b601607b9ba7d788830ce442893ba091520d0ac9706b3f5bce0670696010000006a47304402202d83e5f388d44fbf3d93a55d" +
                                           "e8eac7744edb04bfc5845e2392d59c51e7d90a28022043a95b0088bb09022ee519e8421eb5c347f5d8ace24dd4242364605754f171a20121033724" +
                                           "13cbd5741751044d91b0d225715e783a3fce9f51dc5491f938634783dff1ffffffff015c9ce111000000001976a9144faeeb51bcd0b49f238b323e" +
                                           "5f1c6c8bf11ae02a88ac00000000");
            var from           = "tmGygFvgg1B35XeX3oC4e78VSiAyRGcCgME";
            var fromAddress    = new BitcoinPubKeyAddress(from);
            var fromPrivateKey = "cTD2Ew71UHXkn2XTJLyfu6Rbo1os5zCF9sKZm4oiXshcYo6YPcKY";
            var fromKey        = Key.Parse(fromPrivateKey);
            var to             = "tmLaY2Ceabpd9TgMmPv6zfDfVGEwmAWuPKo";
            var toAddress      = new BitcoinPubKeyAddress(to);

            var hex = new TransactionBuilder()
                      .AddCoins(prevTx.Outputs.AsCoins())
                      .Send(toAddress, Money.Coins(0.5m))
                      .SetChange(fromAddress)
                      .SendFees(Money.Coins(0.00002380m))
                      .BuildTransaction(false)
                      .ToHex();

            var tx = new ZcashTransaction(hex);

            tx.Sign(new[] { fromKey }, prevTx.Outputs.AsCoins().ToArray());

            Assert.Equal(
                "c749dbf380e287fb84190b4d6695b82e7eb4f91a1f79c68dc0cfb539fbdd45c4",
                tx.GetHash().ToString());

            Assert.Equal(
                "01000000016cf8b84870d09e65f5809772d8d56e7ec69801291fe3ae7f8e6e6446e80886fd000000006b483045022100f5a4d723f4dbd4b5c2c3e603ed67f5a8798c7a264198cf7035" +
                "eb88d7e92dce4102204237d7e5af9a2fd64545f6bc8fbad0039510dca378795299454dc0253cd46785012103f9e72f0713a4d4a980309a14a2ba563e0b1125ad067818e77553a1eefb" +
                "fc5be7ffffffff0290a2e60e000000001976a9144faeeb51bcd0b49f238b323e5f1c6c8bf11ae02a88ac80f0fa02000000001976a914772efac94ff91e33c6b2540e4b539fbbcd9b0e" +
                "bb88ac00000000",
                tx.ToHex());
        }
Ejemplo n.º 11
0
        public void ShouldDeserializeAndSerializeTransaction(string hex)
        {
            var trx = new ZcashTransaction(hex).ToHex();

            Assert.Equal(hex, trx);
        }