|
|
|
#include "wire.h"
|
|
|
|
#include <assert.h>
|
|
|
|
#include <ccan/crypto/ripemd160/ripemd160.h>
|
|
|
|
#include <ccan/crypto/siphash24/siphash24.h>
|
|
|
|
#include <ccan/endian/endian.h>
|
|
|
|
#include <ccan/mem/mem.h>
|
|
|
|
#include <ccan/tal/tal.h>
|
|
|
|
#include <common/amount.h>
|
|
|
|
#include <common/errcode.h>
|
common/node_id: new type.
Node ids are pubkeys, but we only use them as pubkeys for routing and checking
gossip messages. So we're packing and unpacking them constantly, and wasting
some space and time.
This introduces a new type, explicitly the SEC1 compressed encoding
(33 bytes). We ensure its validity when we load from the db, or get it
from JSON. We still use 'struct pubkey' for peer messages, which checks
validity.
Results from 5 runs, min-max(mean +/- stddev):
store_load_msec,vsz_kb,store_rewrite_sec,listnodes_sec,listchannels_sec,routing_sec,peer_write_all_sec
39475-39572(39518+/-36),2880732,41.150000-41.390000(41.298+/-0.085),2.260000-2.550000(2.336+/-0.11),44.390000-65.150000(58.648+/-7.5),32.740000-33.020000(32.89+/-0.093),44.130000-45.090000(44.566+/-0.32)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
6 years ago
|
|
|
#include <common/node_id.h>
|
|
|
|
#include <common/utils.h>
|
|
|
|
|
|
|
|
void towire(u8 **pptr, const void *data, size_t len)
|
|
|
|
{
|
|
|
|
size_t oldsize = tal_count(*pptr);
|
|
|
|
|
|
|
|
tal_resize(pptr, oldsize + len);
|
|
|
|
memcpy(*pptr + oldsize, memcheck(data, len), len);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_u8(u8 **pptr, u8 v)
|
|
|
|
{
|
|
|
|
towire(pptr, &v, sizeof(v));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_u16(u8 **pptr, u16 v)
|
|
|
|
{
|
|
|
|
be16 l = cpu_to_be16(v);
|
|
|
|
towire(pptr, &l, sizeof(l));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_u32(u8 **pptr, u32 v)
|
|
|
|
{
|
|
|
|
be32 l = cpu_to_be32(v);
|
|
|
|
towire(pptr, &l, sizeof(l));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_u64(u8 **pptr, u64 v)
|
|
|
|
{
|
|
|
|
be64 l = cpu_to_be64(v);
|
|
|
|
towire(pptr, &l, sizeof(l));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void towire_tlv_uint(u8 **pptr, u64 v)
|
|
|
|
{
|
|
|
|
u8 bytes[8];
|
|
|
|
size_t num_zeroes;
|
|
|
|
be64 val;
|
|
|
|
|
|
|
|
val = cpu_to_be64(v);
|
|
|
|
BUILD_ASSERT(sizeof(val) == sizeof(bytes));
|
|
|
|
memcpy(bytes, &val, sizeof(bytes));
|
|
|
|
|
|
|
|
for (num_zeroes = 0; num_zeroes < sizeof(bytes); num_zeroes++)
|
|
|
|
if (bytes[num_zeroes] != 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
towire(pptr, bytes + num_zeroes, sizeof(bytes) - num_zeroes);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_tu16(u8 **pptr, u16 v)
|
|
|
|
{
|
|
|
|
return towire_tlv_uint(pptr, v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_tu32(u8 **pptr, u32 v)
|
|
|
|
{
|
|
|
|
return towire_tlv_uint(pptr, v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_tu64(u8 **pptr, u64 v)
|
|
|
|
{
|
|
|
|
return towire_tlv_uint(pptr, v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_bool(u8 **pptr, bool v)
|
|
|
|
{
|
|
|
|
u8 val = v;
|
|
|
|
towire(pptr, &val, sizeof(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_errcode_t(u8 **pptr, errcode_t v)
|
|
|
|
{
|
|
|
|
towire_u32(pptr, (u32)v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_secp256k1_ecdsa_signature(u8 **pptr,
|
|
|
|
const secp256k1_ecdsa_signature *sig)
|
|
|
|
{
|
|
|
|
u8 compact[64];
|
|
|
|
|
|
|
|
secp256k1_ecdsa_signature_serialize_compact(secp256k1_ctx,
|
|
|
|
compact, sig);
|
|
|
|
towire(pptr, compact, sizeof(compact));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_secp256k1_ecdsa_recoverable_signature(u8 **pptr,
|
|
|
|
const secp256k1_ecdsa_recoverable_signature *rsig)
|
|
|
|
{
|
|
|
|
u8 compact[64];
|
|
|
|
int recid;
|
|
|
|
|
|
|
|
secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_ctx,
|
|
|
|
compact,
|
|
|
|
&recid,
|
|
|
|
rsig);
|
|
|
|
towire(pptr, compact, sizeof(compact));
|
|
|
|
towire_u8(pptr, recid);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_sha256(u8 **pptr, const struct sha256 *sha256)
|
|
|
|
{
|
|
|
|
towire(pptr, sha256, sizeof(*sha256));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_ripemd160(u8 **pptr, const struct ripemd160 *ripemd)
|
|
|
|
{
|
|
|
|
towire(pptr, ripemd, sizeof(*ripemd));
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_u8_array(u8 **pptr, const u8 *arr, size_t num)
|
|
|
|
{
|
|
|
|
towire(pptr, arr, num);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_utf8_array(u8 **pptr, const char *arr, size_t num)
|
|
|
|
{
|
|
|
|
assert(utf8_check(arr, num));
|
|
|
|
towire(pptr, arr, num);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_pad(u8 **pptr, size_t num)
|
|
|
|
{
|
|
|
|
/* Simply insert zeros. */
|
|
|
|
size_t oldsize = tal_count(*pptr);
|
|
|
|
|
|
|
|
tal_resize(pptr, oldsize + num);
|
|
|
|
memset(*pptr + oldsize, 0, num);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_wirestring(u8 **pptr, const char *str)
|
|
|
|
{
|
|
|
|
towire(pptr, str, strlen(str) + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void towire_siphash_seed(u8 **pptr, const struct siphash_seed *seed)
|
|
|
|
{
|
|
|
|
towire(pptr, seed, sizeof(*seed));
|
|
|
|
}
|