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()); }
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()); }
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); }
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); }
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); }
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()); }
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); }
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); }
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))}..."); } }
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()); }
public void ShouldDeserializeAndSerializeTransaction(string hex) { var trx = new ZcashTransaction(hex).ToHex(); Assert.Equal(hex, trx); }