onchaind: basic daemon.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2017-08-23 11:22:17 +09:30 committed by Christian Decker
parent 4ba1599494
commit 1b2fb18944
6 changed files with 1623 additions and 3 deletions

View File

@ -4,7 +4,7 @@
lightningd-wrongdir:
$(MAKE) -C .. lightningd-all
LIGHTNINGD_BINS := lightningd/lightningd lightningd/lightningd_hsm lightningd/lightningd_handshake lightningd/lightningd_gossip lightningd/lightningd_opening lightningd/lightningd_channel lightningd/lightningd_closing
LIGHTNINGD_BINS := lightningd/lightningd lightningd/lightningd_hsm lightningd/lightningd_handshake lightningd/lightningd_gossip lightningd/lightningd_opening lightningd/lightningd_channel lightningd/lightningd_closing lightningd/lightningd_onchain
lightningd-all: $(LIGHTNINGD_BINS)
@ -103,8 +103,7 @@ LIGHTNINGD_HEADERS_NOGEN = \
$(CORE_HEADERS) \
$(CORE_TX_HEADERS) \
$(DAEMON_HEADERS) \
$(WALLET_LIB_HEADERS) \
lightningd/onchain/onchain_wire.h
$(WALLET_LIB_HEADERS)
# Generated headers
LIGHTNINGD_HEADERS_GEN = \
@ -130,6 +129,7 @@ include lightningd/gossip/Makefile
include lightningd/opening/Makefile
include lightningd/channel/Makefile
include lightningd/closing/Makefile
include lightningd/onchain/Makefile
$(LIGHTNINGD_OBJS) $(LIGHTNINGD_LIB_OBJS): $(LIGHTNINGD_HEADERS)

View File

@ -1,6 +1,7 @@
#ifndef LIGHTNING_LIGHTNINGD_DERIVE_BASEPOINTS_H
#define LIGHTNING_LIGHTNINGD_DERIVE_BASEPOINTS_H
#include "config.h"
#include <assert.h>
#include <bitcoin/privkey.h>
#include <bitcoin/pubkey.h>
#include <ccan/build_assert/build_assert.h>

View File

