Browse Source

state: hand tx explicitly to bitcoin_watch / bitcoin_watch_delayed

Neater than assuming it's effect->broadcast.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 9 years ago
parent
commit
42bf766d64
  1. 22
      state.c
  2. 10
      state.h
  3. 10
      test/test_state_coverage.c

22
state.c

@ -528,6 +528,7 @@ enum state state(const enum state state, const struct state_data *sdata,
bitcoin_commit(effect, sdata)); bitcoin_commit(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch_delayed(effect, bitcoin_watch_delayed(effect,
effect->broadcast,
BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED)); BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED));
/* They could still close. */ /* They could still close. */
return STATE_CLOSE_WAIT_CLOSE_OURCOMMIT; return STATE_CLOSE_WAIT_CLOSE_OURCOMMIT;
@ -612,7 +613,7 @@ enum state state(const enum state state, const struct state_data *sdata,
set_effect(effect, broadcast, set_effect(effect, broadcast,
bitcoin_spend_ours(effect, sdata)); bitcoin_spend_ours(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, bitcoin_watch(effect, effect->broadcast,
BITCOIN_SPEND_OURS_DONE)); BITCOIN_SPEND_OURS_DONE));
bits &= ~STATE_CLOSE_OURCOMMIT_BIT; bits &= ~STATE_CLOSE_OURCOMMIT_BIT;
bits |= STATE_CLOSE_SPENDOURS_BIT; bits |= STATE_CLOSE_SPENDOURS_BIT;
@ -631,7 +632,7 @@ enum state state(const enum state state, const struct state_data *sdata,
set_effect(effect, broadcast, set_effect(effect, broadcast,
bitcoin_spend_theirs(effect, sdata)); bitcoin_spend_theirs(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, bitcoin_watch(effect, effect->broadcast,
BITCOIN_SPEND_THEIRS_DONE)); BITCOIN_SPEND_THEIRS_DONE));
bits |= STATE_CLOSE_SPENDTHEM_BIT; bits |= STATE_CLOSE_SPENDTHEM_BIT;
return base + bits; return base + bits;
@ -643,7 +644,8 @@ enum state state(const enum state state, const struct state_data *sdata,
return STATE_ERR_INFORMATION_LEAK; return STATE_ERR_INFORMATION_LEAK;
set_effect(effect, broadcast, steal); set_effect(effect, broadcast, steal);
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, BITCOIN_STEAL_DONE)); bitcoin_watch(effect, effect->broadcast,
BITCOIN_STEAL_DONE));
bits |= STATE_CLOSE_STEAL_BIT; bits |= STATE_CLOSE_STEAL_BIT;
return base + bits; return base + bits;
} else if (input_is(input, BITCOIN_ANCHOR_UNSPENT)) } else if (input_is(input, BITCOIN_ANCHOR_UNSPENT))
@ -716,7 +718,7 @@ start_unilateral_close:
set_effect(effect, stop_commands, true); set_effect(effect, stop_commands, true);
set_effect(effect, broadcast, bitcoin_commit(effect, sdata)); set_effect(effect, broadcast, bitcoin_commit(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch_delayed(effect, bitcoin_watch_delayed(effect, effect->broadcast,
BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED)); BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED));
return STATE_CLOSE_WAIT_OURCOMMIT; return STATE_CLOSE_WAIT_OURCOMMIT;
@ -731,7 +733,8 @@ them_unilateral:
set_effect(effect, stop_commands, true); set_effect(effect, stop_commands, true);
set_effect(effect, broadcast, bitcoin_spend_theirs(effect, sdata)); set_effect(effect, broadcast, bitcoin_spend_theirs(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, BITCOIN_SPEND_THEIRS_DONE)); bitcoin_watch(effect, effect->broadcast,
BITCOIN_SPEND_THEIRS_DONE));
return STATE_CLOSE_WAIT_SPENDTHEM; return STATE_CLOSE_WAIT_SPENDTHEM;
accept_update: accept_update:
@ -825,7 +828,8 @@ fail_during_close:
set_effect(effect, broadcast, set_effect(effect, broadcast,
bitcoin_spend_theirs(effect, sdata)); bitcoin_spend_theirs(effect, sdata));
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, BITCOIN_SPEND_THEIRS_DONE)); bitcoin_watch(effect, effect->broadcast,
BITCOIN_SPEND_THEIRS_DONE));
/* Expect either close or spendthem to complete */ /* Expect either close or spendthem to complete */
return STATE_CLOSE_WAIT_SPENDTHEM_CLOSE; return STATE_CLOSE_WAIT_SPENDTHEM_CLOSE;
} else if (input_is(input, BITCOIN_ANCHOR_OTHERSPEND)) { } else if (input_is(input, BITCOIN_ANCHOR_OTHERSPEND)) {
@ -834,7 +838,8 @@ fail_during_close:
return STATE_ERR_INFORMATION_LEAK; return STATE_ERR_INFORMATION_LEAK;
set_effect(effect, broadcast, steal); set_effect(effect, broadcast, steal);
set_effect(effect, watch, set_effect(effect, watch,
bitcoin_watch(effect, BITCOIN_STEAL_DONE)); bitcoin_watch(effect, effect->broadcast,
BITCOIN_STEAL_DONE));
/* Expect either close or steal to complete */ /* Expect either close or steal to complete */
return STATE_CLOSE_WAIT_STEAL_CLOSE; return STATE_CLOSE_WAIT_STEAL_CLOSE;
} else if (input_is(input, BITCOIN_ANCHOR_UNSPENT)) { } else if (input_is(input, BITCOIN_ANCHOR_UNSPENT)) {
@ -857,6 +862,7 @@ old_commit_spotted:
if (!steal) if (!steal)
return STATE_ERR_INFORMATION_LEAK; return STATE_ERR_INFORMATION_LEAK;
set_effect(effect, broadcast, steal); set_effect(effect, broadcast, steal);
set_effect(effect, watch, bitcoin_watch(effect, BITCOIN_STEAL_DONE)); set_effect(effect, watch,
bitcoin_watch(effect, effect->broadcast, BITCOIN_STEAL_DONE));
return STATE_CLOSE_WAIT_STEAL; return STATE_CLOSE_WAIT_STEAL;
} }

