From pm+lists at acinq.fr Fri Aug 28 16:55:31 2015 From: pm+lists at acinq.fr (Pierre) Date: Fri, 28 Aug 2015 18:55:31 +0200 Subject: [Lightning-dev] A state machine. In-Reply-To: <877fopi4un.fsf@rustcorp.com.au> References: <87si7eiehg.fsf@rustcorp.com.au> <87h9ntifwf.fsf@rustcorp.com.au> <877fopi4un.fsf@rustcorp.com.au> Message-ID: Thanks, this helps a lot ! I have more questions after reviewing your new branch 'state', if you have time for that ;-) 1) In PKT_UPDATE_ADD_HTLC, why is the field amount an int32 and not an uint32 ? the value shouldn't be negative right ? 2) For a given payee, is the (simplified) htlc flow always : A->B PKT_UPDATE_ADD_HTLC B->A PKT_UPDATE_COMPLETE_HTLC A->B PKT_UPDATE_ADD_HTLC B->A PKT_UPDATE_COMPLETE_HTLC ? can we have two successive PKT_UPDATE_ADD_HTLC with the same H, the latter updating the former ? and then a single completion ? 3) Since an htlc is completed with a PKT_UPDATE_COMPLETE_HTLC, what is the use case of PKT_UPDATE ? 4) Why is there no PKT_UPDATE_DECLINE ? 5) I understand the High/Low priorities are a way of resolving conflicts, but I don't get how it works. Could you please explain the principle of it ? 6) In a closing by mutual consent, who is supposed to publish the final transaction ? 7) How do we manage the fees ? Thanks, Pierre 2015-08-21 7:32 GMT+02:00 Rusty Russell : > Rusty Russell writes: > > Yeah. Let me generate a decent text flowchart for the normal cases... > > I've taken out some transitions for simplicity (eg. ERR_ANCHOR_LOST and > ERR_INFORMATION_LEAK, which shouldn't happen): > > Normal opening states: > > INIT_NOANCHOR: > INPUT_NONE -> OPEN_WAIT_FOR_OPEN_NOANCHOR (=>PKT_OPEN) > INIT_WITHANCHOR: > INPUT_NONE -> OPEN_WAIT_FOR_OPEN_WITHANCHOR (=>PKT_OPEN) > OPEN_WAIT_FOR_OPEN_NOANCHOR: > PKT_OPEN -> OPEN_WAIT_FOR_ANCHOR > CMD_CLOSE -> CLOSED > OPEN_WAIT_FOR_OPEN_WITHANCHOR: > PKT_OPEN -> OPEN_WAIT_FOR_COMMIT_SIG (=>PKT_OPEN_ANCHOR) > CMD_CLOSE -> CLOSED > OPEN_WAIT_FOR_ANCHOR: > PKT_OPEN_ANCHOR -> OPEN_WAITING_THEIRANCHOR (=>PKT_OPEN_COMMIT_SIG) > CMD_CLOSE -> CLOSED > OPEN_WAIT_FOR_COMMIT_SIG: > PKT_OPEN_COMMIT_SIG -> OPEN_WAITING_OURANCHOR > CMD_CLOSE -> CLOSED > OPEN_WAITING_OURANCHOR: > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > BITCOIN_ANCHOR_DEPTHOK -> OPEN_WAIT_FOR_COMPLETE_OURANCHOR > (=>PKT_OPEN_COMPLETE) > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > OPEN_WAITING_THEIRANCHOR: > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_DEPTHOK -> OPEN_WAIT_FOR_COMPLETE_THEIRANCHOR > (=>PKT_OPEN_COMPLETE) > BITCOIN_ANCHOR_TIMEOUT -> ERR_ANCHOR_TIMEOUT (=>PKT_ERROR) > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > > OPEN_WAIT_FOR_COMPLETE_OURANCHOR: > PKT_OPEN_COMPLETE -> NORMAL_HIGHPRIO > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > > OPEN_WAIT_FOR_COMPLETE_THEIRANCHOR: > PKT_OPEN_COMPLETE -> NORMAL_LOWPRIO > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > > Operational state loop: > ====================== > I've folded high and low here, but we alternate. > > NORMAL_LOWPRIO: > NORMAL_HIGHPRIO: > PKT_UPDATE -> WAIT_FOR_UPDATE_SIG_LOWPRIO (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ADD_HTLC -> NORMAL_HIGHPRIO (=>PKT_UPDATE_DECLINE_HTLC) > PKT_UPDATE_ADD_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_COMPLETE_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_TIMEDOUT_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ROUTEFAIL_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > CMD_SEND_UPDATE -> WAIT_FOR_UPDATE_ACCEPT_LOWPRIO (=>PKT_UPDATE) > CMD_SEND_HTLC_UPDATE -> WAIT_FOR_HTLC_ACCEPT_LOWPRIO > (=>PKT_UPDATE_ADD_HTLC) > CMD_SEND_HTLC_COMPLETE -> WAIT_FOR_HTLC_ACCEPT_LOWPRIO > (=>PKT_UPDATE_COMPLETE_HTLC) > CMD_SEND_HTLC_TIMEDOUT -> WAIT_FOR_HTLC_ACCEPT_LOWPRIO > (=>PKT_UPDATE_TIMEDOUT_HTLC) > CMD_SEND_HTLC_ROUTEFAIL -> WAIT_FOR_HTLC_ACCEPT_LOWPRIO > (=>PKT_UPDATE_ROUTEFAIL_HTLC) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > > WAIT_FOR_HTLC_ACCEPT_LOWPRIO: > WAIT_FOR_HTLC_ACCEPT_HIGHPRIO: > PKT_UPDATE -> WAIT_FOR_UPDATE_SIG_LOWPRIO (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ADD_HTLC -> NORMAL_HIGHPRIO (=>PKT_UPDATE_DECLINE_HTLC) > PKT_UPDATE_ADD_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ACCEPT -> WAIT_FOR_UPDATE_COMPLETE_LOWPRIO > (=>PKT_UPDATE_SIGNATURE) > PKT_UPDATE_DECLINE_HTLC -> NORMAL_HIGHPRIO > PKT_UPDATE_COMPLETE_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_TIMEDOUT_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ROUTEFAIL_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > WAIT_FOR_HTLC_ACCEPT_HIGHPRIO: > PKT_UPDATE_ACCEPT -> WAIT_FOR_UPDATE_COMPLETE_HIGHPRIO > (=>PKT_UPDATE_SIGNATURE) > PKT_UPDATE_DECLINE_HTLC -> NORMAL_LOWPRIO > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > > WAIT_FOR_UPDATE_ACCEPT_LOWPRIO: > WAIT_FOR_UPDATE_ACCEPT_HIGHPRIO: > PKT_UPDATE -> WAIT_FOR_UPDATE_SIG_LOWPRIO (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ADD_HTLC -> NORMAL_HIGHPRIO (=>PKT_UPDATE_DECLINE_HTLC) > PKT_UPDATE_ADD_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ACCEPT -> WAIT_FOR_UPDATE_COMPLETE_LOWPRIO > (=>PKT_UPDATE_SIGNATURE) > PKT_UPDATE_COMPLETE_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_TIMEDOUT_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_UPDATE_ROUTEFAIL_HTLC -> WAIT_FOR_UPDATE_SIG_LOWPRIO > (=>PKT_UPDATE_ACCEPT) > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > > WAIT_FOR_UPDATE_COMPLETE_LOWPRIO: > WAIT_FOR_UPDATE_COMPLETE_HIGHPRIO: > PKT_UPDATE_COMPLETE -> NORMAL_HIGHPRIO > PKT_CLOSE -> WAIT_FOR_CLOSE_ACK (=>PKT_CLOSE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > > WAIT_FOR_UPDATE_SIG_LOWPRIO: > PKT_UPDATE_SIGNATURE -> NORMAL_HIGHPRIO (=>PKT_UPDATE_COMPLETE) > ... > WAIT_FOR_UPDATE_SIG_HIGHPRIO: > PKT_UPDATE_SIGNATURE -> NORMAL_LOWPRIO (=>PKT_UPDATE_COMPLETE) > PKT_ERROR -> CLOSE_WAIT_OURCOMMIT > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM (=>PKT_ERROR) > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL (=>PKT_ERROR) > CMD_CLOSE -> WAIT_FOR_CLOSE_COMPLETE (=>PKT_CLOSE) > > Normal closing: > ============== > > WAIT_FOR_CLOSE_COMPLETE: > PKT_CLOSE -> CLOSE_WAIT_CLOSE (=>PKT_CLOSE_ACK) > PKT_CLOSE_COMPLETE -> CLOSE_WAIT_CLOSE (=>PKT_CLOSE_ACK) > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_CLOSE > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_CLOSE > BITCOIN_CLOSE_DONE -> CLOSED > INPUT_CLOSE_COMPLETE_TIMEOUT -> CLOSE_WAIT_CLOSE_OURCOMMIT > (=>PKT_ERROR) > WAIT_FOR_CLOSE_ACK: > PKT_CLOSE_ACK -> CLOSE_WAIT_CLOSE > PKT_ERROR -> CLOSE_WAIT_CLOSE > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_CLOSE > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_CLOSE > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_CLOSE: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_CLOSE > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_CLOSE > BITCOIN_CLOSE_DONE -> CLOSED > > Weird close states > ================== > Eg. steal transction, unilateral close, combinations thereof: > > CLOSE_WAIT_STEAL: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM: > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM: > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_STEAL_CLOSE: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM_CLOSE: > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE: > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> CLOSE_WAIT_SPENDOURS > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_OURCOMMIT > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_OURCOMMIT > CLOSE_WAIT_STEAL_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> CLOSE_WAIT_STEAL_SPENDOURS > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> > CLOSE_WAIT_SPENDTHEM_SPENDOURS > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> > CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_CLOSE_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> CLOSE_WAIT_CLOSE_SPENDOURS > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_CLOSE_OURCOMMIT > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_CLOSE_OURCOMMIT > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_STEAL_CLOSE_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> > CLOSE_WAIT_STEAL_CLOSE_SPENDOURS > BITCOIN_ANCHOR_THEIRSPEND -> > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM_CLOSE_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> > CLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS > BITCOIN_ANCHOR_OTHERSPEND -> > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT: > BITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -> > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_SPENDOURS: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_SPENDOURS > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_SPENDOURS > BITCOIN_SPEND_OURS_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDOURS: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM_SPENDOURS: > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_SPEND_OURS_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS: > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > CLOSE_WAIT_CLOSE_SPENDOURS: > BITCOIN_ANCHOR_THEIRSPEND -> CLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS > BITCOIN_ANCHOR_OTHERSPEND -> CLOSE_WAIT_STEAL_CLOSE_SPENDOURS > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_STEAL_CLOSE_SPENDOURS: > BITCOIN_ANCHOR_THEIRSPEND -> > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS: > BITCOIN_ANCHOR_OTHERSPEND -> > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS: > BITCOIN_SPEND_THEIRS_DONE -> CLOSED > BITCOIN_SPEND_OURS_DONE -> CLOSED > BITCOIN_STEAL_DONE -> CLOSED > BITCOIN_CLOSE_DONE -> CLOSED > -------------- next part -------------- An HTML attachment was scrubbed... URL: