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庫