@ -0,0 +1,69 @@
#! /usr/bin/make
# Designed to be run one level up
lightningd/onchain-wrongdir:
$(MAKE) -C ../.. lightningd/onchain-all
default: lightningd/onchain-all
lightningd/onchain-all: lightningd/lightningd_onchain
lightningd/onchain/gen_onchain_types_names.h: lightningd/onchain/onchain_types.h ccan/ccan/cdump/tools/cdump-enumstr
ccan/ccan/cdump/tools/cdump-enumstr lightningd/onchain/onchain_types.h > $@
# lightningd/onchain needs these:
LIGHTNINGD_ONCHAIN_HEADERS_GEN := \
lightningd/onchain/gen_onchain_wire.h \
lightningd/onchain/gen_onchain_types_names.h
LIGHTNINGD_ONCHAIN_HEADERS_NOGEN := \
lightningd/onchain/onchain_types.h \
lightningd/onchain/onchain_wire.h
LIGHTNINGD_ONCHAIN_HEADERS := $(LIGHTNINGD_ONCHAIN_HEADERS_GEN) $(LIGHTNINGD_ONCHAIN_HEADERS_NOGEN)
LIGHTNINGD_ONCHAIN_SRC := lightningd/onchain/onchain.c \
lightningd/onchain/gen_onchain_wire.c \
lightningd/onchain/onchain_wire.c
LIGHTNINGD_ONCHAIN_OBJS := $(LIGHTNINGD_ONCHAIN_SRC:.c=.o)
# Control daemon uses this:
LIGHTNINGD_ONCHAIN_CONTROL_HEADERS := \
lightningd/onchain/gen_onchain_wire.h \
lightningd/onchain/onchain_wire.h
LIGHTNINGD_ONCHAIN_CONTROL_SRC := $(LIGHTNINGD_ONCHAIN_CONTROL_HEADERS:.h=.c)
LIGHTNINGD_ONCHAIN_CONTROL_OBJS := $(LIGHTNINGD_ONCHAIN_CONTROL_SRC:.c=.o)
LIGHTNINGD_ONCHAIN_GEN_SRC := $(filter lightningd/onchain/gen_%, $(LIGHTNINGD_ONCHAIN_SRC) $(LIGHTNINGD_ONCHAIN_CONTROL_SRC))
LIGHTNINGD_ONCHAIN_SRC_NOGEN := $(filter-out lightningd/onchain/gen_%, $(LIGHTNINGD_ONCHAIN_SRC))
# Add to headers which any object might need.
LIGHTNINGD_HEADERS_GEN += $(LIGHTNINGD_ONCHAIN_HEADERS_GEN)
LIGHTNINGD_HEADERS_NOGEN += $(LIGHTNINGD_ONCHAIN_HEADERS_NOGEN)
$(LIGHTNINGD_ONCHAIN_OBJS): $(LIGHTNINGD_HEADERS)
lightningd/onchain/gen_onchain_wire.h: $(WIRE_GEN) lightningd/onchain/onchain_wire.csv
$(WIRE_GEN) --header $@ onchain_wire_type < lightningd/onchain/onchain_wire.csv > $@
lightningd/onchain/gen_onchain_wire.c: $(WIRE_GEN) lightningd/onchain/onchain_wire.csv
$(WIRE_GEN) ${@:.c=.h} onchain_wire_type < lightningd/onchain/onchain_wire.csv > $@
LIGHTNINGD_ONCHAIN_OBJS := $(LIGHTNINGD_ONCHAIN_SRC:.c=.o) $(LIGHTNINGD_ONCHAIN_GEN_SRC:.c=.o)
lightningd/lightningd_onchain: $(LIGHTNINGD_OLD_LIB_OBJS) $(LIGHTNINGD_LIB_OBJS) $(LIGHTNINGD_ONCHAIN_OBJS) $(WIRE_ONION_OBJS) $(CORE_OBJS) $(CORE_TX_OBJS) $(WIRE_OBJS) $(BITCOIN_OBJS) $(CCAN_OBJS) $(CCAN_SHACHAIN48_OBJ) $(LIGHTNINGD_HSM_CLIENT_OBJS) $(LIBBASE58_OBJS) libsecp256k1.a libsodium.a libwallycore.a
$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)
check-source: $(LIGHTNINGD_ONCHAIN_SRC_NOGEN:%=check-src-include-order/%)
check-source-bolt: $(LIGHTNINGD_ONCHAIN_SRC:%=bolt-check/%) $(LIGHTNINGD_ONCHAIN_HEADERS:%=bolt-check/%)
check-whitespace: $(LIGHTNINGD_ONCHAIN_SRC_NOGEN:%=check-whitespace/%) $(LIGHTNINGD_ONCHAIN_HEADERS_NOGEN:%=check-whitespace/%)
clean: lightningd/onchain-clean
lightningd/onchain-clean:
$(RM) $(LIGHTNINGD_ONCHAIN_OBJS) gen_*
-include lightningd/onchain/test/Makefile

