Skip to content

Instantly share code, notes, and snippets.

@namuyan
Forked from yuyaogawa/open-channel-with-psbt.md
Last active March 15, 2021 09:53
Show Gist options
  • Save namuyan/c8e11ffee771fc30ab4c265deffed4f9 to your computer and use it in GitHub Desktop.
Save namuyan/c8e11ffee771fc30ab4c265deffed4f9 to your computer and use it in GitHub Desktop.

Opening a channel by using a PSBT

This document describes how to open a channel with c-lightning by using a PSBT as the funding transaction for my learning. If you use lnd please go to here that is well documented. Also, here is the c-lightning offical document for each command that are shown below.

1. Start a funding process

fundchannel_start is a lower level RPC command that allows a user to initiate channel establishment with a connected peer. Assume my node is already connected to 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7. Below the command returns the funding_address and the scriptpubkey for the channel funding output with 200000 sats(=0.002btc).

$lightning-cli fundchannel_start 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7 0.002btc
{
   "funding_address": "tb1qt4dptguzw8x37eyj2vux6nzgsw9plr2k36hfkpn2q4g4huwn2s7qn7mle5",
   "scriptpubkey": "00205d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c"
}

2. Create a PSBT

In this example I use bitcoind to create a psbt. Any kind of wallets that support psbt would work as well. To create a funding psbt, copy and paste the funding_address you obtained from the command above and execute the command as follows. It returns a psbt.

$bitcoin-cli walletcreatefundedpsbt [] '[{"tb1qt4dptguzw8x37eyj2vux6nzgsw9plr2k36hfkpn2q4g4huwn2s7qn7mle5":0.00200000}]' 0 '{"conf_target": 30}'
{
  "psbt": "cHNidP8BAH0CAAAAAdm2BuwAjQSz8GYHLSAPSbPqelX9EWQQSqNGKx26zjumAAAAAAD+////As96KwIAAAAAFgAU6Ek1f/tUxTxfZtekXauk39TsixdADQMAAAAAACIAIF1aFaOCcc0fZJJTOG1MSIOKH41Wjq6bBmoFUVvx01Q8AAAAAAABAH0CAAAAAT2puk++itvqayeJ+4qxx7BLMv3jvL/QCdKwPAzAV8U/AAAAAAD+////AqiILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmxBDQMAAAAAACIAIA1jAVaELf+zCHZJs4Ci0QSAQEkrypnRPtz/j+/FcCMzAAAAAAEBH6iILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmwiBgPvvXMmayUl0q1w91O1BYaDd9E23+k2fYEPP12Ux+a6uBCKPpeuAAAAgAEAAIAXAACAACICAxjIcIt7i2/gpsxwIr8lE3FhdzzlJWunYs9PW5dHUd5dEIo+l64AAACAAQAAgBkAAIAAAA==",
  "fee": 0.00000153,
  "changepos": 0
}

Sign the psbt as follows.

$bitcoin-cli walletprocesspsbt cHNidP8BAH0CAAAAAdm2BuwAjQSz8GYHLSAPSbPqelX9EWQQSqNGKx26zjumAAAAAAD+////As96KwIAAAAAFgAU6Ek1f/tUxTxfZtekXauk39TsixdADQMAAAAAACIAIF1aFaOCcc0fZJJTOG1MSIOKH41Wjq6bBmoFUVvx01Q8AAAAAAABAH0CAAAAAT2puk++itvqayeJ+4qxx7BLMv3jvL/QCdKwPAzAV8U/AAAAAAD+////AqiILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmxBDQMAAAAAACIAIA1jAVaELf+zCHZJs4Ci0QSAQEkrypnRPtz/j+/FcCMzAAAAAAEBH6iILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmwiBgPvvXMmayUl0q1w91O1BYaDd9E23+k2fYEPP12Ux+a6uBCKPpeuAAAAgAEAAIAXAACAACICAxjIcIt7i2/gpsxwIr8lE3FhdzzlJWunYs9PW5dHUd5dEIo+l64AAACAAQAAgBkAAIAAAA==
{
  "psbt": "cHNidP8BAH0CAAAAAdm2BuwAjQSz8GYHLSAPSbPqelX9EWQQSqNGKx26zjumAAAAAAD+////As96KwIAAAAAFgAU6Ek1f/tUxTxfZtekXauk39TsixdADQMAAAAAACIAIF1aFaOCcc0fZJJTOG1MSIOKH41Wjq6bBmoFUVvx01Q8AAAAAAABAH0CAAAAAT2puk++itvqayeJ+4qxx7BLMv3jvL/QCdKwPAzAV8U/AAAAAAD+////AqiILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmxBDQMAAAAAACIAIA1jAVaELf+zCHZJs4Ci0QSAQEkrypnRPtz/j+/FcCMzAAAAAAEBH6iILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmwBCGsCRzBEAiBr1iwjMgkYsQi1oAugl9CJBi0Rf4dWNOZq9o4qxUe1bAIgeegA6U0sYExHj87QdZLC0+ElFEJEGd2hgyYQqxW1MaABIQPvvXMmayUl0q1w91O1BYaDd9E23+k2fYEPP12Ux+a6uAAiAgMYyHCLe4tv4KbMcCK/JRNxYXc85SVrp2LPT1uXR1HeXRCKPpeuAAAAgAEAAIAZAACAAAA=",
  "complete": true
}

