From b234fcb6c6281cd81578f6fabd85aa5b74cdfc11 Mon Sep 17 00:00:00 2001 From: campurro Date: Sat, 16 Mar 2019 13:32:11 +0100 Subject: [PATCH] Initial support for Moneta Verde Multi-PoW merged mining --- README.md | 4 ++-- src/cryptonote_config.h | 28 ++++++++++++++++++++++++++++ src/main.cc | 32 +++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e5400fe..d75373e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -Node-CryptoForkNote-Util -==================== +Node-CryptoForkNote-Util with Merged Mining support +=================================================== Dependencies ------------ diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h index 9dccf4a..1e5f3de 100644 --- a/src/cryptonote_config.h +++ b/src/cryptonote_config.h @@ -9,4 +9,32 @@ enum BLOB_TYPE { BLOB_TYPE_CRYPTONOTE2 = 3, // Masari BLOB_TYPE_CRYPTONOTE_RYO = 4, // Ryo BLOB_TYPE_CRYPTONOTE_LOKI = 5, // Loki +}; + +enum POW_TYPE { + POW_TYPE_NOT_SET = -1, + POW_TYPE_CN_ORIGINAL = 0, + POW_TYPE_CN_V1 = 1, // Monero v7 + POW_TYPE_CN_XTL = 3, + POW_TYPE_CN_MSR = 4, + POW_TYPE_CN_XAO = 6, + POW_TYPE_CN_RTO = 7, + POW_TYPE_CN_V2 = 8, // Monero v8 + POW_TYPE_CN_HALF = 9, + POW_TYPE_CN_GPU = 11, + POW_TYPE_CN_WOW = 12, + POW_TYPE_CN_V4 = 13, // Monero cn-R + POW_TYPE_CN_RWZ = 14, + POW_TYPE_CN_ZLS = 15, + POW_TYPE_CN_DOUBLE = 16, + + POW_TYPE_CNLITE_ORIGINAL = 20, + POW_TYPE_CNLITE_V1 = 21, + + POW_TYPE_CNHEAVY_ORIGINAL = 30, + POW_TYPE_CNHEAVY_XHV = 31, + POW_TYPE_CNHEAVY_TUBE = 32, + + POW_TYPE_CNPICO_TRTL = 40 + }; \ No newline at end of file diff --git a/src/main.cc b/src/main.cc index e924f6a..a438f74 100644 --- a/src/main.cc +++ b/src/main.cc @@ -134,7 +134,9 @@ NAN_METHOD(get_merge_mining_tag_reserved_size) { info.GetReturnValue().Set(returnValue); } - +/* + * var blob = convert_blob (parentBlockBuffer, cnBlobType, [childBlockBuffer], [PoW]) + */ NAN_METHOD(convert_blob) { if (info.Length() < 1) return THROW_ERROR_EXCEPTION("You must provide one argument."); @@ -150,6 +152,12 @@ NAN_METHOD(convert_blob) { blob_type = static_cast(Nan::To(info[1]).FromMaybe(0)); } + enum POW_TYPE pow_type = POW_TYPE_NOT_SET; + if (info.Length() >= 4) { + if (!info[1]->IsNumber()) return THROW_ERROR_EXCEPTION("Argument 4 should be a number"); + pow_type = static_cast(Nan::To(info[3]).FromMaybe(0)); + } + //convert block b = AUTO_VAL_INIT(b); b.set_blob_type(blob_type); @@ -166,6 +174,7 @@ NAN_METHOD(convert_blob) { if (blob_type == BLOB_TYPE_FORKNOTE2) { block parent_block; + if (POW_TYPE_NOT_SET != pow_type) b.minor_version = pow_type; if (!construct_parent_block(b, parent_block)) return THROW_ERROR_EXCEPTION("Failed to construct parent block"); if (!get_block_hashing_blob(parent_block, output)) return THROW_ERROR_EXCEPTION("Failed to create mining block"); } else { @@ -208,6 +217,9 @@ NAN_METHOD(get_block_id) { info.GetReturnValue().Set(returnValue); } +/* + * var shareBuffer = construct_block_blob(parentBlockTemplateBuffer, nonceBuffer, cnBlobType, [childBlockTemplateBuffer], [PoW]); + */ NAN_METHOD(construct_block_blob) { if (info.Length() < 2) return THROW_ERROR_EXCEPTION("You must provide two arguments."); @@ -227,6 +239,12 @@ NAN_METHOD(construct_block_blob) { blob_type = static_cast(Nan::To(info[2]).FromMaybe(0)); } + enum POW_TYPE pow_type = POW_TYPE_NOT_SET; + if (info.Length() >= 5) { + if (!info[1]->IsNumber()) return THROW_ERROR_EXCEPTION("Argument 5 should be a number"); + pow_type = static_cast(Nan::To(info[4]).FromMaybe(0)); + } + block b = AUTO_VAL_INIT(b); b.set_blob_type(blob_type); if (!parse_and_validate_block_from_blob(block_template_blob, b)) return THROW_ERROR_EXCEPTION("Failed to parse block"); @@ -244,6 +262,7 @@ NAN_METHOD(construct_block_blob) { if (blob_type == BLOB_TYPE_FORKNOTE2) { block parent_block; b.parent_block.nonce = nonce; + if (POW_TYPE_NOT_SET != pow_type) b.minor_version = pow_type; if (!construct_parent_block(b, parent_block)) return THROW_ERROR_EXCEPTION("Failed to construct parent block"); if (!mergeBlocks(parent_block, b, std::vector())) return THROW_ERROR_EXCEPTION("Failed to postprocess mining block"); } else if (BLOB_TYPE_CRYPTONOTE == blob_type && info.Length() > 3) { // MM @@ -321,7 +340,7 @@ NAN_METHOD(address_decode_integrated) { /** - * var mmShareBuffer = merge_blocks(shareBuffer, childBlockTemplate); + * var mmShareBuffer = merge_blocks(shareBuffer, childBlockTemplate, [PoW] ); */ NAN_METHOD(merge_blocks) { @@ -337,6 +356,12 @@ NAN_METHOD(merge_blocks) { if (!Buffer::HasInstance(child_block_template_buf)) return THROW_ERROR_EXCEPTION("Second argument should be a buffer object."); + enum POW_TYPE pow_type = POW_TYPE_NOT_SET; + if (info.Length() >= 3) { + if (!info[1]->IsNumber()) return THROW_ERROR_EXCEPTION("Argument 3 should be a number"); + pow_type = static_cast(Nan::To(info[2]).FromMaybe(0)); + } + blobdata block_template_blob = std::string(Buffer::Data(block_template_buf), Buffer::Length(block_template_buf)); blobdata child_block_template_blob = std::string(Buffer::Data(child_block_template_buf), Buffer::Length(child_block_template_buf)); blobdata output = ""; @@ -351,7 +376,8 @@ NAN_METHOD(merge_blocks) { if (!mergeBlocks(b, b2, std::vector())) return THROW_ERROR_EXCEPTION("mergeBlocks(b,b2): Failed to postprocess mining block"); - + if (POW_TYPE_NOT_SET != pow_type) b2.minor_version = pow_type; + if (!block_to_blob(b2, output)) { return THROW_ERROR_EXCEPTION("Failed to convert block to blob (merge_blocks)"); }