Parsing scriptSigs and scriptPubKeys for both p2sh and p2pkh

This commit is contained in:
Chris Stewart 2016-01-08 15:02:12 -06:00
parent 731648ece1
commit a55b7b64ce
3 changed files with 21 additions and 30 deletions

View file

@ -7,30 +7,20 @@ import scala.annotation.tailrec
/** /**
* Created by chris on 1/7/16. * Created by chris on 1/7/16.
*/ */
trait ScriptParser extends { trait ScriptParser {
/**
* Parses a script inside of a transaction
* @param str
* @tparam T
* @return
*/
def parseInputScript(str : String) : List[ScriptToken] = ???
/** /**
* Parses an output script of a transaction * Parses an output script of a transaction
* @param str * @param str
* @return * @return
*/ */
def parseOutputScript(str : String) : List[ScriptToken] = { def parse(str : String) : List[ScriptToken] = {
@tailrec @tailrec
def loop(operations : List[String], accum : List[ScriptToken]) : List[ScriptToken] = { def loop(operations : List[String], accum : List[ScriptToken]) : List[ScriptToken] = {
operations match { operations match {
case h :: t if (h == "0") => loop(t, OP_0 :: accum)
case h :: t if (ScriptOperationFactory.fromString(h).isDefined) => case h :: t if (ScriptOperationFactory.fromString(h).isDefined) =>
loop(t,ScriptOperationFactory.fromString(h).get :: accum) loop(t,ScriptOperationFactory.fromString(h).get :: accum)
case h :: t => loop(t, ScriptConstantImpl(h) :: accum) case h :: t => loop(t, ScriptConstantImpl(h) :: accum)
case h :: t if (h == "0") => loop(t, OP_0 :: accum)
case Nil => accum case Nil => accum
} }
} }

View file

@ -10,22 +10,23 @@ class ScriptParserTest extends FlatSpec with MustMatchers with ScriptParser {
"ScriptParser" must "parse an input script" in { "ScriptParser" must "parse an input script" in {
/* val parsedInput = parseInputScript(TestUtil.p2pkhInputScriptNotParsedAsm) val parsedInput = parse(TestUtil.p2pkhInputScriptNotParsedAsm)
parsedInput must be (TestUtil.p2pkhInputScriptAsm)*/ parsedInput must be (TestUtil.p2pkhInputScriptAsm)
} }
it must "parse a pay-to-pubkey-hash output script" in { it must "parse a pay-to-pubkey-hash output script" in {
val parsedOutput = parseOutputScript(TestUtil.p2pkhOutputScriptNotParsedAsm) val parsedOutput = parse(TestUtil.p2pkhOutputScriptNotParsedAsm)
parsedOutput must be (TestUtil.p2pkhOutputScriptAsm) parsedOutput must be (TestUtil.p2pkhOutputScriptAsm)
} }
it must "parse a pay-to-script-hash output script" in { it must "parse a pay-to-script-hash output script" in {
val parsedOutput = parseOutputScript(TestUtil.p2shOutputScriptNotParsedAsm) val parsedOutput = parse(TestUtil.p2shOutputScriptNotParsedAsm)
parsedOutput must be (TestUtil.p2shOutputScriptAsm) parsedOutput must be (TestUtil.p2shOutputScriptAsm)
} }
/* it must "parse a pay-to-script-hash input script" in { it must "parse a pay-to-script-hash input script" in {
val parsedInput = parseInput val parsedInput = parse(TestUtil.p2shInputScriptNotParsedAsm)
}*/ parsedInput must be (TestUtil.p2shInputScriptAsm)
}
} }

View file

@ -1,7 +1,7 @@
package org.scalacoin.util package org.scalacoin.util
import org.scalacoin.protocol.{AssetAddress, BitcoinAddress} import org.scalacoin.protocol.{AssetAddress, BitcoinAddress}
import org.scalacoin.script.ScriptConstantImpl import org.scalacoin.script.{OP_0, ScriptConstantImpl}
import org.scalacoin.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY} import org.scalacoin.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY}
import org.scalacoin.script.crypto.{OP_CHECKSIG, OP_HASH160} import org.scalacoin.script.crypto.{OP_CHECKSIG, OP_HASH160}
import org.scalacoin.script.stack.OP_DUP import org.scalacoin.script.stack.OP_DUP
@ -20,21 +20,21 @@ object TestUtil {
val p2pkhInputScriptNotParsedAsm = val p2pkhInputScriptNotParsedAsm =
"3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01" + "3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01" +
" 02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652" " 02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652"
val p2pkhInputScriptAsm = List("3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01", val p2pkhInputScriptAsm = List(
"02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652") ScriptConstantImpl("3044022016ffdbb7c57634903c5e018fcfc48d59f4e37dc4bc3bbc9ba4e6ee39150bca030220119c2241a931819bc1a75d3596e4029d803d1cd6de123bf8a1a1a2c3665e1fac01"),
ScriptConstantImpl("02af7dad03e682fcd0427b5c24140c220ac9d8abe286c15f8cf5bf77eed19c3652"))
val p2pkhOutputScriptNotParsedAsm = "OP_DUP OP_HASH160 e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b OP_EQUALVERIFY OP_CHECKSIG" val p2pkhOutputScriptNotParsedAsm = "OP_DUP OP_HASH160 e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b OP_EQUALVERIFY OP_CHECKSIG"
val p2pkhOutputScriptAsm = List(OP_DUP,OP_HASH160,ScriptConstantImpl("e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b"),OP_EQUALVERIFY, OP_CHECKSIG) val p2pkhOutputScriptAsm = List(OP_DUP,OP_HASH160,ScriptConstantImpl("e2e7c1ab3f807151e832dd1accb3d4f5d7d19b4b"),OP_EQUALVERIFY, OP_CHECKSIG)
val p2shInputScriptNotParsedAsm = val p2shInputScriptNotParsedAsm =
"""0 """0 3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101 3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01 522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae"""
|3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101
|3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01
|522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae
|""".stripMargin
val p2shInputScript = List(
val p2shInputScriptAsm = List(
OP_0,
ScriptConstantImpl("3045022100884c8a4776f4aa2a70f25f6bc0071929ade0ff4987844347e051e018c267aae402201fcec5dd052e7b01198bb57e1b58696c38ccd9d0b408c55047cac89b47287b4101"),
ScriptConstantImpl("3045022100b064d492712a080b726ecf37de2957b783fa411edae33bd13005e62d6a45d02302201b82b632df54cf1204758c2b5a3599f1f9a80da3d508951695bfcf8d2c2cce0f01"),
ScriptConstantImpl("522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452ae")
) )
val p2shOutputScriptNotParsedAsm = "OP_HASH160 8ce5408cfeaddb7ccb2545ded41ef47810945484 OP_EQUAL" val p2shOutputScriptNotParsedAsm = "OP_HASH160 8ce5408cfeaddb7ccb2545ded41ef47810945484 OP_EQUAL"
val p2shOutputScriptAsm = List(OP_HASH160, ScriptConstantImpl("8ce5408cfeaddb7ccb2545ded41ef47810945484"), OP_EQUAL) val p2shOutputScriptAsm = List(OP_HASH160, ScriptConstantImpl("8ce5408cfeaddb7ccb2545ded41ef47810945484"), OP_EQUAL)