diff --git a/CMakeLists.txt b/CMakeLists.txt index 8806d1a..adb419b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.19) project(btcexplorer) set(CMAKE_CXX_STANDARD 20) -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") if(APPLE) diff --git a/Models/Block.cpp b/Models/Block.cpp index 8860089..f7e7e48 100644 --- a/Models/Block.cpp +++ b/Models/Block.cpp @@ -1,5 +1,7 @@ #include "Block.h" #include "VarInt.h" +#include "../hash.h" +#include Block::Block(const std::byte* pBlock, size_t size): _header{} { _size = size; @@ -29,3 +31,7 @@ const std::vector& Block::transactions() const { size_t Block::size() const { return _size; } + +std::string Block::prevHeaderHash() const { + return hash::to_string_inverse(_header.prevBlockHeaderHash); +} diff --git a/Models/Block.h b/Models/Block.h index 721e454..4e507dd 100644 --- a/Models/Block.h +++ b/Models/Block.h @@ -39,6 +39,7 @@ public: [[nodiscard]] uint32_t time() const; [[nodiscard]] const std::vector& transactions() const; [[nodiscard]] size_t size() const; + [[nodiscard]] std::string prevHeaderHash() const; }; #endif //BTCEXPLORER_BLOCK_H diff --git a/Models/Script.cpp b/Models/Script.cpp index 7ee039b..e8cf803 100644 --- a/Models/Script.cpp +++ b/Models/Script.cpp @@ -4,26 +4,35 @@ #include #include -Script::Script(std::span data, bool coinbase): _operations(5) { +Script::Script(std::span data, bool coinbase): _operations(10) { for(auto iter = data.begin(); iter != data.end();) { ScriptOperation operation; operation.opCode = OpCode(*iter++); - //std::cout << "found opcode: " << std::showbase << std::hex << std::setw(4) << (int)operation.opCode << std::dec << std::endl; + + size_t available = data.end() - iter; 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) { + } else if(operation.opCode == OpCode::OP_PUSHDATA1 && available >= 1) { dataSize = *iter++; - } else if(operation.opCode == OpCode::OP_PUSHDATA2) { + } else if(operation.opCode == OpCode::OP_PUSHDATA2 && available >= 2) { dataSize = *((uint16_t*)&iter[0]); iter += 2; - } else if(operation.opCode == OpCode::OP_PUSHDATA4) { + } else if(operation.opCode == OpCode::OP_PUSHDATA4 && available >= 4) { dataSize = *((uint32_t *)&iter[0]); iter += 4; } - operation.input = std::vector(iter, iter + dataSize); - iter += dataSize; + + available = data.end() - iter; + if(dataSize > available) { + dataSize = available; + } + + if(dataSize > 0) { + operation.input = std::vector(iter, iter + dataSize); + iter += dataSize; + } } _operations.emplace_back(operation); } diff --git a/Models/TxOutput.cpp b/Models/TxOutput.cpp index 287a1ac..8924bd5 100644 --- a/Models/TxOutput.cpp +++ b/Models/TxOutput.cpp @@ -9,7 +9,6 @@ TxOutput::TxOutput(const std::byte *data) { VarInt scriptPubKeySize(data); data += scriptPubKeySize.size(); - //std::cout << "=== Creating PubKey script of size: " << scriptPubKeySize.value() << std::endl; _pubKeyScript = std::make_unique