53 lines
1.8 KiB
C++
53 lines
1.8 KiB
C++
#include "Script.h"
|
|
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
|
|
Script::Script(std::span<uint8_t> data) {
|
|
for(auto iter = data.begin(); iter != data.end();) {
|
|
ScriptOperation operation;
|
|
uint8_t* ptr = data.data();
|
|
size_t bytes = data.size_bytes();
|
|
operation.opCode = OpCode(*iter++);
|
|
//std::cout << "found opcode: " << std::showbase << std::hex << std::setw(4) << (int)operation.opCode << std::dec << std::endl;
|
|
if(operation.opCode <= OpCode::OP_PUSHDATA4) {
|
|
size_t dataSize = 0;
|
|
if(operation.opCode < OpCode::OP_PUSHDATA1) {
|
|
dataSize = operation.opCode;
|
|
} else if(operation.opCode == OpCode::OP_PUSHDATA1) {
|
|
dataSize = *iter++;
|
|
} else if(operation.opCode == OpCode::OP_PUSHDATA2) {
|
|
dataSize = *((uint16_t*)&iter[0]);
|
|
iter += 2;
|
|
} else if(operation.opCode == OpCode::OP_PUSHDATA4) {
|
|
dataSize = *((uint32_t *) &iter[0]);
|
|
iter += 4;
|
|
}
|
|
operation.input = std::vector(iter, iter + dataSize);
|
|
iter += dataSize;
|
|
}
|
|
_operations.emplace_back(operation);
|
|
}
|
|
|
|
_type = getType();
|
|
}
|
|
|
|
Script::Script() {
|
|
|
|
}
|
|
|
|
ScriptType Script::getType() {
|
|
if(_operations[0].opCode <= OpCode::OP_PUSHDATA4 && _operations[1].opCode == OpCode::OP_CHECKSIG) {
|
|
return ScriptType::P2PK;
|
|
} else if(_operations[0].opCode == OpCode::OP_DUP
|
|
&& _operations[1].opCode == OpCode::OP_HASH160
|
|
&& _operations[2].opCode <= OpCode::OP_PUSHDATA4
|
|
&& _operations[3].opCode == OpCode::OP_EQUALVERIFY
|
|
&& _operations[4].opCode == OpCode::OP_CHECKSIG)
|
|
{
|
|
return ScriptType::P2PKH;
|
|
} else {
|
|
throw std::runtime_error("Unsupported script type");
|
|
}
|
|
}
|