mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-01-19 05:43:51 +01:00
renaming fromOpCode to fromByte inside of ScriptOperationFactory
This commit is contained in:
parent
6f4687c50e
commit
2b642deb32
@ -45,7 +45,7 @@ trait ScriptParser extends ScalacoinUtil {
|
|||||||
def loop(bytes : List[Byte], accum : List[ScriptToken]) : List[ScriptToken] = {
|
def loop(bytes : List[Byte], accum : List[ScriptToken]) : List[ScriptToken] = {
|
||||||
bytes match {
|
bytes match {
|
||||||
case h :: t =>
|
case h :: t =>
|
||||||
val op = ScriptOperationFactory.fromOpCode(h).get
|
val op = ScriptOperationFactory.fromByte(h).get
|
||||||
//means that we need to push x amount of bytes on to the stack
|
//means that we need to push x amount of bytes on to the stack
|
||||||
if (ScriptNumberFactory.operations.contains(op)) {
|
if (ScriptNumberFactory.operations.contains(op)) {
|
||||||
val (constant,tail) = pushConstant(ScriptNumberImpl(op.opCode),t)
|
val (constant,tail) = pushConstant(ScriptNumberImpl(op.opCode),t)
|
||||||
|
@ -11,6 +11,8 @@ import org.scalacoin.util.ScalacoinUtil
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by chris on 1/8/16.
|
* Created by chris on 1/8/16.
|
||||||
|
* Responsible for matching script op codes with their given
|
||||||
|
* hexadecimal representation or byte representation
|
||||||
*/
|
*/
|
||||||
trait ScriptOperationFactory[T <: ScriptOperation] extends ScalacoinUtil {
|
trait ScriptOperationFactory[T <: ScriptOperation] extends ScalacoinUtil {
|
||||||
|
|
||||||
@ -28,7 +30,12 @@ trait ScriptOperationFactory[T <: ScriptOperation] extends ScalacoinUtil {
|
|||||||
*/
|
*/
|
||||||
def fromString(str : String) : Option[T] = operations.find(_.toString == str)
|
def fromString(str : String) : Option[T] = operations.find(_.toString == str)
|
||||||
|
|
||||||
def fromOpCode(byte : Byte) : Option[T] = {
|
/**
|
||||||
|
* Finds a script operation from a given byte
|
||||||
|
* @param byte
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
def fromByte(byte : Byte) : Option[T] = {
|
||||||
val hex = encodeHex(byte)
|
val hex = encodeHex(byte)
|
||||||
operations.find(op => op.hex == hex)
|
operations.find(op => op.hex == hex)
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,13 @@ package org.scalacoin.script.constant
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
trait ScriptToken
|
trait ScriptToken {
|
||||||
|
def hex : String
|
||||||
|
}
|
||||||
|
|
||||||
trait ScriptOperation extends ScriptToken {
|
trait ScriptOperation extends ScriptToken {
|
||||||
def opCode : Int
|
def opCode : Int
|
||||||
def hex : String = {
|
override def hex : String = {
|
||||||
val hex = Integer.toHexString(opCode)
|
val hex = Integer.toHexString(opCode)
|
||||||
if (hex == "0") "00" else hex
|
if (hex == "0") "00" else hex
|
||||||
}
|
}
|
||||||
@ -19,10 +21,9 @@ sealed trait ScriptConstant extends ScriptToken
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represent a pubkey or hash of a pub key on our stack
|
* Represent a pubkey or hash of a pub key on our stack
|
||||||
*
|
* @param hex
|
||||||
* @param str
|
|
||||||
*/
|
*/
|
||||||
case class ScriptConstantImpl(str : String) extends ScriptConstant
|
case class ScriptConstantImpl(hex : String) extends ScriptConstant
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An empty array of bytes is pushed onto the stack. (This is not a no-op: an item is added to the stack.)
|
* An empty array of bytes is pushed onto the stack. (This is not a no-op: an item is added to the stack.)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package org.scalacoin.script.crypto
|
package org.scalacoin.script.crypto
|
||||||
|
|
||||||
import org.scalacoin.script.constant.{ScriptConstantImpl, ScriptConstant, ScriptToken}
|
import org.scalacoin.protocol.script.ScriptPubKey
|
||||||
|
import org.scalacoin.protocol.transaction.Transaction
|
||||||
|
import org.scalacoin.script.constant.{ScriptOperation, ScriptConstantImpl, ScriptConstant, ScriptToken}
|
||||||
import org.scalacoin.util.{CryptoUtil, ScalacoinUtil}
|
import org.scalacoin.util.{CryptoUtil, ScalacoinUtil}
|
||||||
|
|
||||||
|
|
||||||
@ -37,7 +39,36 @@ trait CryptoInterpreter extends ScalacoinUtil {
|
|||||||
???
|
???
|
||||||
}
|
}
|
||||||
|
|
||||||
/*def codeSeparator()*/
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The entire transaction's outputs, inputs, and script (from the most
|
||||||
|
* recently-executed OP_CODESEPARATOR to the end) are hashed.
|
||||||
|
* The signature used by OP_CHECKSIG must be a valid signature for this hash and public key.
|
||||||
|
* If it is, 1 is returned, 0 otherwise.
|
||||||
|
* @param inputScript
|
||||||
|
* @param script
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
def checkSig(tx : Transaction, scriptPubKey : ScriptPubKey) : Boolean = {
|
||||||
|
val signature : ScriptToken = tx.inputs.head.scriptSignature.asm.head
|
||||||
|
val pubKey : ScriptToken = tx.inputs.head.scriptSignature.asm(1)
|
||||||
|
|
||||||
|
//delete ECDSA signature
|
||||||
|
val inputWithoutScriptSig : Seq[ScriptToken] = tx.inputs.head.scriptSignature.asm.tail
|
||||||
|
|
||||||
|
val fullScriptWithoutScripgSig : Seq[ScriptToken] = inputWithoutScriptSig ++ scriptPubKey.asm
|
||||||
|
|
||||||
|
/*val hashType = HashTypeFactory.factory(ScalacoinUtil.decodeHex(signature.hex).last)*/
|
||||||
|
//check signature against the tx
|
||||||
|
|
||||||
|
???
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,18 +15,18 @@ import org.scalatest.{FlatSpec, MustMatchers}
|
|||||||
class ScriptOperationFactoryTest extends FlatSpec with MustMatchers {
|
class ScriptOperationFactoryTest extends FlatSpec with MustMatchers {
|
||||||
|
|
||||||
"ScriptOperationFactory" must "match operations with their byte representation" in {
|
"ScriptOperationFactory" must "match operations with their byte representation" in {
|
||||||
ScriptOperationFactory.fromOpCode(0x00) must be (Some(OP_0))
|
ScriptOperationFactory.fromByte(0x00) must be (Some(OP_0))
|
||||||
ScriptOperationFactory.fromOpCode(0x51) must be (Some(OP_1))
|
ScriptOperationFactory.fromByte(0x51) must be (Some(OP_1))
|
||||||
|
|
||||||
ScriptOperationFactory.fromOpCode(0x63) must be (Some(OP_IF))
|
ScriptOperationFactory.fromByte(0x63) must be (Some(OP_IF))
|
||||||
ScriptOperationFactory.fromOpCode(0x6b) must be (Some(OP_TOALTSTACK))
|
ScriptOperationFactory.fromByte(0x6b) must be (Some(OP_TOALTSTACK))
|
||||||
|
|
||||||
ScriptOperationFactory.fromOpCode(135.toByte) must be (Some(OP_EQUAL))
|
ScriptOperationFactory.fromByte(135.toByte) must be (Some(OP_EQUAL))
|
||||||
|
|
||||||
ScriptOperationFactory.fromOpCode(139.toByte) must be (Some(OP_1ADD))
|
ScriptOperationFactory.fromByte(139.toByte) must be (Some(OP_1ADD))
|
||||||
|
|
||||||
ScriptOperationFactory.fromOpCode(166.toByte) must be (Some(OP_RIPEMD160))
|
ScriptOperationFactory.fromByte(166.toByte) must be (Some(OP_RIPEMD160))
|
||||||
ScriptOperationFactory.fromOpCode(177.toByte) must be (Some(OP_CHECKLOCKTIMEVERIFY))
|
ScriptOperationFactory.fromByte(177.toByte) must be (Some(OP_CHECKLOCKTIMEVERIFY))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.scalacoin.util
|
package org.scalacoin.util
|
||||||
|
|
||||||
import org.scalacoin.marshallers.script.RawScriptPubKeyParser
|
import org.scalacoin.marshallers.script.RawScriptPubKeyParser
|
||||||
|
import org.scalacoin.marshallers.transaction.RawTransactionParser
|
||||||
import org.scalacoin.protocol.{AssetAddress, BitcoinAddress}
|
import org.scalacoin.protocol.{AssetAddress, BitcoinAddress}
|
||||||
import org.scalacoin.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY}
|
import org.scalacoin.script.bitwise.{OP_EQUAL, OP_EQUALVERIFY}
|
||||||
import org.scalacoin.script.constant.{ScriptToken, OP_0, ScriptConstantImpl}
|
import org.scalacoin.script.constant.{ScriptToken, OP_0, ScriptConstantImpl}
|
||||||
@ -48,12 +49,23 @@ object TestUtil {
|
|||||||
val p2shOutputScriptAsm = List(OP_HASH160, ScriptConstantImpl("eda8ae08b5c9f973f49543e90a7c292367b3337c"), OP_EQUAL)
|
val p2shOutputScriptAsm = List(OP_HASH160, ScriptConstantImpl("eda8ae08b5c9f973f49543e90a7c292367b3337c"), OP_EQUAL)
|
||||||
|
|
||||||
//txid on testnet 44e504f5b7649d215be05ad9f09026dee95201244a3b218013c504a6a49a26ff
|
//txid on testnet 44e504f5b7649d215be05ad9f09026dee95201244a3b218013c504a6a49a26ff
|
||||||
|
//this tx has multiple inputs and outputs
|
||||||
val rawTransaction = "01000000" +
|
val rawTransaction = "01000000" +
|
||||||
"02df80e3e6eba7dcd4650281d3c13f140dafbb823a7227a78eb6ee9f6cedd040011b0000006a473044022040f91c48f4011bf2e2edb6621bfa8fb802241de939cb86f1872c99c580ef0fe402204fc27388bc525e1b655b5f5b35f9d601d28602432dd5672f29e0a47f5b8bbb26012102c114f376c98d12a0540c3a81ab99bb1c5234245c05e8239d09f48229f9ebf011ffffffff" +
|
"02df80e3e6eba7dcd4650281d3c13f140dafbb823a7227a78eb6ee9f6cedd040011b0000006a473044022040f91c48f4011bf2e2edb6621bfa8fb802241de939cb86f1872c99c580ef0fe402204fc27388bc525e1b655b5f5b35f9d601d28602432dd5672f29e0a47f5b8bbb26012102c114f376c98d12a0540c3a81ab99bb1c5234245c05e8239d09f48229f9ebf011ffffffff" +
|
||||||
"df80e3e6eba7dcd4650281d3c13f140dafbb823a7227a78eb6ee9f6cedd04001340000006b483045022100cf317c320d078c5b884c44e7488825dab5bcdf3f88c66314ac925770cd8773a7022033fde60d33cc2842ea73fce5d9cf4f8da6fadf414a75b7085efdcd300407f438012102605c23537b27b80157c770cd23e066cd11db3800d3066a38b9b592fc08ae9c70ffffffff" +
|
"df80e3e6eba7dcd4650281d3c13f140dafbb823a7227a78eb6ee9f6cedd04001340000006b483045022100cf317c320d078c5b884c44e7488825dab5bcdf3f88c66314ac925770cd8773a7022033fde60d33cc2842ea73fce5d9cf4f8da6fadf414a75b7085efdcd300407f438012102605c23537b27b80157c770cd23e066cd11db3800d3066a38b9b592fc08ae9c70ffffffff" +
|
||||||
"02c02b00000000000017a914b0b06365c482eb4eabe6e0630029fb8328ea098487e81c0000000000001976a914938da2b50fd6d8acdfa20e30df0e7d8092f0bc7588ac00000000"
|
"02c02b00000000000017a914b0b06365c482eb4eabe6e0630029fb8328ea098487e81c0000000000001976a914938da2b50fd6d8acdfa20e30df0e7d8092f0bc7588ac00000000"
|
||||||
|
val transaction = RawTransactionParser.read(rawTransaction)
|
||||||
|
|
||||||
|
//simple raw transaction with only one input and two outputs
|
||||||
|
//txid 92efdd5abb43efd4fe4f89bd080bcddd287a630e8cb6920388dd7880acf4c964
|
||||||
|
val simpleRawTransaction = "0100000001ccf318f0cbac588a680bbad075aebdda1f211c94ba28125b0f627f9248310db3000000006b4830450221008337ce3ce0c6ac0ab72509f889c1d52701817a2362d6357457b63e3bdedc0c0602202908963b9cf1a095ab3b34b95ce2bc0d67fb0f19be1cc5f7b3de0b3a325629bf01210241d746ca08da0a668735c3e01c1fa02045f2f399c5937079b6434b5a31dfe353ffffffff0210335d05000000001976a914b1d7591b69e9def0feb13254bace942923c7922d88ac48030000000000001976a9145e690c865c2f6f7a9710a474154ab1423abb5b9288ac00000000"
|
||||||
|
val simpleTransaction = RawTransactionParser.read(simpleRawTransaction)
|
||||||
|
|
||||||
|
//parent to the 'simpleRawTransaction' val in this file. It is referenced by the input,
|
||||||
|
//which needs to have access to this tx to view the scriptPubKey
|
||||||
|
//txid b30d3148927f620f5b1228ba941c211fdabdae75d0ba0b688a58accbf018f3cc
|
||||||
|
val parentSimpleRawTransaction = "0100000001cda741646fada7272b900719f7ac9d68d633d0e8aa9501eed3c90afbd323bd65010000006a4730440220048e15422cf62349dc586ffb8c749d40280781edd5064ff27a5910ff5cf225a802206a82685dbc2cf195d158c29309939d5a3cd41a889db6f766f3809fff35722305012103dcfc9882c1b3ae4e03fb6cac08bdb39e284e81d70c7aa8b27612457b2774509bffffffff026c405d05000000001976a91431a420903c05a0a7de2de40c9f02ebedbacdc17288ac809698000000000017a914af575bd77c5ce7eba3bd9ce6f89774713ae62c798700000000"
|
||||||
|
val parentSimpleTransaction = RawTransactionParser.read(parentSimpleRawTransaction)
|
||||||
//scriptPubKey taken from https://bitcoin.org/en/developer-reference#raw-transaction-format
|
//scriptPubKey taken from https://bitcoin.org/en/developer-reference#raw-transaction-format
|
||||||
val rawScriptPubKey = "1976a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac"
|
val rawScriptPubKey = "1976a914cbc20a7664f2f69e5355aa427045bc15e7c6c77288ac"
|
||||||
val scriptPubKey = RawScriptPubKeyParser.read(rawScriptPubKey)
|
val scriptPubKey = RawScriptPubKeyParser.read(rawScriptPubKey)
|
||||||
|
Loading…
Reference in New Issue
Block a user