public void witnessHasPushSizeLimit() { Key bob = new Key(); Transaction tx = new Transaction(); tx.Outputs.Add(new TxOut(Money.Coins(1.0m), bob.PubKey.ScriptPubKey.WitHash)); WitScriptCoin coin = new WitScriptCoin(tx.Outputs.AsCoins().First(), bob.PubKey.ScriptPubKey); Transaction spending = new Transaction(); spending.AddInput(tx, 0); spending.Sign(bob, coin); ScriptError error; Assert.True(spending.Inputs.AsIndexedInputs().First().VerifyScript(coin, out error)); spending.Inputs[0].WitScript = new WitScript(new[] { new byte[521] }.Concat(spending.Inputs[0].WitScript.Pushes).ToArray()); Assert.False(spending.Inputs.AsIndexedInputs().First().VerifyScript(coin, out error)); Assert.Equal(ScriptError.PushSize, error); }
public void CanBuildWitTransaction() { Key alice = new Key(); Key bob = new Key(); Transaction previousTx = null; Coin previousCoin = null; WitScriptCoin witnessCoin = null; TransactionBuilder builder = null; Transaction signedTx = null; ScriptCoin scriptCoin = null; //P2WPKH previousTx = new Transaction(); previousTx.Outputs.Add(new TxOut(Money.Coins(1.0m), alice.PubKey.WitHash)); previousCoin = previousTx.Outputs.AsCoins().First(); builder = new TransactionBuilder(); builder.AddKeys(alice); builder.AddCoins(previousCoin); builder.Send(bob, Money.Coins(0.4m)); builder.SendFees(Money.Satoshis(30000)); builder.SetChange(alice); signedTx = builder.BuildTransaction(true); Assert.True(builder.Verify(signedTx)); //P2WSH previousTx = new Transaction(); previousTx.Outputs.Add(new TxOut(Money.Coins(1.0m), alice.PubKey.ScriptPubKey.WitHash)); previousCoin = previousTx.Outputs.AsCoins().First(); witnessCoin = new WitScriptCoin(previousCoin, alice.PubKey.ScriptPubKey); builder = new TransactionBuilder(); builder.AddKeys(alice); builder.AddCoins(witnessCoin); builder.Send(bob, Money.Coins(0.4m)); builder.SendFees(Money.Satoshis(30000)); builder.SetChange(alice); signedTx = builder.BuildTransaction(true); Assert.True(builder.Verify(signedTx)); //P2SH(P2WPKH) previousTx = new Transaction(); previousTx.Outputs.Add(new TxOut(Money.Coins(1.0m), alice.PubKey.WitHash.ScriptPubKey.Hash)); previousCoin = previousTx.Outputs.AsCoins().First(); scriptCoin = new ScriptCoin(previousCoin, alice.PubKey.WitHash.ScriptPubKey); builder = new TransactionBuilder(); builder.AddKeys(alice); builder.AddCoins(scriptCoin); builder.Send(bob, Money.Coins(0.4m)); builder.SendFees(Money.Satoshis(30000)); builder.SetChange(alice); signedTx = builder.BuildTransaction(true); Assert.True(builder.Verify(signedTx)); //P2SH(P2WSH) previousTx = new Transaction(); previousTx.Outputs.Add(new TxOut(Money.Coins(1.0m), alice.PubKey.ScriptPubKey.WitHash.ScriptPubKey.Hash)); previousCoin = previousTx.Outputs.AsCoins().First(); witnessCoin = new WitScriptCoin(previousCoin, alice.PubKey.ScriptPubKey); builder = new TransactionBuilder(); builder.AddKeys(alice); builder.AddCoins(witnessCoin); builder.Send(bob, Money.Coins(0.4m)); builder.SendFees(Money.Satoshis(30000)); builder.SetChange(alice); signedTx = builder.BuildTransaction(true); Assert.True(builder.Verify(signedTx)); //Can remove witness data from tx var signedTx2 = signedTx.WithOptions(TransactionOptions.None); Assert.Equal(signedTx.GetHash(), signedTx2.GetHash()); Assert.True(signedTx2.GetSerializedSize() < signedTx.GetSerializedSize()); }