BtcExplorer/Models/Script.cpp

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");
}
}