Some optimizations

This commit is contained in:
Selim Mustafaev 2021-11-25 02:17:20 +03:00
parent 56ff616e63
commit ada171e531
2 changed files with 22 additions and 10 deletions

View File

@ -6,20 +6,19 @@
Script::Script(std::span<uint8_t> data, bool coinbase): _operations(10) {
for(auto iter = data.begin(); iter != data.end();) {
ScriptOperation operation;
operation.opCode = OpCode(*iter++);
auto opCode = OpCode(*iter++);
size_t available = data.end() - iter;
if(operation.opCode <= OpCode::OP_PUSHDATA4) {
if(opCode <= OpCode::OP_PUSHDATA4) {
size_t dataSize = 0;
if(operation.opCode < OpCode::OP_PUSHDATA1) {
dataSize = operation.opCode;
} else if(operation.opCode == OpCode::OP_PUSHDATA1 && available >= 1) {
if(opCode < OpCode::OP_PUSHDATA1) {
dataSize = opCode;
} else if(opCode == OpCode::OP_PUSHDATA1 && available >= 1) {
dataSize = *iter++;
} else if(operation.opCode == OpCode::OP_PUSHDATA2 && available >= 2) {
} else if(opCode == OpCode::OP_PUSHDATA2 && available >= 2) {
dataSize = *((uint16_t*)&iter[0]);
iter += 2;
} else if(operation.opCode == OpCode::OP_PUSHDATA4 && available >= 4) {
} else if(opCode == OpCode::OP_PUSHDATA4 && available >= 4) {
dataSize = *((uint32_t *)&iter[0]);
iter += 4;
}
@ -30,11 +29,12 @@ Script::Script(std::span<uint8_t> data, bool coinbase): _operations(10) {
}
if(dataSize > 0) {
operation.input = std::vector(iter, iter + dataSize);
_operations.emplace_back(opCode, std::vector(iter, iter + dataSize));
iter += dataSize;
continue;
}
}
_operations.emplace_back(operation);
_operations.emplace_back(ScriptOperation(opCode));
}
_type = coinbase ? ScriptType::Coinbase : type();

View File

@ -156,6 +156,18 @@ enum ScriptType {
struct ScriptOperation {
OpCode opCode = OP_INVALIDOPCODE;
std::optional<std::vector<uint8_t>> input = std::nullopt;
ScriptOperation(OpCode opCode, std::vector<uint8_t>&& param) {
this->opCode = opCode;
this->input = param;
}
ScriptOperation(OpCode opCode) {
this->opCode = opCode;
}
ScriptOperation() {
}
};
class Script {