routing: precalc per-block risk factor.
Saves a little by doing up-front calculation. # 1M nodes: $ /gossipd/test/run-bench-find_route 1000000 1 > /tmp/out => 42863 msec Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
2824ff2b30
commit
a7eee0b669
|
@ -267,7 +267,7 @@ static u64 connection_fee(const struct node_connection *c, u64 msatoshi)
|
|||
* in order to prefer shorter routes, all things equal. */
|
||||
static u64 risk_fee(u64 amount, u32 delay, double riskfactor)
|
||||
{
|
||||
return 1 + amount * delay * riskfactor / BLOCKS_PER_YEAR / 10000;
|
||||
return 1 + amount * delay * riskfactor;
|
||||
}
|
||||
|
||||
/* We track totals, rather than costs. That's because the fee depends
|
||||
|
@ -311,6 +311,7 @@ static void bfg_one_edge(struct node *node, size_t edgenum, double riskfactor)
|
|||
}
|
||||
}
|
||||
|
||||
/* riskfactor is already scaled to per-block amount */
|
||||
static struct node_connection *
|
||||
find_route(const tal_t *ctx, struct routing_state *rstate,
|
||||
const struct pubkey *from, const struct pubkey *to, u64 msatoshi,
|
||||
|
@ -803,7 +804,8 @@ struct route_hop *get_route(tal_t *ctx, struct routing_state *rstate,
|
|||
struct node_connection *first_conn;
|
||||
|
||||
first_conn = find_route(ctx, rstate, source, destination, msatoshi,
|
||||
riskfactor, &fee, &route);
|
||||
riskfactor / BLOCKS_PER_YEAR / 10000,
|
||||
&fee, &route);
|
||||
|
||||
if (!first_conn) {
|
||||
return NULL;
|
||||
|
|
|
@ -158,6 +158,7 @@ int main(int argc, char *argv[])
|
|||
size_t num_success;
|
||||
struct pubkey me = nodeid(0);
|
||||
bool perfme = false;
|
||||
const double riskfactor = 0.01 / BLOCKS_PER_YEAR / 10000;
|
||||
|
||||
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
|
||||
| SECP256K1_CONTEXT_SIGN);
|
||||
|
@ -192,7 +193,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
nc = find_route(ctx, rstate, &from, &to,
|
||||
pseudorand(100000),
|
||||
0.01,
|
||||
riskfactor,
|
||||
&fee, &route);
|
||||
num_success += (nc != NULL);
|
||||
tal_free(route);
|
||||
|
|
|
@ -63,6 +63,7 @@ int main(void)
|
|||
struct pubkey a, b, c;
|
||||
u64 fee;
|
||||
struct node_connection **route;
|
||||
const double riskfactor = 1.0 / BLOCKS_PER_YEAR / 10000;
|
||||
|
||||
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
|
||||
| SECP256K1_CONTEXT_SIGN);
|
||||
|
@ -115,7 +116,7 @@ int main(void)
|
|||
nc->flags = 1;
|
||||
nc->last_timestamp = 1504064344;
|
||||
|
||||
nc = find_route(ctx, rstate, &a, &c, 100000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &c, 100000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 1);
|
||||
assert(pubkey_eq(&route[0]->src->id, &b));
|
||||
|
|
|
@ -74,6 +74,7 @@ int main(void)
|
|||
struct privkey tmp;
|
||||
u64 fee;
|
||||
struct node_connection **route;
|
||||
const double riskfactor = 1.0 / BLOCKS_PER_YEAR / 10000;
|
||||
|
||||
secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY
|
||||
| SECP256K1_CONTEXT_SIGN);
|
||||
|
@ -91,7 +92,7 @@ int main(void)
|
|||
/* A<->B */
|
||||
add_connection(rstate, &a, &b, 1, 1, 1);
|
||||
|
||||
nc = find_route(ctx, rstate, &a, &b, 1000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &b, 1000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 0);
|
||||
assert(fee == 0);
|
||||
|
@ -106,7 +107,7 @@ int main(void)
|
|||
status_trace("C = %s", type_to_string(trc, struct pubkey, &c));
|
||||
add_connection(rstate, &b, &c, 1, 1, 1);
|
||||
|
||||
nc = find_route(ctx, rstate, &a, &c, 1000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &c, 1000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 1);
|
||||
assert(fee == 1);
|
||||
|
@ -121,14 +122,14 @@ int main(void)
|
|||
add_connection(rstate, &d, &c, 0, 2, 1);
|
||||
|
||||
/* Will go via D for small amounts. */
|
||||
nc = find_route(ctx, rstate, &a, &c, 1000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &c, 1000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 1);
|
||||
assert(pubkey_eq(&route[0]->src->id, &d));
|
||||
assert(fee == 0);
|
||||
|
||||
/* Will go via B for large amounts. */
|
||||
nc = find_route(ctx, rstate, &a, &c, 3000000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &c, 3000000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 1);
|
||||
assert(pubkey_eq(&route[0]->src->id, &b));
|
||||
|
@ -136,7 +137,7 @@ int main(void)
|
|||
|
||||
/* Make B->C inactive, force it back via D */
|
||||
get_connection(rstate, &b, &c)->active = false;
|
||||
nc = find_route(ctx, rstate, &a, &c, 3000000, 1.0, &fee, &route);
|
||||
nc = find_route(ctx, rstate, &a, &c, 3000000, riskfactor, &fee, &route);
|
||||
assert(nc);
|
||||
assert(tal_count(route) == 1);
|
||||
assert(pubkey_eq(&route[0]->src->id, &d));
|
||||
|
|
Loading…
Reference in New Issue