Rusty Russell
8 years ago
committed by
Christian Decker
15 changed files with 10 additions and 4956 deletions
@ -1,65 +0,0 @@ |
|||||
#ifndef LIGHTNING_DAEMON_PACKETS_H |
|
||||
#define LIGHTNING_DAEMON_PACKETS_H |
|
||||
#include "config.h" |
|
||||
#include "lightning.pb-c.h" |
|
||||
|
|
||||
struct commit_info; |
|
||||
struct htlc; |
|
||||
struct peer; |
|
||||
struct preimage; |
|
||||
struct sha256; |
|
||||
|
|
||||
/* Send various kinds of packets */ |
|
||||
void queue_pkt_open(struct peer *peer, bool offer_anchor); |
|
||||
void queue_pkt_anchor(struct peer *peer); |
|
||||
void queue_pkt_open_commit_sig(struct peer *peer); |
|
||||
void queue_pkt_open_complete(struct peer *peer); |
|
||||
void queue_pkt_htlc_add(struct peer *peer, struct htlc *htlc); |
|
||||
void queue_pkt_htlc_fulfill(struct peer *peer, struct htlc *htlc); |
|
||||
void queue_pkt_htlc_fail(struct peer *peer, struct htlc *htlc); |
|
||||
void queue_pkt_feechange(struct peer *peer, u64 feerate); |
|
||||
void queue_pkt_commit(struct peer *peer, const secp256k1_ecdsa_signature *sig); |
|
||||
void queue_pkt_revocation(struct peer *peer, |
|
||||
const struct sha256 *preimage, |
|
||||
const struct sha256 *next_hash); |
|
||||
void queue_pkt_close_shutdown(struct peer *peer); |
|
||||
void queue_pkt_close_signature(struct peer *peer); |
|
||||
void queue_pkt_nested(struct peer *peer, int type, const u8 *nested_pkt); |
|
||||
|
|
||||
Pkt *pkt_err(struct peer *peer, const char *msg, ...); |
|
||||
Pkt *pkt_init(struct peer *peer, u64 ack); |
|
||||
void queue_pkt_err(struct peer *peer, Pkt *err); |
|
||||
Pkt *pkt_err_unexpected(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
/* Process various packets: return an error packet on failure. */ |
|
||||
Pkt *accept_pkt_open(struct peer *peer, const Pkt *pkt, |
|
||||
struct sha256 *revocation_hash, |
|
||||
struct sha256 *next_revocation_hash); |
|
||||
|
|
||||
Pkt *accept_pkt_anchor(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
Pkt *accept_pkt_open_commit_sig(struct peer *peer, const Pkt *pkt, |
|
||||
secp256k1_ecdsa_signature *sig); |
|
||||
|
|
||||
Pkt *accept_pkt_open_complete(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
Pkt *accept_pkt_htlc_add(struct peer *peer, const Pkt *pkt, struct htlc **h); |
|
||||
|
|
||||
Pkt *accept_pkt_htlc_fail(struct peer *peer, const Pkt *pkt, struct htlc **h, |
|
||||
u8 **fail); |
|
||||
|
|
||||
Pkt *accept_pkt_htlc_fulfill(struct peer *peer, const Pkt *pkt, struct htlc **h, |
|
||||
struct preimage *r); |
|
||||
|
|
||||
Pkt *accept_pkt_update_fee(struct peer *peer, const Pkt *pkt, u64 *feerate); |
|
||||
|
|
||||
Pkt *accept_pkt_update_accept(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
Pkt *accept_pkt_commit(struct peer *peer, const Pkt *pkt, |
|
||||
secp256k1_ecdsa_signature *sig); |
|
||||
|
|
||||
Pkt *accept_pkt_revocation(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
Pkt *accept_pkt_close_shutdown(struct peer *peer, const Pkt *pkt); |
|
||||
|
|
||||
#endif /* LIGHTNING_DAEMON_PACKETS_H */ |
|
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -1,262 +0,0 @@ |
|||||
syntax = "proto2"; |
|
||||
|
|
||||
// The outer layer handles encryption, authentication and message |
|
||||
// boundaries. |
|
||||
|
|
||||
// |
|
||||
// Helper Types |
|
||||
// |
|
||||
|
|
||||
// Protobufs don't have fixed-length fields, so these are a hack. |
|
||||
message sha256_hash { |
|
||||
required fixed64 a = 1; |
|
||||
required fixed64 b = 2; |
|
||||
required fixed64 c = 3; |
|
||||
required fixed64 d = 4; |
|
||||
} |
|
||||
|
|
||||
message preimage { |
|
||||
required fixed64 a = 1; |
|
||||
required fixed64 b = 2; |
|
||||
required fixed64 c = 3; |
|
||||
required fixed64 d = 4; |
|
||||
} |
|
||||
|
|
||||
message signature { |
|
||||
required fixed64 r1 = 1; |
|
||||
required fixed64 r2 = 2; |
|
||||
required fixed64 r3 = 3; |
|
||||
required fixed64 r4 = 4; |
|
||||
required fixed64 s1 = 5; |
|
||||
required fixed64 s2 = 6; |
|
||||
required fixed64 s3 = 7; |
|
||||
required fixed64 s4 = 8; |
|
||||
} |
|
||||
|
|
||||
message locktime { |
|
||||
oneof locktime { |
|
||||
uint32 seconds = 1; |
|
||||
uint32 blocks = 2; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Pubkey for commitment transaction input. |
|
||||
message bitcoin_pubkey { |
|
||||
// Must be 33 bytes. |
|
||||
required bytes key = 1; |
|
||||
} |
|
||||
|
|
||||
// How much a node charges (or pays!) for sending. |
|
||||
message funding { |
|
||||
// Base amount (in satoshi). |
|
||||
optional int64 fixed = 1 [ default = 0 ]; |
|
||||
// This is charge per millionth of a satoshi. |
|
||||
optional int32 per_micro_satoshi = 2 [ default = 0 ]; |
|
||||
} |
|
||||
|
|
||||
// |
|
||||
// Packet Types |
|
||||
// |
|
||||
|
|
||||
// Set channel params. |
|
||||
message authenticate { |
|
||||
// Which node this is. |
|
||||
required bitcoin_pubkey node_id = 1; |
|
||||
// Signature of your session key. */ |
|
||||
required signature session_sig = 2; |
|
||||
}; |
|
||||
|
|
||||
// We're authenticated. Here's what we've received already. |
|
||||
message init { |
|
||||
// How many update_commit and update_revocation messages already received |
|
||||
required uint64 ack = 1; |
|
||||
// What features do we support (odd) and require (even) |
|
||||
optional bytes features = 2; |
|
||||
}; |
|
||||
|
|
||||
// Set channel params. |
|
||||
message open_channel { |
|
||||
// Relative locktime for outputs going to us. |
|
||||
required locktime delay = 1; |
|
||||
// Hash for revoking first commitment transaction. |
|
||||
required sha256_hash revocation_hash = 2; |
|
||||
// Hash for revoking second commitment transaction. |
|
||||
required sha256_hash next_revocation_hash = 8; |
|
||||
// Pubkey for anchor to pay into commitment tx. |
|
||||
required bitcoin_pubkey commit_key = 3; |
|
||||
// How to pay money to us from commit_tx. |
|
||||
required bitcoin_pubkey final_key = 4; |
|
||||
|
|
||||
enum anchor_offer { |
|
||||
// I will create the anchor |
|
||||
WILL_CREATE_ANCHOR = 1; |
|
||||
// I won't create the anchor |
|
||||
WONT_CREATE_ANCHOR = 2; |
|
||||
} |
|
||||
required anchor_offer anch = 5; |
|
||||
|
|
||||
// How far must anchor be buried before we consider channel live? |
|
||||
optional uint32 min_depth = 6 [ default = 0 ]; |
|
||||
|
|
||||
// How much fee would I like on commitment tx? |
|
||||
required uint64 initial_fee_rate = 7; |
|
||||
} |
|
||||
|
|
||||
// Whoever is supplying anchor sends this. |
|
||||
message open_anchor { |
|
||||
// Transaction ID of anchor. |
|
||||
required sha256_hash txid = 1; |
|
||||
// Which output is going to the 2 of 2. |
|
||||
required uint32 output_index = 2; |
|
||||
// Amount of anchor output. |
|
||||
required uint64 amount = 3; |
|
||||
} |
|
||||
|
|
||||
// Reply: signature for your initial commitment tx |
|
||||
message open_commit_sig { |
|
||||
required signature sig = 1; |
|
||||
} |
|
||||
|
|
||||
// Indicates we've seen anchor reach min-depth. |
|
||||
message open_complete { |
|
||||
// Block it went into. |
|
||||
optional sha256_hash blockid = 1; |
|
||||
// FIXME: add a merkle proof plus block headers here? |
|
||||
} |
|
||||
|
|
||||
message route_step { |
|
||||
// Where to next? |
|
||||
oneof next { |
|
||||
// Actually, this is the last one |
|
||||
bool end = 1; |
|
||||
// Next lightning node. |
|
||||
bitcoin_pubkey bitcoin = 2; |
|
||||
// Other realms go here... |
|
||||
} |
|
||||
|
|
||||
// How much to forward (difference is fee) |
|
||||
required uint32 amount = 4; |
|
||||
}; |
|
||||
|
|
||||
message route { |
|
||||
repeated route_step steps = 1; |
|
||||
}; |
|
||||
|
|
||||
message routing { |
|
||||
required bytes info = 1; |
|
||||
} |
|
||||
|
|
||||
// Start a new commitment tx to add an HTLC me -> you. |
|
||||
message update_add_htlc { |
|
||||
// Unique identifier for this HTLC. |
|
||||
required uint64 id = 1; |
|
||||
// Amount for htlc (millisatoshi) |
|
||||
required uint32 amount_msat = 2; |
|
||||
// Hash for HTLC R value. |
|
||||
required sha256_hash r_hash = 3; |
|
||||
// Time at which HTLC expires (absolute) |
|
||||
required locktime expiry = 4; |
|
||||
// Onion-wrapped routing information. |
|
||||
required routing route = 5; |
|
||||
} |
|
||||
|
|
||||
// Complete your HTLC: I have the R value, pay me! |
|
||||
message update_fulfill_htlc { |
|
||||
// Which HTLC |
|
||||
required uint64 id = 1; |
|
||||
// HTLC payment_preimage. |
|
||||
required preimage r = 2; |
|
||||
} |
|
||||
|
|
||||
// This is encrypted in fail_reason. |
|
||||
message fail_info { |
|
||||
required bitcoin_pubkey id = 1; |
|
||||
required uint32 error_code = 2; |
|
||||
optional string reason = 3; |
|
||||
} |
|
||||
|
|
||||
message fail_reason { |
|
||||
required bytes info = 1; |
|
||||
} |
|
||||
|
|
||||
message update_fail_htlc { |
|
||||
// Which HTLC |
|
||||
required uint64 id = 1; |
|
||||
// Reason for failure (for relay to initial node) |
|
||||
required fail_reason reason = 2; |
|
||||
} |
|
||||
|
|
||||
// Fee rate change proposal |
|
||||
message update_fee { |
|
||||
required uint32 fee_rate = 1; |
|
||||
} |
|
||||
|
|
||||
// Commit all the staged changes. |
|
||||
message update_commit { |
|
||||
// Signature for your new commitment tx (if any outputs are HTLCs or to you) |
|
||||
optional signature sig = 1; |
|
||||
} |
|
||||
|
|
||||
// Complete the update. |
|
||||
message update_revocation { |
|
||||
// Hash preimage which revokes old commitment tx. |
|
||||
required sha256_hash revocation_preimage = 1; |
|
||||
// Revocation hash for my next commit transaction |
|
||||
required sha256_hash next_revocation_hash = 2; |
|
||||
} |
|
||||
|
|
||||
// Start clearing out the channel HTLCs so we can close it |
|
||||
message close_shutdown { |
|
||||
// Output script for mutual close tx. |
|
||||
required bytes scriptPubkey = 1; |
|
||||
} |
|
||||
|
|
||||
message close_signature { |
|
||||
// Fee in satoshis. |
|
||||
required uint64 close_fee = 1; |
|
||||
// Signature on the close transaction. |
|
||||
required signature sig = 2; |
|
||||
} |
|
||||
|
|
||||
// This means we're going to hang up; it's to help diagnose only! |
|
||||
message error { |
|
||||
optional string problem = 1; |
|
||||
} |
|
||||
|
|
||||
// Nested message to transport standard protocol messages through the legacy transport |
|
||||
message nested_pkt { |
|
||||
required uint32 type = 1; |
|
||||
required bytes inner_pkt = 2; |
|
||||
} |
|
||||
|
|
||||
// This is the union which defines all of them |
|
||||
message pkt { |
|
||||
oneof pkt { |
|
||||
// Start of connection |
|
||||
authenticate auth = 50; |
|
||||
init init = 51; |
|
||||
|
|
||||
// Opening |
|
||||
open_channel open = 20; |
|
||||
open_anchor open_anchor = 21; |
|
||||
open_commit_sig open_commit_sig = 22; |
|
||||
open_complete open_complete = 23; |
|
||||
// Updating (most common) |
|
||||
update_add_htlc update_add_htlc = 2; |
|
||||
update_fulfill_htlc update_fulfill_htlc = 3; |
|
||||
update_fail_htlc update_fail_htlc = 4; |
|
||||
update_fee update_fee = 5; |
|
||||
update_commit update_commit = 6; |
|
||||
update_revocation update_revocation = 7; |
|
||||
|
|
||||
// Closing |
|
||||
close_shutdown close_shutdown = 30; |
|
||||
close_signature close_signature = 31; |
|
||||
|
|
||||
// Unexpected issue. |
|
||||
error error = 40; |
|
||||
|
|
||||
// Shim to upgrade to new packet format |
|
||||
nested_pkt nested = 128; |
|
||||
} |
|
||||
} |
|
@ -1,206 +0,0 @@ |
|||||
#include "bitcoin/locktime.h" |
|
||||
#include "bitcoin/preimage.h" |
|
||||
#include "bitcoin/pubkey.h" |
|
||||
#include "bitcoin/signature.h" |
|
||||
#include "protobuf_convert.h" |
|
||||
#include "type_to_string.h" |
|
||||
#include "utils.h" |
|
||||
#include <ccan/crypto/sha256/sha256.h> |
|
||||
|
|
||||
Signature *signature_to_proto(const tal_t *ctx, const secp256k1_ecdsa_signature *sig) |
|
||||
{ |
|
||||
u8 compact[64]; |
|
||||
Signature *pb = tal(ctx, Signature); |
|
||||
signature__init(pb); |
|
||||
|
|
||||
assert(sig_valid(sig)); |
|
||||
|
|
||||
secp256k1_ecdsa_signature_serialize_compact(secp256k1_ctx, |
|
||||
compact, sig); |
|
||||
|
|
||||
/* Kill me now... */ |
|
||||
memcpy(&pb->r1, compact, 8); |
|
||||
memcpy(&pb->r2, compact + 8, 8); |
|
||||
memcpy(&pb->r3, compact + 16, 8); |
|
||||
memcpy(&pb->r4, compact + 24, 8); |
|
||||
memcpy(&pb->s1, compact + 32, 8); |
|
||||
memcpy(&pb->s2, compact + 40, 8); |
|
||||
memcpy(&pb->s3, compact + 48, 8); |
|
||||
memcpy(&pb->s4, compact + 56, 8); |
|
||||
|
|
||||
return pb; |
|
||||
} |
|
||||
|
|
||||
bool proto_to_signature(const Signature *pb, secp256k1_ecdsa_signature *sig) |
|
||||
{ |
|
||||
u8 compact[64]; |
|
||||
|
|
||||
/* Kill me again. */ |
|
||||
memcpy(compact, &pb->r1, 8); |
|
||||
memcpy(compact + 8, &pb->r2, 8); |
|
||||
memcpy(compact + 16, &pb->r3, 8); |
|
||||
memcpy(compact + 24, &pb->r4, 8); |
|
||||
memcpy(compact + 32, &pb->s1, 8); |
|
||||
memcpy(compact + 40, &pb->s2, 8); |
|
||||
memcpy(compact + 48, &pb->s3, 8); |
|
||||
memcpy(compact + 56, &pb->s4, 8); |
|
||||
|
|
||||
if (secp256k1_ecdsa_signature_parse_compact(secp256k1_ctx, |
|
||||
sig, compact) |
|
||||
!= 1) |
|
||||
return false; |
|
||||
|
|
||||
return sig_valid(sig); |
|
||||
} |
|
||||
|
|
||||
BitcoinPubkey *pubkey_to_proto(const tal_t *ctx, const struct pubkey *key) |
|
||||
{ |
|
||||
BitcoinPubkey *p = tal(ctx, BitcoinPubkey); |
|
||||
|
|
||||
bitcoin_pubkey__init(p); |
|
||||
p->key.len = PUBKEY_DER_LEN; |
|
||||
p->key.data = tal_arr(p, u8, p->key.len); |
|
||||
|
|
||||
pubkey_to_der(p->key.data, key); |
|
||||
|
|
||||
return p; |
|
||||
} |
|
||||
|
|
||||
bool proto_to_pubkey(const BitcoinPubkey *pb, struct pubkey *key) |
|
||||
{ |
|
||||
return pubkey_from_der(pb->key.data, pb->key.len, key); |
|
||||
} |
|
||||
|
|
||||
Sha256Hash *sha256_to_proto(const tal_t *ctx, const struct sha256 *hash) |
|
||||
{ |
|
||||
Sha256Hash *h = tal(ctx, Sha256Hash); |
|
||||
sha256_hash__init(h); |
|
||||
|
|
||||
/* Kill me now... */ |
|
||||
memcpy(&h->a, hash->u.u8, 8); |
|
||||
memcpy(&h->b, hash->u.u8 + 8, 8); |
|
||||
memcpy(&h->c, hash->u.u8 + 16, 8); |
|
||||
memcpy(&h->d, hash->u.u8 + 24, 8); |
|
||||
return h; |
|
||||
} |
|
||||
|
|
||||
void proto_to_sha256(const Sha256Hash *pb, struct sha256 *hash) |
|
||||
{ |
|
||||
/* Kill me again. */ |
|
||||
memcpy(hash->u.u8, &pb->a, 8); |
|
||||
memcpy(hash->u.u8 + 8, &pb->b, 8); |
|
||||
memcpy(hash->u.u8 + 16, &pb->c, 8); |
|
||||
memcpy(hash->u.u8 + 24, &pb->d, 8); |
|
||||
} |
|
||||
|
|
||||
Preimage *preimage_to_proto(const tal_t *ctx, const struct preimage *r) |
|
||||
{ |
|
||||
Preimage *pb = tal(ctx, Preimage); |
|
||||
preimage__init(pb); |
|
||||
|
|
||||
/* Kill me now... */ |
|
||||
memcpy(&pb->a, r->r, 8); |
|
||||
memcpy(&pb->b, r->r + 8, 8); |
|
||||
memcpy(&pb->c, r->r + 16, 8); |
|
||||
memcpy(&pb->d, r->r + 24, 8); |
|
||||
return pb; |
|
||||
} |
|
||||
|
|
||||
void proto_to_preimage(const Preimage *pb, struct preimage *r) |
|
||||
{ |
|
||||
/* Kill me again. */ |
|
||||
memcpy(r->r, &pb->a, 8); |
|
||||
memcpy(r->r + 8, &pb->b, 8); |
|
||||
memcpy(r->r + 16, &pb->c, 8); |
|
||||
memcpy(r->r + 24, &pb->d, 8); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
bool proto_to_rel_locktime(const Locktime *l, struct rel_locktime *locktime) |
|
||||
{ |
|
||||
switch (l->locktime_case) { |
|
||||
case LOCKTIME__LOCKTIME_SECONDS: |
|
||||
return seconds_to_rel_locktime(l->seconds, locktime); |
|
||||
case LOCKTIME__LOCKTIME_BLOCKS: |
|
||||
return blocks_to_rel_locktime(l->blocks, locktime); |
|
||||
default: |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
bool proto_to_abs_locktime(const Locktime *l, struct abs_locktime *locktime) |
|
||||
{ |
|
||||
switch (l->locktime_case) { |
|
||||
case LOCKTIME__LOCKTIME_SECONDS: |
|
||||
return seconds_to_abs_locktime(l->seconds, locktime); |
|
||||
case LOCKTIME__LOCKTIME_BLOCKS: |
|
||||
return blocks_to_abs_locktime(l->blocks, locktime); |
|
||||
default: |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
Locktime *rel_locktime_to_proto(const tal_t *ctx, |
|
||||
const struct rel_locktime *locktime) |
|
||||
{ |
|
||||
Locktime *l = tal(ctx, Locktime); |
|
||||
locktime__init(l); |
|
||||
|
|
||||
if (rel_locktime_is_seconds(locktime)) { |
|
||||
l->locktime_case = LOCKTIME__LOCKTIME_SECONDS; |
|
||||
l->seconds = rel_locktime_to_seconds(locktime); |
|
||||
} else { |
|
||||
l->locktime_case = LOCKTIME__LOCKTIME_BLOCKS; |
|
||||
l->blocks = rel_locktime_to_blocks(locktime); |
|
||||
} |
|
||||
return l; |
|
||||
} |
|
||||
|
|
||||
Locktime *abs_locktime_to_proto(const tal_t *ctx, |
|
||||
const struct abs_locktime *locktime) |
|
||||
{ |
|
||||
Locktime *l = tal(ctx, Locktime); |
|
||||
locktime__init(l); |
|
||||
|
|
||||
if (abs_locktime_is_seconds(locktime)) { |
|
||||
l->locktime_case = LOCKTIME__LOCKTIME_SECONDS; |
|
||||
l->seconds = abs_locktime_to_seconds(locktime); |
|
||||
} else { |
|
||||
l->locktime_case = LOCKTIME__LOCKTIME_BLOCKS; |
|
||||
l->blocks = abs_locktime_to_blocks(locktime); |
|
||||
} |
|
||||
return l; |
|
||||
} |
|
||||
|
|
||||
static void *proto_tal_alloc(void *allocator_data, size_t size) |
|
||||
{ |
|
||||
return tal_arr(allocator_data, char, size); |
|
||||
} |
|
||||
|
|
||||
static void proto_tal_free(void *allocator_data, void *pointer) |
|
||||
{ |
|
||||
tal_free(pointer); |
|
||||
} |
|
||||
|
|
||||
/* Get allocator so decoded protobuf will be tal off it. */ |
|
||||
struct ProtobufCAllocator *make_prototal(const tal_t *ctx) |
|
||||
{ |
|
||||
struct ProtobufCAllocator *prototal; |
|
||||
|
|
||||
prototal = tal(ctx, struct ProtobufCAllocator); |
|
||||
prototal->alloc = proto_tal_alloc; |
|
||||
prototal->free = proto_tal_free; |
|
||||
prototal->allocator_data = tal(prototal, char); |
|
||||
|
|
||||
return prototal; |
|
||||
} |
|
||||
|
|
||||
/* Now steal object off of allocator (and free prototal) */ |
|
||||
void steal_from_prototal(const tal_t *ctx, struct ProtobufCAllocator *prototal, |
|
||||
const void *pb) |
|
||||
{ |
|
||||
tal_steal(ctx, pb); |
|
||||
tal_steal(pb, prototal->allocator_data); |
|
||||
tal_free(prototal); |
|
||||
} |
|
||||
REGISTER_TYPE_TO_HEXSTR(preimage); |
|
@ -1,45 +0,0 @@ |
|||||
#ifndef LIGHTNING_PROTOBUF_CONVERT_H |
|
||||
#define LIGHTNING_PROTOBUF_CONVERT_H |
|
||||
#include "config.h" |
|
||||
#include "lightning.pb-c.h" |
|
||||
#include <ccan/tal/tal.h> |
|
||||
#include <secp256k1.h> |
|
||||
#include <stdbool.h> |
|
||||
|
|
||||
/* Convert to-from protobuf to internal representation. */ |
|
||||
Signature *signature_to_proto(const tal_t *ctx, |
|
||||
const secp256k1_ecdsa_signature *sig); |
|
||||
bool proto_to_signature(const Signature *pb, |
|
||||
secp256k1_ecdsa_signature *sig); |
|
||||
|
|
||||
/* Convert to-from protobuf to internal representation. */ |
|
||||
struct pubkey; |
|
||||
BitcoinPubkey *pubkey_to_proto(const tal_t *ctx, |
|
||||
const struct pubkey *key); |
|
||||
bool proto_to_pubkey(const BitcoinPubkey *pb, struct pubkey *key); |
|
||||
|
|
||||
/* Useful helper for allocating & populating a protobuf Sha256Hash */ |
|
||||
struct sha256; |
|
||||
Sha256Hash *sha256_to_proto(const tal_t *ctx, const struct sha256 *hash); |
|
||||
void proto_to_sha256(const Sha256Hash *pb, struct sha256 *hash); |
|
||||
|
|
||||
struct preimage; |
|
||||
Preimage *preimage_to_proto(const tal_t *ctx, const struct preimage *r); |
|
||||
void proto_to_preimage(const Preimage *pb, struct preimage *r); |
|
||||
|
|
||||
struct rel_locktime; |
|
||||
struct abs_locktime; |
|
||||
bool proto_to_rel_locktime(const Locktime *l, struct rel_locktime *locktime); |
|
||||
bool proto_to_abs_locktime(const Locktime *l, struct abs_locktime *locktime); |
|
||||
Locktime *rel_locktime_to_proto(const tal_t *ctx, |
|
||||
const struct rel_locktime *locktime); |
|
||||
Locktime *abs_locktime_to_proto(const tal_t *ctx, |
|
||||
const struct abs_locktime *locktime); |
|
||||
|
|
||||
/* Get allocator so decoded protobuf will be tal off it. */ |
|
||||
struct ProtobufCAllocator *make_prototal(const tal_t *ctx); |
|
||||
/* Now steal object off of allocator (and free prototal) */ |
|
||||
void steal_from_prototal(const tal_t *ctx, struct ProtobufCAllocator *prototal, |
|
||||
const void *pb); |
|
||||
|
|
||||
#endif /* LIGHTNING_PROTOBUF_CONVERT_H */ |
|
Loading…
Reference in new issue