|
|
@ -3,9 +3,7 @@ |
|
|
|
#include <bitcoin/block.h> |
|
|
|
#include <bitcoin/script.h> |
|
|
|
#include <ccan/array_size/array_size.h> |
|
|
|
#include <ccan/crypto/siphash24/siphash24.h> |
|
|
|
#include <ccan/endian/endian.h> |
|
|
|
#include <ccan/isaac/isaac64.h> |
|
|
|
#include <ccan/structeq/structeq.h> |
|
|
|
#include <ccan/tal/str/str.h> |
|
|
|
#include <common/features.h> |
|
|
@ -333,28 +331,22 @@ static u64 risk_fee(u64 amount, u32 delay, double riskfactor) |
|
|
|
/* We track totals, rather than costs. That's because the fee depends
|
|
|
|
* on the current amount passing through. */ |
|
|
|
static void bfg_one_edge(struct node *node, size_t edgenum, double riskfactor, |
|
|
|
double fuzz, const struct isaac64_ctx *baserng) |
|
|
|
double fuzz, const struct siphash_seed *base_seed) |
|
|
|
{ |
|
|
|
struct node_connection *c = node->in[edgenum]; |
|
|
|
size_t h; |
|
|
|
struct isaac64_ctx myrng; |
|
|
|
double fee_scale = 1.0; |
|
|
|
u8 *scid; |
|
|
|
|
|
|
|
if (fuzz != 0.0) { |
|
|
|
/* Copy RNG state */ |
|
|
|
myrng = *baserng; |
|
|
|
|
|
|
|
/* Provide the channel short ID, as additional
|
|
|
|
* entropy. */ |
|
|
|
scid = tal_arr(NULL, u8, 0); |
|
|
|
towire_short_channel_id(&scid, &c->short_channel_id); |
|
|
|
isaac64_reseed(&myrng, |
|
|
|
(const unsigned char *) scid, tal_len(scid)); |
|
|
|
tal_free(scid); |
|
|
|
u64 scid = short_channel_id_to_uint(&c->short_channel_id); |
|
|
|
u64 h = siphash24(base_seed, &scid, sizeof(scid)); |
|
|
|
|
|
|
|
/* Scale fees for this channel */ |
|
|
|
fee_scale = 1.0 + fuzz * isaac64_next_signed_double(&myrng); |
|
|
|
/* rand = (h / UINT64_MAX) random number between 0.0 -> 1.0
|
|
|
|
* 2*fuzz*rand random number between 0.0 -> 2*fuzz |
|
|
|
* 2*fuzz*rand - fuzz random number between -fuzz -> +fuzz |
|
|
|
*/ |
|
|
|
fee_scale = 1.0 + (2.0 * fuzz * h / UINT64_MAX) - fuzz; |
|
|
|
} |
|
|
|
|
|
|
|
assert(c->dst == node); |
|
|
@ -402,7 +394,7 @@ static struct node_connection * |
|
|
|
find_route(const tal_t *ctx, struct routing_state *rstate, |
|
|
|
const struct pubkey *from, const struct pubkey *to, u64 msatoshi, |
|
|
|
double riskfactor, |
|
|
|
double fuzz, struct isaac64_ctx *baserng, |
|
|
|
double fuzz, const struct siphash_seed *base_seed, |
|
|
|
u64 *fee, struct node_connection ***route) |
|
|
|
{ |
|
|
|
struct node *n, *src, *dst; |
|
|
@ -464,7 +456,7 @@ find_route(const tal_t *ctx, struct routing_state *rstate, |
|
|
|
continue; |
|
|
|
} |
|
|
|
bfg_one_edge(n, i, riskfactor, |
|
|
|
fuzz, baserng); |
|
|
|
fuzz, base_seed); |
|
|
|
SUPERVERBOSE("...done"); |
|
|
|
} |
|
|
|
} |
|
|
@ -1143,7 +1135,7 @@ struct route_hop *get_route(tal_t *ctx, struct routing_state *rstate, |
|
|
|
const struct pubkey *destination, |
|
|
|
const u32 msatoshi, double riskfactor, |
|
|
|
u32 final_cltv, |
|
|
|
double fuzz, u8 *seed) |
|
|
|
double fuzz, const struct siphash_seed *base_seed) |
|
|
|
{ |
|
|
|
struct node_connection **route; |
|
|
|
u64 total_amount; |
|
|
@ -1152,14 +1144,10 @@ struct route_hop *get_route(tal_t *ctx, struct routing_state *rstate, |
|
|
|
struct route_hop *hops; |
|
|
|
int i; |
|
|
|
struct node_connection *first_conn; |
|
|
|
isaac64_ctx baserng; |
|
|
|
|
|
|
|
/* Load base RNG */ |
|
|
|
isaac64_init(&baserng, (const unsigned char*) seed, tal_count(seed)); |
|
|
|
|
|
|
|
first_conn = find_route(ctx, rstate, source, destination, msatoshi, |
|
|
|
riskfactor / BLOCKS_PER_YEAR / 10000, |
|
|
|
fuzz, &baserng, |
|
|
|
fuzz, base_seed, |
|
|
|
&fee, &route); |
|
|
|
|
|
|
|
if (!first_conn) { |
|
|
|