private Transaction[] SetupDummyInputs(CoinsView coinsRet) { Transaction[] dummyTransactions = Enumerable.Range(0, 2).Select(_ => new Transaction()).ToArray(); // Add some keys to the keystore: Key[] key = Enumerable.Range(0, 4).Select((_, i) => new Key(i % 2 != 0)).ToArray(); // Create some dummy input transactions dummyTransactions[0].Outputs.AddRange(Enumerable.Range(0, 2).Select(_ => new TxOut())); dummyTransactions[0].Outputs[0].Value = 11 * Money.CENT; dummyTransactions[0].Outputs[0].ScriptPubKey = dummyTransactions[0].Outputs[0].ScriptPubKey + key[0].PubKey.ToBytes() + OpcodeType.OP_CHECKSIG; dummyTransactions[0].Outputs[1].Value = 50 * Money.CENT; dummyTransactions[0].Outputs[1].ScriptPubKey = dummyTransactions[0].Outputs[1].ScriptPubKey + key[1].PubKey.ToBytes() + OpcodeType.OP_CHECKSIG; coinsRet.AddTransaction(dummyTransactions[0], 0); dummyTransactions[1].Outputs.AddRange(Enumerable.Range(0, 2).Select(_ => new TxOut())); dummyTransactions[1].Outputs[0].Value = 21 * Money.CENT; dummyTransactions[1].Outputs[0].ScriptPubKey = key[2].PubKey.GetAddress(Network.Main).ScriptPubKey; dummyTransactions[1].Outputs[1].Value = 22 * Money.CENT; dummyTransactions[1].Outputs[1].ScriptPubKey = key[3].PubKey.GetAddress(Network.Main).ScriptPubKey; coinsRet.AddTransaction(dummyTransactions[1], 0); return dummyTransactions; }
public void test_IsStandard() { var coins = new CoinsView(); Transaction[] dummyTransactions = SetupDummyInputs(coins); Transaction t = new Transaction(); t.Inputs.Add(new TxIn()); t.Inputs[0].PrevOut.Hash = dummyTransactions[0].GetHash(); t.Inputs[0].PrevOut.N = 1; t.Inputs[0].ScriptSig = new Script(Op.GetPushOp(new byte[65])); t.Outputs.Add(new TxOut()); t.Outputs[0].Value = 90 * Money.CENT; Key key = new Key(true); t.Outputs[0].ScriptPubKey = PayToPubkeyHashTemplate.Instance.GenerateScriptPubKey(key.PubKey.Hash); Assert.True(StandardScripts.IsStandardTransaction(t)); t.Outputs[0].Value = 501; //dust Assert.True(!StandardScripts.IsStandardTransaction(t)); t.Outputs[0].Value = 2730; // not dust Assert.True(StandardScripts.IsStandardTransaction(t)); t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_1; Assert.True(!StandardScripts.IsStandardTransaction(t)); // 80-byte TX_NULL_DATA (standard) t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN + ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"); Assert.True(StandardScripts.IsStandardTransaction(t)); // 81-byte TX_NULL_DATA (non-standard) t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN + ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3804678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3800"); Assert.True(!StandardScripts.IsStandardTransaction(t)); // TX_NULL_DATA w/o PUSHDATA t.Outputs.Clear(); t.Outputs.Add(new TxOut()); t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN; Assert.True(StandardScripts.IsStandardTransaction(t)); // Only one TX_NULL_DATA permitted in all cases t.Outputs.Clear(); t.Outputs.Add(new TxOut()); t.Outputs.Add(new TxOut()); t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN + ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"); t.Outputs[1].ScriptPubKey = new Script() + OpcodeType.OP_RETURN + ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"); Assert.True(!StandardScripts.IsStandardTransaction(t)); t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN + ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38"); t.Outputs[1].ScriptPubKey = new Script() + OpcodeType.OP_RETURN; Assert.True(!StandardScripts.IsStandardTransaction(t)); t.Outputs[0].ScriptPubKey = new Script() + OpcodeType.OP_RETURN; t.Outputs[1].ScriptPubKey = new Script() + OpcodeType.OP_RETURN; Assert.True(!StandardScripts.IsStandardTransaction(t)); }
public void test_Get() { byte[] dummyPubKey = new byte[65]; dummyPubKey[0] = 0x04; byte[] dummyPubKey2 = new byte[33]; dummyPubKey2[0] = 0x02; //CBasicKeyStore keystore; //CCoinsView coinsDummy; CoinsView coins = new CoinsView();//(coinsDummy); Transaction[] dummyTransactions = SetupDummyInputs(coins);//(keystore, coins); Transaction t1 = new Transaction(); t1.Inputs.AddRange(Enumerable.Range(0, 3).Select(_ => new TxIn())); t1.Inputs[0].PrevOut.Hash = dummyTransactions[0].GetHash(); t1.Inputs[0].PrevOut.N = 1; t1.Inputs[0].ScriptSig += dummyPubKey; t1.Inputs[1].PrevOut.Hash = dummyTransactions[1].GetHash(); t1.Inputs[1].PrevOut.N = 0; t1.Inputs[1].ScriptSig = t1.Inputs[1].ScriptSig + dummyPubKey + dummyPubKey2; t1.Inputs[2].PrevOut.Hash = dummyTransactions[1].GetHash(); t1.Inputs[2].PrevOut.N = 1; t1.Inputs[2].ScriptSig = t1.Inputs[2].ScriptSig + dummyPubKey + dummyPubKey2; t1.Outputs.AddRange(Enumerable.Range(0, 2).Select(_ => new TxOut())); t1.Outputs[0].Value = 90 * Money.CENT; t1.Outputs[0].ScriptPubKey += OpcodeType.OP_1; Assert.True(StandardScripts.AreInputsStandard(t1, coins)); //Assert.Equal(coins.GetValueIn(t1), (50+21+22)*Money.CENT); //// Adding extra junk to the scriptSig should make it non-standard: t1.Inputs[0].ScriptSig += OpcodeType.OP_11; Assert.True(!StandardScripts.AreInputsStandard(t1, coins)); //// ... as should not having enough: t1.Inputs[0].ScriptSig = new Script(); Assert.True(!StandardScripts.AreInputsStandard(t1, coins)); }