diff --git a/rai/core_test/interface.cpp b/rai/core_test/interface.cpp index f04735fe..cf64a673 100644 --- a/rai/core_test/interface.cpp +++ b/rai/core_test/interface.cpp @@ -5,6 +5,7 @@ #include #include #include +#include TEST (interface, xrb_uint256_to_string) { @@ -98,3 +99,21 @@ TEST (interface, sign_transaction) ASSERT_FALSE (rai::validate_message (pub, send.hash (), send1->signature)); free (transaction); } + +TEST (interface, work_transaction) +{ + rai::raw_key key; + xrb_generate_random (key.data.bytes.data ()); + rai::uint256_union pub; + xrb_key_account (key.data.bytes.data (), pub.bytes.data ()); + rai::send_block send (1, 0, 0, key, pub, 0); + auto transaction (xrb_work_transaction (send.to_json ().c_str ())); + boost::property_tree::ptree block_l; + std::string transaction_l (transaction); + std::stringstream block_stream (transaction_l); + boost::property_tree::read_json (block_stream, block_l); + auto block (rai::deserialize_block_json (block_l)); + ASSERT_NE (nullptr, block); + ASSERT_FALSE (rai::work_validate (*block)); + free (transaction); +} diff --git a/rai/lib/interface.cpp b/rai/lib/interface.cpp index d966e688..cb2c802c 100644 --- a/rai/lib/interface.cpp +++ b/rai/lib/interface.cpp @@ -10,6 +10,7 @@ #include #include +#include #include @@ -96,6 +97,26 @@ char * xrb_sign_transaction (const char * transaction, const xrb_uint256 private return result; } +char * xrb_work_transaction (const char * transaction) +{ + char * result (nullptr); + boost::property_tree::ptree block_l; + std::string transaction_l (transaction); + std::stringstream block_stream (transaction_l); + boost::property_tree::read_json (block_stream, block_l); + auto block (rai::deserialize_block_json (block_l)); + if (block != nullptr) + { + rai::work_pool pool (std::thread::hardware_concurrency ()); + auto work (pool.generate (block->root ())); + block->block_work_set (work); + auto json (block->to_json ()); + result = reinterpret_cast (malloc (json.size () + 1)); + strncpy (result, json.c_str (), json.size () + 1); + } + return result; +} + #include void ed25519_randombytes_unsafe (void * out, size_t outlen) { diff --git a/rai/lib/interface.h b/rai/lib/interface.h index e7aa03ef..283454ce 100644 --- a/rai/lib/interface.h +++ b/rai/lib/interface.h @@ -36,6 +36,8 @@ void xrb_key_account (xrb_uint256 key, xrb_uint256 pub); // Sign 'transaction' using 'private_key' and write to 'signature' char * xrb_sign_transaction (const char * transaction, const xrb_uint256 private_key); +// Generate work for 'transaction' +char * xrb_work_transaction (const char * transaction); #if __cplusplus } // extern "C"