1422
lightningd/onchain/onchain.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,54 @@
#ifndef LIGHTNING_LIGHTNINGD_ONCHAIN_TYPES_H
#define LIGHTNING_LIGHTNINGD_ONCHAIN_TYPES_H
#include "config.h"
/* Different transactions we care about. */
enum tx_type {
/* The initial 2 of 2 funding transaction */
FUNDING_TRANSACTION,
/* A mutual close: spends funding */
MUTUAL_CLOSE,
/* Their unilateral: spends funding */
THEIR_UNILATERAL,
/* Our unilateral: spends funding */
OUR_UNILATERAL,
/* The 2 different types of HTLC transaction, each way */
THEIR_HTLC_TIMEOUT_TO_THEM,
THEIR_HTLC_FULFILL_TO_US,
OUR_HTLC_TIMEOUT_TO_US,
OUR_HTLC_FULFILL_TO_THEM,
/* When we spend the to-us output (after cltv_expiry) */
OUR_UNILATERAL_TO_US_RETURN_TO_WALLET,
/* Special type for marking outputs as resolved by self. */
SELF,
/* Shouldn't happen. */
UNKNOWN_TXTYPE
};
/* Different output types. */
enum output_type {
/* FUNDING_TRANSACTION */
FUNDING_OUTPUT,
/* THEIR_UNILATERAL */
OUTPUT_TO_US,
DELAYED_OUTPUT_TO_THEM,
/* OUR_UNILATERAL */
DELAYED_OUTPUT_TO_US,
OUTPUT_TO_THEM,
/* HTLC outputs: their offers and our offers */
THEIR_HTLC,
OUR_HTLC,
};
#endif /* LIGHTNING_LIGHTNINGD_ONCHAIN_TYPES_H */

View File

