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) {
|
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();
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user