[tor-dev] moria1 had 756 HSDir flags in its vote but, the consensus had 2583

Roger Dingledine arma at mit.edu
Thu Feb 15 17:47:47 UTC 2018


On Mon, Feb 12, 2018 at 03:09:00PM +0000, nusenu wrote:
> >>> NOTICE: moria1 had 756 HSDir flags in its vote but
> >>> the consensus had 2583
>
> I tried to find it on trac, I guess this is:
> https://trac.torproject.org/projects/tor/ticket/19162

Yes, correct. moria1 runs all sorts of experimental patches.

One of them is choosing the HSDir flag for relays based on:

+    hsdir_tk = find_nth_long(tks, n_active, n_active*3/4);
+    hsdir_bandwidth = find_nth_uint32(bandwidths_kb, n_active, n_active/4);

That is, the relay needs to be in the top quarter of the relays
by time-known, and in the top three-quarters of the relays by
bandwidth weights (as decided by moria1's bwauth).

I think the time-known idea is a potentially really smart one, since if
we do it right we force attacking hsdir relays to be in the network for
a long time before they are allowed to become hsdirs.

--Roger

-------------- next part --------------
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index d3bae24..9c4d91a 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1336,6 +1336,11 @@ static double guard_wfu = 0.0;
 /** Don't call a router a guard unless we've known about it for at least this
  * many seconds. */
 static long guard_tk = 0;
+/** Don't call a router an HSDir unless we've known about it for at least this
+ * many seconds. */
+static long hsdir_tk = 0;
+/** Don't call a router an HSDir unless it has at least this weight. */
+static long hsdir_bandwidth = 0;
 /** Any router with a bandwidth at least this high is "Fast" */
 static uint32_t fast_bandwidth_kb = 0;
 /** If exits can be guards, then all guards must have a bandwidth this
@@ -1409,6 +1414,8 @@ dirserv_thinks_router_is_hs_dir(const routerinfo_t *router,
 {
 
   long uptime;
+  long tk = rep_hist_get_weighted_time_known(node->identity, now);
+  uint32_t bw_kb = dirserv_get_credible_bandwidth_kb(router);
 
   /* If we haven't been running for at least
    * get_options()->MinUptimeHidServDirectoryV2 seconds, we can't
@@ -1427,6 +1434,8 @@ dirserv_thinks_router_is_hs_dir(const routerinfo_t *router,
   return (router->wants_to_be_hs_dir &&
           router->supports_tunnelled_dir_requests &&
           node->is_stable && node->is_fast &&
+          tk >= hsdir_tk &&
+          bw_kb >= hsdir_bandwidth &&
           uptime >= get_options()->MinUptimeHidServDirectoryV2 &&
           router_is_active(router, node, now));
 }
@@ -1463,9 +1472,10 @@ router_counts_toward_thresholds(const node_t *node, time_t now,
 
 /** Look through the routerlist, the Mean Time Between Failure history, and
  * the Weighted Fractional Uptime history, and use them to set thresholds for
- * the Stable, Fast, and Guard flags.  Update the fields stable_uptime,
- * stable_mtbf, enough_mtbf_info, guard_wfu, guard_tk, fast_bandwidth,
- * guard_bandwidth_including_exits, and guard_bandwidth_excluding_exits.
+ * the Stable, Fast, Guard, and HSDir flags.  Update the fields stable_uptime,
+ * stable_mtbf, enough_mtbf_info, guard_wfu, guard_tk, hsdir_tk,
+ * hsdir_bandwidth, fast_bandwidth, guard_bandwidth_including_exits,
+ * and guard_bandwidth_excluding_exits.
  *
  * Also, set the is_exit flag of each router appropriately. */
 static void
@@ -1492,6 +1502,8 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
   guard_bandwidth_excluding_exits_kb = 0;
   guard_tk = 0;
   guard_wfu = 0;
+  hsdir_tk = 0;
+  hsdir_bandwidth = 0;
 
   nodelist_assert_ok();
   nodelist = nodelist_get_list();
@@ -1560,6 +1572,16 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
     guard_bandwidth_including_exits_kb =
       third_quartile_uint32(bandwidths_kb, n_active);
     guard_tk = find_nth_long(tks, n_active, n_active/8);
+    hsdir_tk = find_nth_long(tks, n_active, n_active*3/4);
+//    hsdir_bandwidth = median_uint32(bandwidths_kb, n_active);
+    hsdir_bandwidth = find_nth_uint32(bandwidths_kb, n_active, n_active/4);
+  }
+
+  {
+    int i;
+    for (i = 0; i < n_active; i++) {
+      log_info(LD_GENERAL, "TK %d/%d: %ld", i, n_active, tks[i]);
+    }
   }
 
   if (guard_tk > TIME_KNOWN_TO_GUARANTEE_FAMILIAR)
@@ -1621,11 +1643,13 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
   }
 
   log_info(LD_DIRSERV,
-      "Cutoffs: For Stable, %lu sec uptime, %lu sec MTBF. "
+      "Cutoffs (%d active): For Stable, %lu sec uptime, %lu sec MTBF. "
       "For Fast: %lu kilobytes/sec. "
       "For Guard: WFU %.03f%%, time-known %lu sec, "
       "and bandwidth %lu or %lu kilobytes/sec. "
+      "For HSDir: time-known %lu sec, bandwidth %lu kilobytes/sec. "
       "We%s have enough stability data.",
+      n_active,
       (unsigned long)stable_uptime,
       (unsigned long)stable_mtbf,
       (unsigned long)fast_bandwidth_kb,
@@ -1633,6 +1657,8 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil)
       (unsigned long)guard_tk,
       (unsigned long)guard_bandwidth_including_exits_kb,
       (unsigned long)guard_bandwidth_excluding_exits_kb,
+      (unsigned long)hsdir_tk,
+      (unsigned long)hsdir_bandwidth,
       enough_mtbf_info ? "" : " don't");
 
   tor_free(uptimes);


More information about the tor-dev mailing list