From ba9df99770067b36a68198a77f7f0ebb1ea9bafc Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 29 Jun 2016 06:49:20 +0930 Subject: [PATCH] daemon: wire in payment. This actually uses the accept-payment data to make payments. Signed-off-by: Rusty Russell --- daemon/peer.c | 40 ++++++++++++++++++++++++++++++++++++++++ daemon/test/test.sh | 32 ++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/daemon/peer.c b/daemon/peer.c index 063b22625..8403c3898 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -10,6 +10,7 @@ #include "lightningd.h" #include "log.h" #include "names.h" +#include "payment.h" #include "peer.h" #include "permute_tx.h" #include "protobuf_convert.h" @@ -2167,6 +2168,7 @@ void peer_both_committed_to(struct peer *peer, { size_t i, n = tal_count(changes); + /* All this, simply for debugging. */ for (i = 0; i < n; i++) { u64 htlc_id; const char *type, *owner; @@ -2213,6 +2215,44 @@ void peer_both_committed_to(struct peer *peer, log_debug(peer->log, "Both committed to %s of %s HTLC %"PRIu64, type, owner, htlc_id); } + + /* We actually only respond to changes they made. */ + if (side == OURS) + return; + + for (i = 0; i < n; i++) { + struct payment *payment; + + switch (changes[i].type) { + case HTLC_ADD: + payment = find_payment(peer->dstate, &changes[i].add.htlc.rhash); + if (payment) { + if (changes[i].add.htlc.msatoshis != payment->msatoshis) { + log_unusual(peer->log, "Got payment for %"PRIu64 + " not %"PRIu64 " satoshi!", + changes[i].add.htlc.msatoshis, + payment->msatoshis); + command_htlc_fail(peer, + changes[i].add.htlc.id); + } else { + log_info(peer->log, + "Immediately resolving HTLC %"PRIu64, + changes[i].add.htlc.id); + command_htlc_fulfill(peer, + changes[i].add.htlc.id, + &payment->r); + } + } + /* FIXME: Otherwise, route. */ + break; + case HTLC_FULFILL: + /* FIXME: resolve_one_htlc(peer, id, preimage); */ + break; + case HTLC_FAIL: + /* FIXME: Route failure. */ + break; + } + } } /* Sets up the initial cstate and commit tx for both nodes: false if diff --git a/daemon/test/test.sh b/daemon/test/test.sh index 89a6e211d..dcfe53c7a 100755 --- a/daemon/test/test.sh +++ b/daemon/test/test.sh @@ -416,10 +416,6 @@ EXPIRY=$(( $(date +%s) + 1000)) SECRET=1de08917a61cb2b62ed5937d38577f6a7bfe59c176781c6d8128018e8b5ccdfd RHASH=`lcli1 dev-rhash $SECRET | sed 's/.*"\([0-9a-f]*\)".*/\1/'` -# Tell node2 about payment: hash should be the same. -RHASH2=`lcli2 accept-payment $HTLC_AMOUNT $SECRET | sed 's/.*"\([0-9a-f]*\)".*/\1/'` -[ "$RHASH" = "$RHASH2" ] - lcli1 newhtlc $ID2 $HTLC_AMOUNT $EXPIRY $RHASH if [ -n "$MANUALCOMMIT" ]; then @@ -724,6 +720,34 @@ A_AMOUNT=$(($A_AMOUNT - $HTLC_AMOUNT * 2)) B_AMOUNT=$(($B_AMOUNT + $HTLC_AMOUNT * 2)) check_status $A_AMOUNT $A_FEE "" $B_AMOUNT $B_FEE "" +# Now, use automatic payment redemption +RHASH3=`lcli2 accept-payment $HTLC_AMOUNT | sed 's/.*"\([0-9a-f]*\)".*/\1/'` + +lcli1 newhtlc $ID2 $HTLC_AMOUNT $EXPIRY $RHASH3 +[ ! -n "$MANUALCOMMIT" ] || lcli1 commit $ID2 +[ ! -n "$MANUALCOMMIT" ] || lcli2 commit $ID1 + +[ ! -n "$MANUALCOMMIT" ] || lcli2 commit $ID1 +[ ! -n "$MANUALCOMMIT" ] || lcli1 commit $ID2 + +# We transferred amount from A to B. +A_AMOUNT=$(($A_AMOUNT - $HTLC_AMOUNT)) +B_AMOUNT=$(($B_AMOUNT + $HTLC_AMOUNT)) +check_status $A_AMOUNT $A_FEE "" $B_AMOUNT $B_FEE "" + +# Now, failed payment (didn't pay enough) +RHASH4=`lcli2 accept-payment $HTLC_AMOUNT | sed 's/.*"\([0-9a-f]*\)".*/\1/'` + +lcli1 newhtlc $ID2 $(($HTLC_AMOUNT - 1)) $EXPIRY $RHASH4 +[ ! -n "$MANUALCOMMIT" ] || lcli1 commit $ID2 +[ ! -n "$MANUALCOMMIT" ] || lcli2 commit $ID1 + +[ ! -n "$MANUALCOMMIT" ] || lcli2 commit $ID1 +[ ! -n "$MANUALCOMMIT" ] || lcli1 commit $ID2 + +check lcli2 "getlog | $FGREP 'Got payment for '$(($HTLC_AMOUNT - 1))' not '$HTLC_AMOUNT" +check_status $A_AMOUNT $A_FEE "" $B_AMOUNT $B_FEE "" + lcli1 close $ID2 # They should be negotiating the close.