10
state.h

@ -200,21 +200,27 @@ struct watch *bitcoin_unwatch_anchor_depth(const tal_t *ctx,
/** /**
* bitcoin_watch_delayed: watch this (commit) tx, tell me when I can spend it * bitcoin_watch_delayed: watch this (commit) tx, tell me when I can spend it
* @effect: both the context to tal the watch off, and tx we're watching. * @effect: the context to tal the watch off
* @tx: the tx we're watching.
* @canspend: the input to give when commit reaches spendable depth. * @canspend: the input to give when commit reaches spendable depth.
*
* Note that this tx may be malleated, as it's dual-signed.
*/ */
struct watch *bitcoin_watch_delayed(const struct state_effect *effect, struct watch *bitcoin_watch_delayed(const struct state_effect *effect,
const struct bitcoin_tx *tx,
enum state_input canspend); enum state_input canspend);
/** /**
* bitcoin_watch: watch this tx until it's "irreversible" * bitcoin_watch: watch this tx until it's "irreversible"
* @effect: both the context to tal the watch off, and tx we're watching. * @effect: the context to tal the watch off
* @tx: the tx we're watching.
* @done: the input to give when tx is completely buried. * @done: the input to give when tx is completely buried.
* *
* The tx should be immalleable by BIP62; once this fires we consider * The tx should be immalleable by BIP62; once this fires we consider
* the channel completely closed and stop watching (eg 100 txs down). * the channel completely closed and stop watching (eg 100 txs down).
*/ */
struct watch *bitcoin_watch(const struct state_effect *effect, struct watch *bitcoin_watch(const struct state_effect *effect,
const struct bitcoin_tx *tx,
enum state_input done); enum state_input done);
/** /**

10
test/test_state_coverage.c

@ -441,11 +441,12 @@ struct watch *bitcoin_unwatch_anchor_depth(const tal_t *ctx,
/* Wait for our commit to be spendable. */ /* Wait for our commit to be spendable. */
struct watch *bitcoin_watch_delayed(const struct state_effect *effect, struct watch *bitcoin_watch_delayed(const struct state_effect *effect,
const struct bitcoin_tx *tx,
enum state_input canspend) enum state_input canspend)
{ {
struct watch *watch = talz(effect, struct watch); struct watch *watch = talz(effect, struct watch);
assert(bitcoin_tx_is(effect->broadcast, "our commit")); assert(bitcoin_tx_is(tx, "our commit"));
add_event(&watch->events, canspend); add_event(&watch->events, canspend);
return watch; return watch;
} }
@ -453,16 +454,17 @@ struct watch *bitcoin_watch_delayed(const struct state_effect *effect,
/* Wait for commit to be very deeply buried (so we no longer need to /* Wait for commit to be very deeply buried (so we no longer need to
* even watch) */ * even watch) */
struct watch *bitcoin_watch(const struct state_effect *effect, struct watch *bitcoin_watch(const struct state_effect *effect,
const struct bitcoin_tx *tx,
enum state_input done) enum state_input done)
{ {
struct watch *watch = talz(effect, struct watch); struct watch *watch = talz(effect, struct watch);
if (done == BITCOIN_STEAL_DONE) if (done == BITCOIN_STEAL_DONE)
assert(bitcoin_tx_is(effect->broadcast, "steal")); assert(bitcoin_tx_is(tx, "steal"));
else if (done == BITCOIN_SPEND_THEIRS_DONE) else if (done == BITCOIN_SPEND_THEIRS_DONE)
assert(bitcoin_tx_is(effect->broadcast, "spend their commit")); assert(bitcoin_tx_is(tx, "spend their commit"));
else if (done == BITCOIN_SPEND_OURS_DONE) else if (done == BITCOIN_SPEND_OURS_DONE)
assert(bitcoin_tx_is(effect->broadcast, "spend our commit")); assert(bitcoin_tx_is(tx, "spend our commit"));
else else
errx(1, "Unknown watch effect %s", input_name(done)); errx(1, "Unknown watch effect %s", input_name(done));
add_event(&watch->events, done); add_event(&watch->events, done);

Loading…
Cancel
Save