From 395c7d94cf27870766ea68f870ad593a08b59cb1 Mon Sep 17 00:00:00 2001 From: John Jones Date: Thu, 14 Sep 2017 14:58:53 -0500 Subject: [PATCH] More implementation of ipns --- exchange/bitswap/engine.c | 2 +- namesys/publisher.c | 109 +++++++++++++++++++++++++++++++++++- namesys/routing.c | 1 - test/routing/test_routing.h | 14 ++--- 4 files changed, 115 insertions(+), 11 deletions(-) diff --git a/exchange/bitswap/engine.c b/exchange/bitswap/engine.c index f523153..3d56390 100644 --- a/exchange/bitswap/engine.c +++ b/exchange/bitswap/engine.c @@ -85,7 +85,7 @@ void* ipfs_bitswap_engine_peer_request_processor_start(void* ctx) { if (current_peer_entry->sessionContext == NULL || current_peer_entry->sessionContext->default_stream == NULL) { current_peer_entry->connection_type = CONNECTION_TYPE_NOT_CONNECTED; } else { - libp2p_logger_debug("bitswap_engine", "We're connected to %s. Lets see if there is a message waiting for us.\n", libp2p_peer_id_to_string(current_peer_entry)); + //libp2p_logger_debug("bitswap_engine", "We're connected to %s. Lets see if there is a message waiting for us.\n", libp2p_peer_id_to_string(current_peer_entry)); int retVal = current_peer_entry->sessionContext->default_stream->peek(current_peer_entry->sessionContext); if (retVal < 0) { libp2p_logger_debug("bitswap_engine", "We thought we were connected, but Peek reported an error.\n"); diff --git a/namesys/publisher.c b/namesys/publisher.c index fb96d57..0465fdf 100644 --- a/namesys/publisher.c +++ b/namesys/publisher.c @@ -5,6 +5,12 @@ #include "ipfs/namesys/pb.h" #include "ipfs/namesys/publisher.h" +/** + * Convert an ipns_entry into a char array + * + * @param entry the ipns_entry + * @returns a char array that contains the data from the ipns_entry + */ char* ipns_entry_data_for_sig (struct ipns_entry *entry) { char *ret; @@ -52,6 +58,14 @@ int ipns_selector_func (int *idx, struct ipns_entry ***recs, char *k, char **val return ipns_select_record(idx, *recs, vals); } +/*** + * selects an ipns_entry record from a list + * + * @param idx the index of the found record + * @param recs the records + * @param vals the search criteria? + * @returns 0 on success, otherwise error code + */ int ipns_select_record (int *idx, struct ipns_entry **recs, char **vals) { int err, i, best_i = -1, best_seq = 0; @@ -94,8 +108,14 @@ int ipns_select_record (int *idx, struct ipns_entry **recs, char **vals) return 0; } -// ipns_validate_ipns_record implements ValidatorFunc and verifies that the -// given 'val' is an IpnsEntry and that that entry is valid. +/**** + * implements ValidatorFunc and verifies that the + * given 'val' is an IpnsEntry and that that entry is valid. + * + * @param k + * @param val + * @returns 0 on success, otherwise an error code + */ int ipns_validate_ipns_record (char *k, char *val) { int err = 0; @@ -124,3 +144,88 @@ int ipns_validate_ipns_record (char *k, char *val) } return 0; } + +/** + * Helper to copy values from one to another, allocating memory + * + * @param from the value to copy + * @param from_size the size of from + * @param to where to allocate memory and copy + * @param to_size where to put the value of from_size in the new structure + * @returns true(1) on success, false(0) otherwise + */ +int ipfs_namesys_copy_bytes(uint8_t* from, int from_size, uint8_t** to, int* to_size) { + *to = (uint8_t*) malloc(from_size); + if (*to == NULL) { + return 0; + } + memcpy(*to, from, from_size); + *to_size = from_size; + return 1; +} + +/** + * Store the hash locally, and notify the network + * + * @param local_node the context + * @param cid the hash + * @returns true(1) on success, false(0) otherwise + */ +int ipfs_namesys_publish(struct IpfsNode* local_node, struct Cid* cid) { + // store locally + struct DatastoreRecord* record = libp2p_datastore_record_new(); + if (record == NULL) + return 0; + + // key + if (!ipfs_namesys_copy_bytes(cid->hash, cid->hash_length, &record->key, &record->key_size)) { + libp2p_datastore_record_free(record); + return 0; + } + // value + if (!ipfs_namesys_copy_bytes(local_node->identity->peer->id, local_node->identity->peer->id_size, &record->value, &record->value_size)) { + libp2p_datastore_record_free(record); + return 0; + } + + if (!local_node->repo->config->datastore->datastore_put(record, local_node->repo->config->datastore)) { + libp2p_datastore_record_free(record); + return 0; + } + libp2p_datastore_record_free(record); + + // propagate to network + // build the KademliaMessage + struct KademliaMessage* msg = libp2p_message_new(); + if (msg == NULL) { + libp2p_message_free(msg); + return 0; + } + msg->provider_peer_head = libp2p_utils_vector_new(1); + libp2p_utils_vector_add(msg->provider_peer_head, local_node->identity->peer); + // msg->Libp2pRecord + msg->record = libp2p_record_new(); + if (msg->record == NULL) { + libp2p_message_free(msg); + return 0; + } + // KademliaMessage->Libp2pRecord->author + if (!ipfs_namesys_copy_bytes(local_node->identity->peer->id, local_node->identity->peer->id_size, &msg->record->author, &msg->record->author_size)) { + libp2p_message_free(msg); + return 0; + } + // KademliaMessage->Libp2pRecord->key + if (!ipfs_namesys_copy_bytes(cid->hash, cid->hash_length, &msg->record->key, &msg->record->key_size)) { + libp2p_message_free(msg); + return 0; + } + // KademliaMessage->Libp2pRecord->value + if (!ipfs_namesys_copy_bytes(local_node->identity->peer->id, local_node->identity->peer->id_size, &msg->record->value, &msg->record->value_size)) { + libp2p_message_free(msg); + return 0; + } + + int retVal = libp2p_routing_send_message(local_node->identity->peer, local_node->providerstore, msg); + libp2p_message_free(msg); + return retVal; +} diff --git a/namesys/routing.c b/namesys/routing.c index 562a7a3..ec088ec 100644 --- a/namesys/routing.c +++ b/namesys/routing.c @@ -147,7 +147,6 @@ int ipfs_namesys_hex_string_to_bytes(const unsigned char* hex, unsigned char** b * @param path the path * @param name the name (b58 encoded) * @param depth - * @param depth * @param prefix * @param pb * @returns 0 on success, otherwise error code diff --git a/test/routing/test_routing.h b/test/routing/test_routing.h index 9433d06..083954a 100644 --- a/test/routing/test_routing.h +++ b/test/routing/test_routing.h @@ -38,13 +38,13 @@ int test_routing_put_value() { struct Libp2pVector* ma_vector = NULL; // fire up the "publisher" - drop_and_build_respository(ipfs_path_publisher, 4001, NULL, &peer_id_publisher); + drop_and_build_repository(ipfs_path_publisher, 4001, NULL, &peer_id_publisher); char multiaddress_string[255]; sprintf(multiaddress_string, "/ip4/127.0.0.1/tcp/4001/ipfs/%s", peer_id_publisher); ma_publisher = multiaddress_new_from_string(multiaddress_string); char* args[] = { "ipfs", "--config", ipfs_path_publisher, "add", "-r", "~/site"}; - ipfs_import_files(args, 6); - if (!pthread_create(&thread_publisher, test_routing_daemon_start, (void*)ipfs_path_publisher)) { + ipfs_import_files(6, args); + if (!pthread_create(&thread_publisher, NULL, test_routing_daemon_start, (void*)ipfs_path_publisher)) { goto exit; } publisher_thread_started = 1; @@ -62,7 +62,7 @@ int test_routing_put_value() { // now "publish" to publisher, and verify that "consumer" receives the message char* args2[] = {"ipfs" "--config", ipfs_path_publisher, "name", "publish", "QmZtAEqmnXMZkwVPKdyMGxUoo35cQMzNhmq6CN3DvgRwAD" }; - ipfs_name_publish(args2, 6); + ipfs_name_publish(6, args2); // wait for everything to settle in sleep(3); @@ -70,16 +70,16 @@ int test_routing_put_value() { // see if we have what we should... char* args3[] = {"ipfs", "--config", ipfs_path_consumer, "resolve", peer_id_publisher}; char* results = NULL; - ipfs_resolve(args3, 5, &results); + ipfs_resolve(5, args3, &results); retVal = 1; exit: ipfs_daemon_stop(); if (publisher_thread_started) { - pthread_join(thread_publisher); + pthread_join(thread_publisher, NULL); } if (consumer_thread_started) { - pthread_join(thread_consumer); + pthread_join(thread_consumer, NULL); } multiaddress_free(ma_publisher); return retVal;