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

View File

@ -156,6 +156,18 @@ enum ScriptType {
struct ScriptOperation { struct ScriptOperation {
OpCode opCode = OP_INVALIDOPCODE; OpCode opCode = OP_INVALIDOPCODE;
std::optional<std::vector<uint8_t>> input = std::nullopt; 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 { class Script {