Finalize the inputs of the psbt and obtain a serialized transaction which can be broadcast.

!!! WARNING !!! DO NOT PUBLISH the finalized transaction yet until after channel establishment has been successfully completed.

$bitcoin-cli finalizepsbt cHNidP8BAH0CAAAAAdm2BuwAjQSz8GYHLSAPSbPqelX9EWQQSqNGKx26zjumAAAAAAD+////As96KwIAAAAAFgAU6Ek1f/tUxTxfZtekXauk39TsixdADQMAAAAAACIAIF1aFaOCcc0fZJJTOG1MSIOKH41Wjq6bBmoFUVvx01Q8AAAAAAABAH0CAAAAAT2puk++itvqayeJ+4qxx7BLMv3jvL/QCdKwPAzAV8U/AAAAAAD+////AqiILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmxBDQMAAAAAACIAIA1jAVaELf+zCHZJs4Ci0QSAQEkrypnRPtz/j+/FcCMzAAAAAAEBH6iILgIAAAAAFgAU5XLjruBCb++8zbFUAYl31bjYFmwBCGsCRzBEAiBr1iwjMgkYsQi1oAugl9CJBi0Rf4dWNOZq9o4qxUe1bAIgeegA6U0sYExHj87QdZLC0+ElFEJEGd2hgyYQqxW1MaABIQPvvXMmayUl0q1w91O1BYaDd9E23+k2fYEPP12Ux+a6uAAiAgMYyHCLe4tv4KbMcCK/JRNxYXc85SVrp2LPT1uXR1HeXRCKPpeuAAAAgAEAAIAZAACAAAA=
{
  "hex": "02000000000101d9b606ec008d04b3f066072d200f49b3ea7a55fd1164104aa3462b1dbace3ba60000000000feffffff02cf7a2b0200000000160014e849357ffb54c53c5f66d7a45daba4dfd4ec8b17400d0300000000002200205d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c0247304402206bd62c23320918b108b5a00ba097d089062d117f875634e66af68e2ac547b56c022079e800e94d2c604c478fced07592c2d3e12514424419dda1832610ab15b531a0012103efbd73266b2525d2ad70f753b505868377d136dfe9367d810f3f5d94c7e6bab800000000",
  "complete": true
}

Now you need to find a txid to complete a funding process. Obtain a txid and vout as follows.

$bitcoin-cli decoderawtransaction 02000000000101d9b606ec008d04b3f066072d200f49b3ea7a55fd1164104aa3462b1dbace3ba60000000000feffffff02cf7a2b0200000000160014e849357ffb54c53c5f66d7a45daba4dfd4ec8b17400d0300000000002200205d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c0247304402206bd62c23320918b108b5a00ba097d089062d117f875634e66af68e2ac547b56c022079e800e94d2c604c478fced07592c2d3e12514424419dda1832610ab15b531a0012103efbd73266b2525d2ad70f753b505868377d136dfe9367d810f3f5d94c7e6bab800000000
{
  "txid": "011d9a25f4f6066e30f1c75f4f33efe02677949e63834332fdcb407da01784df",
  "hash": "e4580eb88d9ed9e7c290dccdfbf2f73a665daf35ef216651f7987d5e7f62044e",
  "version": 2,
  "size": 234,
  "vsize": 153,
  "weight": 609,
  "locktime": 0,
  "vin": [
    {
      "txid": "a63bceba1d2b46a34a106411fd557aeab3490f202d0766f0b3048d00ec06b6d9",
      "vout": 0,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "txinwitness": [
        "304402206bd62c23320918b108b5a00ba097d089062d117f875634e66af68e2ac547b56c022079e800e94d2c604c478fced07592c2d3e12514424419dda1832610ab15b531a001",
        "03efbd73266b2525d2ad70f753b505868377d136dfe9367d810f3f5d94c7e6bab8"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.36403919,
      "n": 0,
      "scriptPubKey": {
        "asm": "0 e849357ffb54c53c5f66d7a45daba4dfd4ec8b17",
        "hex": "0014e849357ffb54c53c5f66d7a45daba4dfd4ec8b17",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1qapyn2llm2nznchmx67j9m2ayml2wezch63vuwu"
        ]
      }
    },
    {
      "value": 0.00200000,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 5d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c",
        "hex": "00205d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c",
        "reqSigs": 1,
        "type": "witness_v0_scripthash",
        "addresses": [
          "tb1qt4dptguzw8x37eyj2vux6nzgsw9plr2k36hfkpn2q4g4huwn2s7qn7mle5"
        ]
      }
    }
  ]
}

3. Complete a funding process

Set the peer id, txid and vout and then excute the command as follows. When you get errors like "Unknown peer" or "No channel funding in progress.", the peers disconnected by timeout.

