bool ICoreStub::getBlockHeight(const Crypto::Hash& blockId, uint32_t& blockHeight) { auto it = blocks.find(blockId); if (it == blocks.end()) { return false; } blockHeight = get_block_height(it->second); return true; }
static float get_position_height(int x, int y) { if (x < 0 || x >= FV_MAP_WIDTH || y < 0 || y >= FV_MAP_HEIGHT) return 0.0f; return get_block_height(fv_map.blocks[y * FV_MAP_WIDTH + x]); }
bool core::handle_incoming_block(const Block& b, block_verification_context& bvc, bool control_miner, bool relay_block) { if (control_miner) { pause_mining(); } m_blockchain_storage.add_new_block(b, bvc); if (control_miner) { update_block_template_and_resume_mining(); } if (relay_block && bvc.m_added_to_main_chain) { std::list<crypto::hash> missed_txs; std::list<Transaction> txs; m_blockchain_storage.get_transactions(b.txHashes, txs, missed_txs); if (!missed_txs.empty() && m_blockchain_storage.get_block_id_by_height(get_block_height(b)) != get_block_hash(b)) { logger(INFO) << "Block added, but it seems that reorganize just happened after that, do not relay this block"; } else { if (!(txs.size() == b.txHashes.size() && missed_txs.empty())) { logger(ERROR, BRIGHT_RED) << "can't find some transactions in found block:" << get_block_hash(b) << " txs.size()=" << txs.size() << ", b.txHashes.size()=" << b.txHashes.size() << ", missed_txs.size()" << missed_txs.size(); return false; } NOTIFY_NEW_BLOCK::request arg; arg.hop = 0; arg.current_blockchain_height = m_blockchain_storage.get_current_blockchain_height(); bool r = block_to_blob(b, arg.b.block); if (!(r)) { logger(ERROR, BRIGHT_RED) << "failed to serialize block"; return false; } for (auto& tx : txs) { arg.b.txs.push_back(t_serializable_object_to_blob(tx)); } m_pprotocol->relay_block(arg); } } return true; }
//----------------------------------------------------------------------------------------------- bool core::handle_incoming_block(const Block& b, block_verification_context& bvc, bool control_miner, bool relay_block) { if (control_miner) { pause_mining(); } m_blockchain_storage.add_new_block(b, bvc); if (control_miner) { update_block_template_and_resume_mining(); } if (relay_block && bvc.m_added_to_main_chain) { std::list<crypto::hash> missed_txs; std::list<Transaction> txs; m_blockchain_storage.get_transactions(b.txHashes, txs, missed_txs); if (!missed_txs.empty() && m_blockchain_storage.get_block_id_by_height(get_block_height(b)) != get_block_hash(b)) { LOG_PRINT_L0("Block added, but it seems that reorganize just happened after that, do not relay this block"); } else { CHECK_AND_ASSERT_MES(txs.size() == b.txHashes.size() && missed_txs.empty(), false, "can't find some transactions in found block:" << get_block_hash(b) << " txs.size()=" << txs.size() << ", b.txHashes.size()=" << b.txHashes.size() << ", missed_txs.size()" << missed_txs.size()); NOTIFY_NEW_BLOCK::request arg = AUTO_VAL_INIT(arg); arg.hop = 0; arg.current_blockchain_height = m_blockchain_storage.get_current_blockchain_height(); bool r = block_to_blob(b, arg.b.block); CHECK_AND_ASSERT_MES(r, false, "failed to serialize block"); for (auto& tx : txs) { arg.b.txs.push_back(t_serializable_object_to_blob(tx)); } cryptonote_connection_context exclude_context = boost::value_initialized<cryptonote_connection_context>(); m_pprotocol->relay_block(arg, exclude_context); } } return true; }
static void generate_square(struct fv_map_painter *painter, struct tile_data *data, int x, int y) { fv_map_block_t block = fv_map.blocks[y * FV_MAP_WIDTH + x]; struct vertex *v; int i; int z, oz; v = reserve_quad(data); z = get_block_height(block); set_tex_coords_for_image(painter, v, FV_MAP_GET_BLOCK_TOP_IMAGE(block), 1.0f); set_normals(v, FV_MAP_PAINTER_NORMAL_UP); for (i = 0; i < 4; i++) v[i].z = z; v->x = x; v->y = y; v++; v->x = x + 1; v->y = y; v++; v->x = x; v->y = y + 1; v++; v->x = x + 1; v->y = y + 1; /* Add the side walls */ if (z > (oz = get_position_height(x, y + 1))) { v = add_horizontal_side(data, y + 1, x + 1, oz, x, z); set_normals(v, FV_MAP_PAINTER_NORMAL_NORTH); set_tex_coords_for_image(painter, v, FV_MAP_GET_BLOCK_NORTH_IMAGE(block), z - oz); } if (z > (oz = get_position_height(x, y - 1))) { v = add_horizontal_side(data, y, x, oz, x + 1, z); set_normals(v, FV_MAP_PAINTER_NORMAL_SOUTH); set_tex_coords_for_image(painter, v, FV_MAP_GET_BLOCK_SOUTH_IMAGE(block), z - oz); } if (z > (oz = get_position_height(x - 1, y))) { v = add_vertical_side(data, x, y + 1, oz, y, z); set_normals(v, FV_MAP_PAINTER_NORMAL_WEST); set_tex_coords_for_image(painter, v, FV_MAP_GET_BLOCK_WEST_IMAGE(block), z - oz); } if (z > (oz = get_position_height(x + 1, y))) { v = add_vertical_side(data, x + 1, y, oz, y + 1, z); set_normals(v, FV_MAP_PAINTER_NORMAL_EAST); set_tex_coords_for_image(painter, v, FV_MAP_GET_BLOCK_EAST_IMAGE(block), z - oz); } }