Rusty Russell [ARCHIVE] on Nostr: 📅 Original date posted:2015-08-21 📝 Original message: Rusty Russell <rusty at ...
📅 Original date posted:2015-08-21
📝 Original message:
Rusty Russell <rusty at rustcorp.com.au> 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
Published at
2023-06-09 12:44:12Event JSON
{
"id": "34b00559528a8e6d11946081809f746353b8af5a068c5f960b75b76a74b2f403",
"pubkey": "13bd8c1c5e3b3508a07c92598647160b11ab0deef4c452098e223e443c1ca425",
"created_at": 1686314652,
"kind": 1,
"tags": [
[
"e",
"411039e29beedd756d6465ad4673665a870719132c14b04854b4a23ce0f88d89",
"",
"root"
],
[
"e",
"1cc37e02f680a78682c1c47eca05e82a0eb995d3da6b90b7df777be5ab8742d7",
"",
"reply"
],
[
"p",
"13bd8c1c5e3b3508a07c92598647160b11ab0deef4c452098e223e443c1ca425"
]
],
"content": "📅 Original date posted:2015-08-21\n📝 Original message:\nRusty Russell \u003crusty at rustcorp.com.au\u003e writes:\n\u003e Yeah. Let me generate a decent text flowchart for the normal cases...\n\nI've taken out some transitions for simplicity (eg. ERR_ANCHOR_LOST and\nERR_INFORMATION_LEAK, which shouldn't happen):\n\nNormal opening states:\n\nINIT_NOANCHOR:\n\tINPUT_NONE -\u003e OPEN_WAIT_FOR_OPEN_NOANCHOR (=\u003ePKT_OPEN)\nINIT_WITHANCHOR:\n\tINPUT_NONE -\u003e OPEN_WAIT_FOR_OPEN_WITHANCHOR (=\u003ePKT_OPEN)\nOPEN_WAIT_FOR_OPEN_NOANCHOR:\n\tPKT_OPEN -\u003e OPEN_WAIT_FOR_ANCHOR\n\tCMD_CLOSE -\u003e CLOSED\nOPEN_WAIT_FOR_OPEN_WITHANCHOR:\n\tPKT_OPEN -\u003e OPEN_WAIT_FOR_COMMIT_SIG (=\u003ePKT_OPEN_ANCHOR)\n\tCMD_CLOSE -\u003e CLOSED\nOPEN_WAIT_FOR_ANCHOR:\n\tPKT_OPEN_ANCHOR -\u003e OPEN_WAITING_THEIRANCHOR (=\u003ePKT_OPEN_COMMIT_SIG)\n\tCMD_CLOSE -\u003e CLOSED\nOPEN_WAIT_FOR_COMMIT_SIG:\n\tPKT_OPEN_COMMIT_SIG -\u003e OPEN_WAITING_OURANCHOR\n\tCMD_CLOSE -\u003e CLOSED\nOPEN_WAITING_OURANCHOR:\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tBITCOIN_ANCHOR_DEPTHOK -\u003e OPEN_WAIT_FOR_COMPLETE_OURANCHOR (=\u003ePKT_OPEN_COMPLETE)\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\nOPEN_WAITING_THEIRANCHOR:\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_DEPTHOK -\u003e OPEN_WAIT_FOR_COMPLETE_THEIRANCHOR (=\u003ePKT_OPEN_COMPLETE)\n\tBITCOIN_ANCHOR_TIMEOUT -\u003e ERR_ANCHOR_TIMEOUT (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\n\nOPEN_WAIT_FOR_COMPLETE_OURANCHOR:\n\tPKT_OPEN_COMPLETE -\u003e NORMAL_HIGHPRIO\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\n\nOPEN_WAIT_FOR_COMPLETE_THEIRANCHOR:\n\tPKT_OPEN_COMPLETE -\u003e NORMAL_LOWPRIO\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\n\nOperational state loop:\n======================\nI've folded high and low here, but we alternate.\n\nNORMAL_LOWPRIO:\nNORMAL_HIGHPRIO:\n\tPKT_UPDATE -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ADD_HTLC -\u003e NORMAL_HIGHPRIO (=\u003ePKT_UPDATE_DECLINE_HTLC)\n\tPKT_UPDATE_ADD_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_COMPLETE_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_TIMEDOUT_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ROUTEFAIL_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\n\tCMD_SEND_UPDATE -\u003e WAIT_FOR_UPDATE_ACCEPT_LOWPRIO (=\u003ePKT_UPDATE)\n\tCMD_SEND_HTLC_UPDATE -\u003e WAIT_FOR_HTLC_ACCEPT_LOWPRIO (=\u003ePKT_UPDATE_ADD_HTLC)\n\tCMD_SEND_HTLC_COMPLETE -\u003e WAIT_FOR_HTLC_ACCEPT_LOWPRIO (=\u003ePKT_UPDATE_COMPLETE_HTLC)\n\tCMD_SEND_HTLC_TIMEDOUT -\u003e WAIT_FOR_HTLC_ACCEPT_LOWPRIO (=\u003ePKT_UPDATE_TIMEDOUT_HTLC)\n\tCMD_SEND_HTLC_ROUTEFAIL -\u003e WAIT_FOR_HTLC_ACCEPT_LOWPRIO (=\u003ePKT_UPDATE_ROUTEFAIL_HTLC)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\n\nWAIT_FOR_HTLC_ACCEPT_LOWPRIO:\nWAIT_FOR_HTLC_ACCEPT_HIGHPRIO:\n\tPKT_UPDATE -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ADD_HTLC -\u003e NORMAL_HIGHPRIO (=\u003ePKT_UPDATE_DECLINE_HTLC)\n\tPKT_UPDATE_ADD_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ACCEPT -\u003e WAIT_FOR_UPDATE_COMPLETE_LOWPRIO (=\u003ePKT_UPDATE_SIGNATURE)\n\tPKT_UPDATE_DECLINE_HTLC -\u003e NORMAL_HIGHPRIO\n\tPKT_UPDATE_COMPLETE_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_TIMEDOUT_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ROUTEFAIL_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\nWAIT_FOR_HTLC_ACCEPT_HIGHPRIO:\n\tPKT_UPDATE_ACCEPT -\u003e WAIT_FOR_UPDATE_COMPLETE_HIGHPRIO (=\u003ePKT_UPDATE_SIGNATURE)\n\tPKT_UPDATE_DECLINE_HTLC -\u003e NORMAL_LOWPRIO\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\n\nWAIT_FOR_UPDATE_ACCEPT_LOWPRIO:\nWAIT_FOR_UPDATE_ACCEPT_HIGHPRIO:\n\tPKT_UPDATE -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ADD_HTLC -\u003e NORMAL_HIGHPRIO (=\u003ePKT_UPDATE_DECLINE_HTLC)\n\tPKT_UPDATE_ADD_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ACCEPT -\u003e WAIT_FOR_UPDATE_COMPLETE_LOWPRIO (=\u003ePKT_UPDATE_SIGNATURE)\n\tPKT_UPDATE_COMPLETE_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_TIMEDOUT_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_UPDATE_ROUTEFAIL_HTLC -\u003e WAIT_FOR_UPDATE_SIG_LOWPRIO (=\u003ePKT_UPDATE_ACCEPT)\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\n\nWAIT_FOR_UPDATE_COMPLETE_LOWPRIO:\nWAIT_FOR_UPDATE_COMPLETE_HIGHPRIO:\n\tPKT_UPDATE_COMPLETE -\u003e NORMAL_HIGHPRIO\n\tPKT_CLOSE -\u003e WAIT_FOR_CLOSE_ACK (=\u003ePKT_CLOSE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\n\nWAIT_FOR_UPDATE_SIG_LOWPRIO:\n\tPKT_UPDATE_SIGNATURE -\u003e NORMAL_HIGHPRIO (=\u003ePKT_UPDATE_COMPLETE)\n ...\nWAIT_FOR_UPDATE_SIG_HIGHPRIO:\n\tPKT_UPDATE_SIGNATURE -\u003e NORMAL_LOWPRIO (=\u003ePKT_UPDATE_COMPLETE)\n\tPKT_ERROR -\u003e CLOSE_WAIT_OURCOMMIT\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM (=\u003ePKT_ERROR)\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL (=\u003ePKT_ERROR)\n\tCMD_CLOSE -\u003e WAIT_FOR_CLOSE_COMPLETE (=\u003ePKT_CLOSE)\n\nNormal closing:\n==============\n\nWAIT_FOR_CLOSE_COMPLETE:\n\tPKT_CLOSE -\u003e CLOSE_WAIT_CLOSE (=\u003ePKT_CLOSE_ACK)\n\tPKT_CLOSE_COMPLETE -\u003e CLOSE_WAIT_CLOSE (=\u003ePKT_CLOSE_ACK)\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_CLOSE\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\n\tINPUT_CLOSE_COMPLETE_TIMEOUT -\u003e CLOSE_WAIT_CLOSE_OURCOMMIT (=\u003ePKT_ERROR)\nWAIT_FOR_CLOSE_ACK:\n\tPKT_CLOSE_ACK -\u003e CLOSE_WAIT_CLOSE\n\tPKT_ERROR -\u003e CLOSE_WAIT_CLOSE\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_CLOSE\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_CLOSE:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_CLOSE\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\n\nWeird close states\n==================\nEg. steal transction, unilateral close, combinations thereof:\n \nCLOSE_WAIT_STEAL:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM:\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM:\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_CLOSE:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM_CLOSE:\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM_CLOSE:\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_SPENDOURS\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_OURCOMMIT\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_OURCOMMIT\nCLOSE_WAIT_STEAL_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_STEAL_SPENDOURS\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_SPENDTHEM_SPENDOURS\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_CLOSE_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_CLOSE_SPENDOURS\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE_OURCOMMIT\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_CLOSE_OURCOMMIT\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_CLOSE_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_STEAL_CLOSE_SPENDOURS\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM_CLOSE_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_OURCOMMIT:\n\tBITCOIN_ANCHOR_OURCOMMIT_DELAYPASSED -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDOURS:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_SPENDOURS\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDOURS\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDOURS:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM_SPENDOURS:\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM_SPENDOURS:\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\nCLOSE_WAIT_CLOSE_SPENDOURS:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_CLOSE_SPENDOURS\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_CLOSE_SPENDOURS:\n\tBITCOIN_ANCHOR_THEIRSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_SPENDTHEM_CLOSE_SPENDOURS:\n\tBITCOIN_ANCHOR_OTHERSPEND -\u003e CLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED\nCLOSE_WAIT_STEAL_SPENDTHEM_CLOSE_SPENDOURS:\n\tBITCOIN_SPEND_THEIRS_DONE -\u003e CLOSED\n\tBITCOIN_SPEND_OURS_DONE -\u003e CLOSED\n\tBITCOIN_STEAL_DONE -\u003e CLOSED\n\tBITCOIN_CLOSE_DONE -\u003e CLOSED",
"sig": "0c159235144e5f6b632c08747102f479689fab397a4936e6637865cf4b0f4d1516514ad8487c30f753037852af406dd0a2ba2feb2776062474aefa20c37e57d8"
}