Skip to content

Instantly share code, notes, and snippets.

@yuyaogawa
Created March 9, 2021 06:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save yuyaogawa/3d69bfa03b0702b8ff12c210bc795a6a to your computer and use it in GitHub Desktop.
Save yuyaogawa/3d69bfa03b0702b8ff12c210bc795a6a 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.

$lightning-cli fundchannel_start 02b861cc95a061d0536a2e6d96992274c284490bc1e3782d5b59004a2aba7767a7 200000
{
   "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}]'
{
  "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.

$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