diff --git a/src/common.h b/src/common.h index 0fa8944..9655f7b 100644 --- a/src/common.h +++ b/src/common.h @@ -122,7 +122,7 @@ constexpr uint8_t MINER_REWARD_UNLOCK_TIME = 60; constexpr uint8_t NONCE_SIZE = 4; constexpr uint8_t EXTRA_NONCE_SIZE = 4; constexpr uint8_t EXTRA_NONCE_MAX_SIZE = EXTRA_NONCE_SIZE + 10; -constexpr uint8_t TX_VERSION = 4; // Salvium Carrot v1 +constexpr uint8_t TX_VERSION = 60; constexpr uint8_t TXIN_GEN = 0xFF; constexpr uint8_t TXOUT_TO_TAGGED_KEY = 3; constexpr uint8_t TXOUT_TO_CARROT_V1 = 4; diff --git a/src/p2pool.cpp b/src/p2pool.cpp index 8eed988..01b4415 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -1155,6 +1155,14 @@ void p2pool::submit_block() const } else { LOGINFO(0, log::LightGreen() << "submit_block: height = " << height << ", external blob (" << submit_data.blob.size() << " bytes)"); + std::string hex; + hex.reserve(submit_data.blob.size() * 2); + for (size_t i = 0; i < std::min(submit_data.blob.size(), 400); ++i) { + char buf[3]; + snprintf(buf, sizeof(buf), "%02x", submit_data.blob[i]); + hex.append(buf); + } + LOGINFO(0, "BLOB HEX (first 400 bytes): " << hex); is_external = true; } diff --git a/src/pool_block.cpp b/src/pool_block.cpp index 9789922..bf384cc 100644 --- a/src/pool_block.cpp +++ b/src/pool_block.cpp @@ -228,6 +228,31 @@ std::vector PoolBlock::serialize_mainchain_data(size_t* header_size, si *miner_tx_size = data.size() - header_size0; } + // Protocol tx (Salvium Carrot v1+) + if (m_majorVersion >= 10) { + writeVarint(4, data); // version = TRANSACTION_VERSION_CARROT + writeVarint(60, data); // unlock_time = 60 + + // vin (1 txin_gen) + writeVarint(1, data); // vin.size() = 1 + data.push_back(TXIN_GEN); + writeVarint(m_txinGenHeight, data); + + // vout (empty) + writeVarint(0, data); // vout.size() = 0 + + // extra (2 bytes: 0x02 0x00) + writeVarint(2, data); // extra.size() = 2 + data.push_back(0x02); + data.push_back(0x00); + + // type = PROTOCOL + writeVarint(2, data); // transaction_type::PROTOCOL = 2 + + // rct_signatures (null) + data.push_back(0); // RCTTypeNull + } + writeVarint(m_transactions.size() - 1, data); #ifdef WITH_INDEXED_HASHES