@ -0,0 +1,74 @@
# Shouldn't happen
onchain_bad_command,0x8000
onchain_internal_error,0x8003
onchain_crypto_failed,0x8004
#include <lightningd/htlc_wire.h>
# Begin! Here's the onchain tx which spends funding tx, followed by all HTLCs.
onchain_init,1
onchain_init,,seed,struct privkey
onchain_init,,shachain,struct shachain
onchain_init,,funding_amount_satoshi,u64
# Remote per commit point for committed tx.
onchain_init,,old_remote_per_commitment_point,struct pubkey
# Remote per commit point for current tx (needed if we haven't got revoke_and_ack yet).
onchain_init,,remote_per_commitment_point,struct pubkey
onchain_init,,local_to_self_delay,u32
onchain_init,,remote_to_self_delay,u32
onchain_init,,feerate_per_kw,u64
onchain_init,,local_dust_limit_satoshi,u64
onchain_init,,remote_revocation_basepoint,struct pubkey
# Gives an easy way to tell if it's our unilateral close or theirs...
onchain_init,,our_broadcast_txid,struct sha256_double
onchain_init,,local_scriptpubkey_len,u16
onchain_init,,local_scriptpubkey,local_scriptpubkey_len*u8
onchain_init,,remote_scriptpubkey_len,u16
onchain_init,,remote_scriptpubkey,remote_scriptpubkey_len*u8
onchain_init,,ourwallet_pubkey,struct pubkey
# We need these two for commit number obscurer
onchain_init,,funder,enum side
onchain_init,,remote_payment_basepoint,struct pubkey
onchain_init,,remote_delayed_payment_basepoint,struct pubkey
onchain_init,,tx,struct bitcoin_tx
onchain_init,,tx_blockheight,u32
onchain_init,,num_htlc_sigs,u16
onchain_init,,htlc_signature,num_htlc_sigs*secp256k1_ecdsa_signature
onchain_init,,num_htlcs,u64
#include <lightningd/onchain/onchain_wire.h>
# This is all the HTLCs: one per message
onchain_htlc,2
onchain_htlc,,htlc,struct htlc_stub
# This sets what the state is, depending on tx.
onchain_init_reply,101
onchain_init_reply,,state,u8
# onchaind->master: Send out a tx.
onchain_broadcast_tx,3
onchain_broadcast_tx,,tx,struct bitcoin_tx
# master->onchaind: Notifier that an output has been spent by input_num of tx.
onchain_spent,4
onchain_spent,,tx,struct bitcoin_tx
onchain_spent,,input_num,u32
onchain_spent,,blockheight,u32
# master->onchaind: We will receive more than one of these, as depth changes.
onchain_depth,5
onchain_depth,,txid,struct sha256_double
onchain_depth,,depth,u32
# onchaind->master: We don't want to watch this tx, or its outputs
onchain_unwatch_tx,6
onchain_unwatch_tx,,txid,struct sha256_double
onchain_unwatch_tx,,num_outputs,u32
# master->onchaind: We know HTLC preimage
onchain_known_preimage,7
onchain_known_preimage,,preimage,struct preimage
# onchaind->master: We discovered HTLC preimage
onchain_extracted_preimage,8
onchain_extracted_preimage,,preimage,struct preimage
1 # Shouldn't happen
2 onchain_bad_command,0x8000
3 onchain_internal_error,0x8003
4 onchain_crypto_failed,0x8004
5 #include <lightningd/htlc_wire.h>
6 # Begin! Here's the onchain tx which spends funding tx, followed by all HTLCs.
7 onchain_init,1
8 onchain_init,,seed,struct privkey
9 onchain_init,,shachain,struct shachain
10 onchain_init,,funding_amount_satoshi,u64
11 # Remote per commit point for committed tx.
12 onchain_init,,old_remote_per_commitment_point,struct pubkey
13 # Remote per commit point for current tx (needed if we haven't got revoke_and_ack yet).
14 onchain_init,,remote_per_commitment_point,struct pubkey
15 onchain_init,,local_to_self_delay,u32
16 onchain_init,,remote_to_self_delay,u32
17 onchain_init,,feerate_per_kw,u64
18 onchain_init,,local_dust_limit_satoshi,u64
19 onchain_init,,remote_revocation_basepoint,struct pubkey
20 # Gives an easy way to tell if it's our unilateral close or theirs...
21 onchain_init,,our_broadcast_txid,struct sha256_double
22 onchain_init,,local_scriptpubkey_len,u16
23 onchain_init,,local_scriptpubkey,local_scriptpubkey_len*u8
24 onchain_init,,remote_scriptpubkey_len,u16
25 onchain_init,,remote_scriptpubkey,remote_scriptpubkey_len*u8
26 onchain_init,,ourwallet_pubkey,struct pubkey
27 # We need these two for commit number obscurer
28 onchain_init,,funder,enum side
29 onchain_init,,remote_payment_basepoint,struct pubkey
30 onchain_init,,remote_delayed_payment_basepoint,struct pubkey
31 onchain_init,,tx,struct bitcoin_tx
32 onchain_init,,tx_blockheight,u32
33 onchain_init,,num_htlc_sigs,u16
34 onchain_init,,htlc_signature,num_htlc_sigs*secp256k1_ecdsa_signature
35 onchain_init,,num_htlcs,u64
36 #include <lightningd/onchain/onchain_wire.h>
37 # This is all the HTLCs: one per message
38 onchain_htlc,2
39 onchain_htlc,,htlc,struct htlc_stub
40 # This sets what the state is, depending on tx.
41 onchain_init_reply,101
42 onchain_init_reply,,state,u8
43 # onchaind->master: Send out a tx.
44 onchain_broadcast_tx,3
45 onchain_broadcast_tx,,tx,struct bitcoin_tx
46 # master->onchaind: Notifier that an output has been spent by input_num of tx.
47 onchain_spent,4
48 onchain_spent,,tx,struct bitcoin_tx
49 onchain_spent,,input_num,u32
50 onchain_spent,,blockheight,u32
51 # master->onchaind: We will receive more than one of these, as depth changes.
52 onchain_depth,5
53 onchain_depth,,txid,struct sha256_double
54 onchain_depth,,depth,u32
55 # onchaind->master: We don't want to watch this tx, or its outputs
56 onchain_unwatch_tx,6
57 onchain_unwatch_tx,,txid,struct sha256_double
58 onchain_unwatch_tx,,num_outputs,u32
59 # master->onchaind: We know HTLC preimage
60 onchain_known_preimage,7
61 onchain_known_preimage,,preimage,struct preimage
62 # onchaind->master: We discovered HTLC preimage
63 onchain_extracted_preimage,8
64 onchain_extracted_preimage,,preimage,struct preimage