Lightning Clientにおける人格

LNDHUBでは、redisを用いた一意のIDを各ユーザのメールアドレスに紐付けることによって、一つのLNDクライアントで多くのユーザをさばけるという形態を実現している。
なぜこんな形態になっているのか、LNDの仕組みから確認する。 結論から言えば、一つのクライアントにpeerは固有のもので、複数作れる構造になっていない。

LNDのpeer間の接続

これは、identity pubkeyとhostによって識別される。 下記で自分のpubkeyは確認できて、

lncli --network=testnet getinfo  
{
    "version": "0.5.2-99-beta commit=v0.5.1-beta-814-g2a652455aaea661b147b6adca0ff51edcd268508",
    "identity_pubkey": "026443cbf5d9915ab0ad1d710229a14823a96b3f643fb08c7ad4b875a4cee58ddb",
    "alias": "026443cbf5d9915ab0ad",
    "num_pending_channels": 0,
    "num_active_channels": 0,
    "num_inactive_channels": 0,
    "num_peers": 3,
    "block_height": 1483599,
    "block_hash": "00000000000000f058a0325b817372ae151985a475c5af0c43500743e34b07c1",
    "best_header_timestamp": 1551839165,
    "synced_to_chain": true,
    "testnet": true,
    "chains": [
        {
            "chain": "bitcoin",
            "network": "testnet"
        }
    ],
    "uris": null
}

こんな感じで接続される。

lncli connect [command options] <pubkey>@host  

このconnect自体はTCP connectionを使った確立で、pubkeyは、基本的には一つのLN clientで一つしか確立されない。

https://github.com/lightningnetwork/lnd/blob/master/lnwire/netaddress.go#L11

// NetAddress represents information pertaining to the identity and network
// reachability of a peer. Information stored includes the node's identity
// public key for establishing a confidential+authenticated connection, the
// service bits it supports, and a TCP address the node is reachable at.
//
// TODO(roasbeef): merge with LinkNode in some fashion
type NetAddress struct {  
    // IdentityKey is the long-term static public key for a node. This node is
    // used throughout the network as a node's identity key. It is used to
    // authenticate any data sent to the network on behalf of the node, and
    // additionally to establish a confidential+authenticated connection with
    // the node.
    IdentityKey *btcec.PublicKey

    // Address is the IP address and port of the node. This is left
    // general so that multiple implementations can be used.
    Address net.Addr

    // ChainNet is the Bitcoin network this node is associated with.
    // TODO(roasbeef): make a slice in the future for multi-chain
    ChainNet wire.BitcoinNet
}