diff --git a/src/pool.c b/src/pool.c index 087c897..7872264 100644 --- a/src/pool.c +++ b/src/pool.c @@ -745,6 +745,8 @@ process_blocks(block_t *blocks, size_t count) memcpy(&nb, sb, sizeof(block_t)); if (memcmp(ib->hash, sb->hash, 64) != 0) { + log_trace("Orphaning because hashes differ: %.64s, %.64s", + ib->hash, sb->hash); log_debug("Orphaned block at height %"PRIu64, ib->height); nb.status |= BLOCK_ORPHANED; MDB_val new_val = {sizeof(block_t), (void*)&nb}; @@ -2403,7 +2405,10 @@ client_on_submit(json_object *message, client_t *client) cb->data = calloc(1, sizeof(block_t)); block_t* b = (block_t*) cb->data; b->height = bt->height; - bin_to_hex(submitted_hash, 32, b->hash, 64); + unsigned char block_hash[32] = {0}; + if (get_block_hash(block, bin_size, block_hash) != 0) + log_error("Error getting block hash!"); + bin_to_hex(block_hash, 32, b->hash, 64); memcpy(b->prev_hash, bt->prev_hash, 64); b->difficulty = bt->difficulty; b->status = BLOCK_LOCKED; diff --git a/src/xmr.cpp b/src/xmr.cpp index fa9afe0..d7ed602 100644 --- a/src/xmr.cpp +++ b/src/xmr.cpp @@ -94,6 +94,16 @@ int parse_address(const char *input, uint64_t *prefix, return rv ? XMR_NO_ERROR : XMR_PARSE_ERROR; } +int get_block_hash(const unsigned char *input, const size_t in_size, + unsigned char *output) +{ + block b = AUTO_VAL_INIT(b); + blobdata bd = std::string((const char*)input, in_size); + bool rv = parse_and_validate_block_from_blob(bd, b, + reinterpret_cast(*output)); + return rv ? XMR_NO_ERROR : XMR_PARSE_ERROR; +} + void get_hash(const unsigned char *input, const size_t in_size, unsigned char *output, int variant, uint64_t height) { diff --git a/src/xmr.h b/src/xmr.h index 6088c66..a1c7614 100644 --- a/src/xmr.h +++ b/src/xmr.h @@ -54,6 +54,8 @@ int get_hashing_blob(const unsigned char *input, const size_t in_size, unsigned char **output, size_t *out_size); int parse_address(const char *input, uint64_t *prefix, unsigned char *pub_spend); +int get_block_hash(const unsigned char *input, const size_t in_size, + unsigned char *output); void get_hash(const unsigned char *input, const size_t in_size, unsigned char *output, int variant, uint64_t height); void get_rx_hash(const unsigned char *input, const size_t in_size, diff --git a/tools/inspect-data b/tools/inspect-data index 2670e91..fa040aa 100755 --- a/tools/inspect-data +++ b/tools/inspect-data @@ -59,6 +59,9 @@ class block_t(Structure): ('reward', c_longlong), ('timestamp', c_longlong)] +def format_block_hash(block_hash): + return '{}...{}'.format(block_hash[:4], block_hash[-4:]) + def format_block_status(status): s = ["LOCKED", "UNLOCKED", "ORPHANED"] return s[status] @@ -109,10 +112,12 @@ def print_mined(path): for key, value in curs: height = c_longlong.from_buffer_copy(key).value b = block_t.from_buffer_copy(value) + bh = format_block_hash(b.hash.decode('utf-8')) dt = format_timestamp(b.timestamp) reward = format_amount(b.reward) status = format_block_status(b.status) - print('{}\t{}\t{}\t{}'.format(height, status, reward, dt)) + print('{}\t{}\t{}\t{}\t{}'.format(height, bh, status, + reward, dt)) env.close() def print_shares(path):