$lightning-cli fundchannel_complete 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7 011d9a25f4f6066e30f1c75f4f33efe02677949e63834332fdcb407da01784df 1
{
   "channel_id": "df8417a07d40cbfd324383639e947726e0ef334f5fc7f1306e06f6f4259a1d00",
   "commitments_secured": true
}

4. Broadcast a funding transaction

Now that you can broadcast the funding transaction as follows.

$bitcoin-cli sendrawtransaction 02000000000101d9b606ec008d04b3f066072d200f49b3ea7a55fd1164104aa3462b1dbace3ba60000000000feffffff02cf7a2b0200000000160014e849357ffb54c53c5f66d7a45daba4dfd4ec8b17400d0300000000002200205d5a15a38271cd1f649253386d4c48838a1f8d568eae9b066a05515bf1d3543c0247304402206bd62c23320918b108b5a00ba097d089062d117f875634e66af68e2ac547b56c022079e800e94d2c604c478fced07592c2d3e12514424419dda1832610ab15b531a0012103efbd73266b2525d2ad70f753b505868377d136dfe9367d810f3f5d94c7e6bab800000000
011d9a25f4f6066e30f1c75f4f33efe02677949e63834332fdcb407da01784df

You can check the channel status as follows. Wait until the channel is opened.

$lightning-cli listpeers 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7
{
   "peers": [
      {
         "id": "02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7",
         "connected": true,
         "netaddr": [
            "212.24.106.109:9735"
         ],
         "features": "0aa2a1",
         "channels": [
            {
               "state": "CHANNELD_AWAITING_LOCKIN",
               "scratch_txid": "d5a27fa679bdb3d2063a0ac95a8a1a3771e0df239580f61fdafed55e126d5f70",
               "last_tx_fee": "183000msat",
               "feerate": {
                  "perkw": 253,
                  "perkb": 1012
               },
               "owner": "channeld",
               "channel_id": "df8417a07d40cbfd324383639e947726e0ef334f5fc7f1306e06f6f4259a1d00",
               "funding_txid": "011d9a25f4f6066e30f1c75f4f33efe02677949e63834332fdcb407da01784df",
               "close_to_addr": "tb1qvw5v9g93sphpqpvts5h7l2lu74svx7fvvdkczl",
               "close_to": "001463a8c2a0b1806e10058b852fefabfcf560c3792c",
               "private": false,
               "opener": "local",
               "closer": null,
               "features": [
                  "option_static_remotekey"
               ],
               "funding_allocation_msat": {
                  "02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7": 0,
                  "039c74062df59c7e0c92528ba068387eb99e43668ed42e1a2af58a557c6f019eb2": 200000000
               },
               "funding_msat": {
                  "02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7": "0msat",
                  "039c74062df59c7e0c92528ba068387eb99e43668ed42e1a2af58a557c6f019eb2": "200000000msat"
               },
               "msatoshi_to_us": 200000000,
               "to_us_msat": "200000000msat",
               "msatoshi_to_us_min": 200000000,
               "min_to_us_msat": "200000000msat",
               "msatoshi_to_us_max": 200000000,
               "max_to_us_msat": "200000000msat",
               "msatoshi_total": 200000000,
               "total_msat": "200000000msat",
               "fee_base_msat": "1msat",
               "fee_proportional_millionths": 10,
               "dust_limit_satoshis": 546,
               "dust_limit_msat": "546000msat",
               "max_htlc_value_in_flight_msat": 18446744073709551615,
               "max_total_htlc_in_msat": "18446744073709551615msat",
               "their_channel_reserve_satoshis": 2000,
               "their_reserve_msat": "2000000msat",
               "our_channel_reserve_satoshis": 2000,
               "our_reserve_msat": "2000000msat",
               "spendable_msatoshi": 197460000,
               "spendable_msat": "197460000msat",
               "receivable_msatoshi": 0,
               "receivable_msat": "0msat",
               "htlc_minimum_msat": 0,
               "minimum_htlc_in_msat": "0msat",
               "their_to_self_delay": 6,
               "our_to_self_delay": 144,
               "max_accepted_htlcs": 483,
               "state_changes": [],
               "status": [
                  "CHANNELD_AWAITING_LOCKIN:Funding needs 1 more confirmations for lockin."
               ],
               "in_payments_offered": 0,
               "in_msatoshi_offered": 0,
               "in_offered_msat": "0msat",
               "in_payments_fulfilled": 0,
               "in_msatoshi_fulfilled": 0,
               "in_fulfilled_msat": "0msat",
               "out_payments_offered": 0,
               "out_msatoshi_offered": 0,
               "out_offered_msat": "0msat",
               "out_payments_fulfilled": 0,
               "out_msatoshi_fulfilled": 0,
               "out_fulfilled_msat": "0msat",
               "htlcs": []
            }
         ]
      }
   ]
}

5. Make a payment

Once the transaction is confirmed and the channel is opened you can make a payment. You can use keysend if the peer supporteds it so that you do not have to ask the peer an invoice.

$lightning-cli keysend 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7 1000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment