Update and simplify join blend method

This commit is contained in:
Daniel 2026-07-09 12:21:50 +02:00
parent 88d57c92b5
commit 7d119e2d14
5 changed files with 19 additions and 58 deletions

View File

@ -939,23 +939,15 @@ StdLogosResult LogosBlockchainModule::wallet_get_claimable_vouchers() const {
// Blend
StdLogosResult LogosBlockchainModule::blend_join_as_core_node(
const std::string& provider_id_hex,
const std::string& zk_id_hex,
const std::string& locked_note_id_hex,
const std::vector<std::string>& locators
const std::string& locator,
const std::string& locked_note_id_hex
) const {
if (!node) {
return result::err("The node is not running.");
}
const std::vector<uint8_t> provider_id_bytes = parse_address_hex(provider_id_hex);
if (provider_id_bytes.empty() || static_cast<int>(provider_id_bytes.size()) != ADDRESS_BYTES) {
return result::err("Invalid provider_id_hex (64 hex characters required).");
}
const std::vector<uint8_t> zk_id_bytes = parse_address_hex(zk_id_hex);
if (zk_id_bytes.empty() || static_cast<int>(zk_id_bytes.size()) != ADDRESS_BYTES) {
return result::err("Invalid zk_id_hex (64 hex characters required).");
if (locator.empty()) {
return result::err("Invalid locator (must not be empty).");
}
const std::vector<uint8_t> locked_note_id_bytes = parse_address_hex(locked_note_id_hex);
@ -963,20 +955,10 @@ StdLogosResult LogosBlockchainModule::blend_join_as_core_node(
return result::err("Invalid locked_note_id_hex (64 hex characters required).");
}
// locators_ptrs holds raw pointers into the std::strings (valid as long as `locators` lives).
std::vector<const char*> locators_ptrs;
locators_ptrs.reserve(locators.size());
for (const std::string& locator : locators) {
locators_ptrs.push_back(locator.c_str());
}
auto [value, error] = ::blend_join_as_core_node(
node,
provider_id_bytes.data(),
zk_id_bytes.data(),
locked_note_id_bytes.data(),
locators_ptrs.data(),
locators_ptrs.size()
locator.c_str(),
locked_note_id_bytes.data()
);
if (!is_ok(&error)) {
return result::err(operation_status::take_message(error));

View File

@ -130,10 +130,8 @@ public:
// Blend
[[nodiscard]] StdLogosResult blend_join_as_core_node(
const std::string& provider_id_hex,
const std::string& zk_id_hex,
const std::string& locked_note_id_hex,
const std::vector<std::string>& locators
const std::string& locator,
const std::string& locked_note_id_hex
) const;
// Explorer

View File

@ -272,11 +272,8 @@ FfiChannelDepositResult channel_deposit_with_notes(
BlendHashResult blend_join_as_core_node(
LogosBlockchainNode* node,
const uint8_t* provider_id,
const uint8_t* zk_id,
const uint8_t* locked_note_id,
const char** locators,
size_t locators_count)
const char* locator,
const uint8_t* locked_note_id)
{
LOGOS_CMOCK_RECORD("blend_join_as_core_node");
BlendHashResult result;

View File

@ -221,11 +221,8 @@ OperationStatus free_claimable_vouchers(ClaimableVouchers vouchers);
// Blend
BlendHashResult blend_join_as_core_node(
LogosBlockchainNode* node,
const uint8_t* provider_id,
const uint8_t* zk_id,
const uint8_t* locked_note_id,
const char** locators,
size_t locators_count);
const char* locator,
const uint8_t* locked_note_id);
// Explorer
StringResult get_block(LogosBlockchainNode* node, const HeaderId* header_id);

View File

@ -292,7 +292,7 @@ LOGOS_TEST(wallet_get_known_addresses_without_node_returns_error) {
LOGOS_TEST(blend_join_as_core_node_without_node_returns_error) {
auto t = LogosTestContext("blockchain_module");
LogosBlockchainModule module;
StdLogosResult result = module.blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, {"locator1"});
StdLogosResult result = module.blend_join_as_core_node("locator1", VALID_HEX);
LOGOS_ASSERT_FALSE(result.success);
LOGOS_ASSERT_TRUE(contains(result.error, "not running"));
}
@ -475,27 +475,15 @@ LOGOS_TEST(wallet_transfer_funds_rejects_invalid_optional_tip) {
// blend_join_as_core_node validation
LOGOS_TEST(blend_join_rejects_invalid_provider_id) {
LOGOS_TEST(blend_join_rejects_empty_locator) {
auto t = LogosTestContext("blockchain_module");
TempDir tmpDir;
auto* module = createStartedModule(t, tmpDir);
LOGOS_ASSERT_TRUE(module != nullptr);
StdLogosResult result = module->blend_join_as_core_node("short", VALID_HEX, VALID_HEX, {});
StdLogosResult result = module->blend_join_as_core_node("", VALID_HEX);
LOGOS_ASSERT_FALSE(result.success);
LOGOS_ASSERT_TRUE(contains(result.error, "provider_id"));
delete module;
}
LOGOS_TEST(blend_join_rejects_invalid_zk_id) {
auto t = LogosTestContext("blockchain_module");
TempDir tmpDir;
auto* module = createStartedModule(t, tmpDir);
LOGOS_ASSERT_TRUE(module != nullptr);
StdLogosResult result = module->blend_join_as_core_node(VALID_HEX, "short", VALID_HEX, {});
LOGOS_ASSERT_FALSE(result.success);
LOGOS_ASSERT_TRUE(contains(result.error, "zk_id"));
LOGOS_ASSERT_TRUE(contains(result.error, "locator"));
delete module;
}
@ -505,7 +493,7 @@ LOGOS_TEST(blend_join_rejects_invalid_locked_note_id) {
auto* module = createStartedModule(t, tmpDir);
LOGOS_ASSERT_TRUE(module != nullptr);
StdLogosResult result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, "short", {});
StdLogosResult result = module->blend_join_as_core_node("locator1", "short");
LOGOS_ASSERT_FALSE(result.success);
LOGOS_ASSERT_TRUE(contains(result.error, "locked_note_id"));
delete module;
@ -1035,8 +1023,7 @@ LOGOS_TEST(blend_join_as_core_node_returns_declaration_id) {
t.mockCFunction("blend_join_as_core_node_error").returns(0);
std::vector<std::string> locators = {"locator1", "locator2"};
StdLogosResult result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, locators);
StdLogosResult result = module->blend_join_as_core_node("locator1", VALID_HEX);
LOGOS_ASSERT_TRUE(result.success);
// Mock fills hash with 0xCD -> hex "cdcd...cd" (64 chars)
std::string declarationId = result.value.get<std::string>();
@ -1054,7 +1041,7 @@ LOGOS_TEST(blend_join_as_core_node_returns_error_on_ffi_failure) {
t.mockCFunction("blend_join_as_core_node_error").returns(1);
StdLogosResult result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, {});
StdLogosResult result = module->blend_join_as_core_node("locator1", VALID_HEX);
LOGOS_ASSERT_FALSE(result.success);
delete module;
}