当前位置: 首页 > 工具软件 > lightning-rfc > 使用案例 >

c-lightning的代码结构

谢高峯
2023-12-01


https://github.com/lightningnetwork/lightning-rfc/blob/master/00-introduction.md
BOLT#1:基本协议
BOLT#2:通道管理的对等协议
BOLT#3:比特币交易和脚本格式
BOLT#4:洋葱路由协议
BOLT#5:对链式交易处理的建议
BOLT#7:P2P节点和频道发现
BOLT#8:加密和认证传输
BOLT#9:分配的功能标志
BOLT#10:DNS引导程序和辅助节点位置
BOLT#11:闪电付款的发票协议

c-lightning
主要模块:lightningd   hsmd common connectd gossipd channeld  cli closingd  openingd  wallet wire 
大多数以独立进程存在:
    (https://www.8btc.com/article/226278)
    将c-lightning的功能分散到几个守护进程中不仅及大地提高了灵活性,也提高了节点的安全性,因为攻击者无法直接与任何接触私钥
    的部分进行直接的操作。每个子系统独立地验证内部状态的一致性,如果发现不一致,则会切断该同伴节点的连接并终止进程。这个
    多守护进程的架构同样使得用户能够使用Docker、SELinux以及AppArmor来指定每个守护进程能够接触到哪些信息以及能够进行哪些功能。
lightningd:
    主要进程,会调启动其它进程
hsmd: <保存秘钥>
                管理所有与加密材料相关的运营,并控制通道中的资金。这是唯一一个能够接触节点的私钥的子系统,这意味着其他子系统并不拥有任
    何私密信息,如果要签名或者解密任何东西的话,就必须要通过hsmd守护进程。通过这种方式来把加密运营中心化可以降低需要被安全
    保护的表面,并开放一系列有趣的应用。默认的hsmd设置通过分离过程已经能够提供很高的安全性能了,还能通过操作系统级别的安全
    来进一步提供保障,如SELinux以及AppArmor。但是这可以轻易用另一个设置来替代,这个设置能够与物理的硬件加密模块。替换hsmd
    设置可以让运营更加无人化,比如说,在家里运行一个c-lightning节点,用一个配对的手机应用来管理私钥、开启交易或者创建收据。
common: 
    公共代码库,可以被多个功能模块调用
connectd:<接收和制作TCP连接>
                设置连接守护进程:这管理接收和制作TCP连接。它需要与gossip守护进程获取通过node_announcement消息)公众节点的地址,
    所以connectd_init把它的一端交给它套接字对,并给我们其他
gossipd:
    管理网络的本地视图,负责寻找一笔交易从其源头到目的地的路径。默认设置会试图寻找在费用、超时和稳定性方面都比较平衡的路径,
    还会从一组备选路径中随机选择一个,修改数量和超时来隐藏该交易的真正目的地。如果用户有特定的路径需求或者想要制定一些特定
    的路径政策,如总是选择超时最低或者费用最低的路径的话,默认设置也很容易修改。
onchaind:
    *〜“onchaind”是一个愚蠢的守护进程,试图让我们的资金回来:它不处理重组,但它是幂等的,所以我们可以只需在链条移动时重新启动它。
    同样,我们重播它重启时从数据库链事件开始“资金交易花费”事件创造它。

 lightningd启动的进程
     1) lightning_channeld
     2) lightning_closingd
     3) lightning_connectd
     4) lightning_gossipd
     5) lightning_hsmd
     6) lightning_onchaind
     7) lightning_openingd
    8) lightningd

lightningd中main函数启动流程:
       setup_locale -> setup_sig_handlers -> check_linked_library_versions -> daemon_setup -> new_lightningd ->register_opts-> handle_early_opts -> plugins_init ->handle_opts->test_subdaemons->wallet_new->io_poll_override->
       ->hsm_init ->setup_color_and_alias
       ->connectd_init
       ->gossip_init->db_begin_transaction->wallet_network_check->init_txfilter->wallet_invoice_autoclean->load_channels_from_wallet->wallet_blocks_heights->db_commit_transaction
       ->setup_topology【初始化块拓扑,设置】->jsonrpc_listen->plugins_config 
      ->connectd_activate //在chaintopology之后
      ->onchaind_replay_channels
      ->activate_peers
      ->shutdown_subdaemons->tal_free->clean_tmpctx->tal_free->opt_free_table->daemon_shutdown
      
      ->begin_topology
  
闪电网络中各个进程间通信用的是本地套接字即AF_UNIX.

rpc 只能监听本地机器的连接 jsonrpc_listen  socket(AF_UNIX, SOCK_STREAM, 0);    

闪电网络使用的秘钥: 
    使用BIP32(又名“HD钱包”)从单个种子生成密钥
                用到了libwally库

 类似资料: