Some optimizations
This commit is contained in:
parent
56ff616e63
commit
ada171e531
@ -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();
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user