From 6368642d09ea1ec550479549ebe0a04c3d91efdf Mon Sep 17 00:00:00 2001 From: Nadav Kohen Date: Thu, 31 May 2018 10:57:36 -0500 Subject: [PATCH] Added sequence parameter to coinbase and removed fruitless type test --- .../core/protocol/blockchain/ChainParamsTest.scala | 2 +- .../core/protocol/transaction/TransactionInputTest.scala | 2 +- .../bitcoins/core/protocol/blockchain/ChainParams.scala | 2 +- .../core/protocol/transaction/TransactionInput.scala | 9 ++++----- .../core/script/interpreter/ScriptInterpreter.scala | 6 +----- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/ChainParamsTest.scala b/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/ChainParamsTest.scala index 695298b7d8..adeefb8dd1 100644 --- a/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/ChainParamsTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/protocol/blockchain/ChainParamsTest.scala @@ -17,7 +17,7 @@ class ChainParamsTest extends FlatSpec with MustMatchers { val genesisTransaction = genesisBlock.transactions.head val expectedGenesisScriptSig = ScriptSignature("4D04FFFF001D0104455468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E206272696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73".toLowerCase()) - val expectedGenesisInput = CoinbaseInput(expectedGenesisScriptSig) + val expectedGenesisInput = CoinbaseInput(expectedGenesisScriptSig, TransactionConstants.sequence) val expectedGenesisScriptPubKey = ScriptPubKey("434104678AFDB0FE5548271967F1A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC".toLowerCase) val expectedGenesisOutput = TransactionOutput(Satoshis(Int64(5000000000L)), expectedGenesisScriptPubKey) "ChainParams" must "generate correct block hex for genesis block" in { diff --git a/core-test/src/test/scala/org/bitcoins/core/protocol/transaction/TransactionInputTest.scala b/core-test/src/test/scala/org/bitcoins/core/protocol/transaction/TransactionInputTest.scala index c92074a894..051d62582e 100644 --- a/core-test/src/test/scala/org/bitcoins/core/protocol/transaction/TransactionInputTest.scala +++ b/core-test/src/test/scala/org/bitcoins/core/protocol/transaction/TransactionInputTest.scala @@ -36,7 +36,7 @@ class TransactionInputTest extends FlatSpec with MustMatchers { } it must "serialize and deserialize a coinbase input" in { - val c = CoinbaseInput(P2PKScriptSignature("4847304502210092d4e6183970b5e082d87563afbcfb3e1f38e801d89f036fd2935c394d6cc364022032b2a419e19f00b6f32f88c4427cf5e2a97f298b7d4e45efb5f723d84257ca03")) + val c = CoinbaseInput(P2PKScriptSignature("4847304502210092d4e6183970b5e082d87563afbcfb3e1f38e801d89f036fd2935c394d6cc364022032b2a419e19f00b6f32f88c4427cf5e2a97f298b7d4e45efb5f723d84257ca03"), TransactionConstants.sequence) TransactionInput(c.previousOutput, c.scriptSignature, c.sequence) must be(c) c.hex must be(TransactionInput(c.previousOutput, c.scriptSignature, c.sequence).hex) } diff --git a/core/src/main/scala/org/bitcoins/core/protocol/blockchain/ChainParams.scala b/core/src/main/scala/org/bitcoins/core/protocol/blockchain/ChainParams.scala index 022157ab55..6326944e03 100644 --- a/core/src/main/scala/org/bitcoins/core/protocol/blockchain/ChainParams.scala +++ b/core/src/main/scala/org/bitcoins/core/protocol/blockchain/ChainParams.scala @@ -82,7 +82,7 @@ sealed abstract class ChainParams { val const = ScriptConstant(timestampBytes) val scriptSignature = ScriptSignature.fromAsm(Seq(BytesToPushOntoStack(4), ScriptNumber(486604799), BytesToPushOntoStack(1), ScriptNumber(4)) ++ BitcoinScriptUtil.calculatePushOp(const) ++ Seq(const)) - val input = CoinbaseInput(scriptSignature) + val input = CoinbaseInput(scriptSignature, TransactionConstants.sequence) val output = TransactionOutput(amount, scriptPubKey) val tx = BaseTransaction(TransactionConstants.version, Seq(input), Seq(output), TransactionConstants.lockTime) val prevBlockHash = DoubleSha256Digest("0000000000000000000000000000000000000000000000000000000000000000") diff --git a/core/src/main/scala/org/bitcoins/core/protocol/transaction/TransactionInput.scala b/core/src/main/scala/org/bitcoins/core/protocol/transaction/TransactionInput.scala index 5233b7e09f..32d9ca4b65 100644 --- a/core/src/main/scala/org/bitcoins/core/protocol/transaction/TransactionInput.scala +++ b/core/src/main/scala/org/bitcoins/core/protocol/transaction/TransactionInput.scala @@ -31,7 +31,6 @@ case object EmptyTransactionInput extends TransactionInput { */ sealed abstract class CoinbaseInput extends TransactionInput { override def previousOutput = EmptyTransactionOutPoint - override def sequence = TransactionConstants.sequence } object TransactionInput extends Factory[TransactionInput] { @@ -44,7 +43,7 @@ object TransactionInput extends Factory[TransactionInput] { def apply(outPoint: TransactionOutPoint, scriptSignature: ScriptSignature, sequenceNumber: UInt32): TransactionInput = outPoint match { - case EmptyTransactionOutPoint => CoinbaseInput(scriptSignature) + case EmptyTransactionOutPoint => CoinbaseInput(scriptSignature, sequenceNumber) case _: TransactionOutPoint => TransactionInputImpl(outPoint, scriptSignature, sequenceNumber) } @@ -52,13 +51,13 @@ object TransactionInput extends Factory[TransactionInput] { object CoinbaseInput { - private case class CoinbaseInputImpl(scriptSignature: ScriptSignature) extends CoinbaseInput + private case class CoinbaseInputImpl(scriptSignature: ScriptSignature, sequence: UInt32) extends CoinbaseInput /** * Creates a coinbase input - coinbase inputs always have an empty outpoint * @param scriptSignature this can contain anything, miners use this to signify support for various protocol BIPs * @return the coinbase input */ - def apply(scriptSignature: ScriptSignature): CoinbaseInput = { - CoinbaseInputImpl(scriptSignature) + def apply(scriptSignature: ScriptSignature, sequence: UInt32): CoinbaseInput = { + CoinbaseInputImpl(scriptSignature, sequence) } } \ No newline at end of file diff --git a/core/src/main/scala/org/bitcoins/core/script/interpreter/ScriptInterpreter.scala b/core/src/main/scala/org/bitcoins/core/script/interpreter/ScriptInterpreter.scala index fd0021638d..11c26298cf 100644 --- a/core/src/main/scala/org/bitcoins/core/script/interpreter/ScriptInterpreter.scala +++ b/core/src/main/scala/org/bitcoins/core/script/interpreter/ScriptInterpreter.scala @@ -563,11 +563,7 @@ sealed abstract class ScriptInterpreter { case w: WitnessTxSigComponentP2SH => !w.scriptSignature.redeemScript.isInstanceOf[WitnessScriptPubKey] case r: WitnessTxSigComponentRebuilt => - r.transaction match { - case wtx: WitnessTransaction => - wtx.witness.witnesses(txSigComponent.inputIndex.toInt).stack.nonEmpty - case _: BaseTransaction => false - } + r.transaction.witness.witnesses(txSigComponent.inputIndex.toInt).stack.nonEmpty } if (unexpectedWitness) logger.error("Found unexpected witness that was not used by the ScriptProgram: " + program)