LocalとK8SのLNDでhandshake

GKE上にデプロイしたLNDとローカルでconnectionを実施してみる。
この際に用いるコンテナはgithubにV0.1としてアップしている。

立ち上げ

空のクラスタを作成する。

gcloud container clusters create lnd-simnet --machine-type=n1-standard-1 --num-nodes=3 --region asia-northeast1-a  
gcloud container clusters describe lnd-simnet  

今後のローカルでのkubectlとの連携のために、credentialを渡す。

$ gcloud container clusters get-credentials lnd-simnet --zone asia-northeast1-a
Fetching cluster endpoint and auth data.  
kubeconfig entry generated for test-cluster.  
$ kubectl config get-contexts

Container Registry を認証するには、gcloud を Docker 認証ヘルパーとして使用する。

gcloud auth configure-docker  

これができたら、imageをbuildし、gcrにpushする。 ホスト名と Google Cloud Platform Console のプロジェクト ID とイメージ名を組み合わせたものを指定する必要がある。

[HOSTNAME]/[PROJECT-ID]/[IMAGE]

docker build . -t  gcr.io/<PROJECT_NAME>/lnd:latest  
docker build . -t  gcr.io/<PROJECT_NAME>/btcd:latest  

続いて、このイメージをGCRにプッシュする。

docker push gcr.io/<PROJECT_NAME>/btcd:latest  
docker push gcr.io/<PROJECT_NAME>/lnd:latest  

コマンドでも可。

gcloud container images list  

設定ファイルを対象にして、applyする。

$ kubectl apply -f StatefulSet.yaml --record
$ kubectl apply -f service.yaml --record

ここで、実際にコンテナに入り、立ち上げ作業を行う。

kubectl exec -it lnd-btcd-0 -c lnd bash                                                                                                                2019/10/18 8:51:10 +[master]  
bash-5.0# lncli unlock  
Input wallet password: 

lnd successfully unlocked!  
bash-5.0 lncli --network=simnet getinfo  
{
    "version": "0.7.1-beta commit=v0.7.1-beta-357-gfa063dd45c7db492e23cbe3da3ea9282e342664b",
    "identity_pubkey": "xxx",
    "alias": "03a511bf928935dc410e",
    "color": "#3399ff",
    "num_pending_channels": 0,
    "num_active_channels": 0,
    "num_inactive_channels": 0,
    "num_peers": 0,
    "block_height": 0,
    "block_hash": "683e86bd5c6d110d91b94b97137ba6bfe02dbbdb8e3dff722a669b5d69d77af6",
    "best_header_timestamp": 1401292357,
    "synced_to_chain": false,
    "synced_to_graph": false,
    "testnet": false,
    "chains": [
        {
            "chain": "bitcoin",
            "network": "simnet"
        }
    ],
    "uris": null
}

ここで表示されたidentity_pubkeyに接続する。 portが開放されていることの確認はnetstatで可能。

bash-5.0# netstat -an  
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State  
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN  
tcp        0      0 0.0.0.0:10009           0.0.0.0:*               LISTEN  

サービスのIPは下記で確認する。

~/G/s/LND_container ❯❯❯ kubectl get service                                                                                                                                    2019/10/18 8:54:56 +[master]
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE  

ローカル

まず、せっかくなので自分で作ったnode.js製noise protocolツール、noise streamで接続を行う。

mkdir noise  
cd noise  
touch main.js  
npm i @bruwbird/noise_stream  

main.jsを下記の用に編集する。

const NoiseStream = require('@bruwbird/noise_stream');  
const net = require('net');  
const secp256k1 = require('bcrypto/lib/secp256k1');

const priv = secp256k1.privateKeyGenerate();  
const stream = new NoiseStream();  
const socket = net.connect({ port: 9735, host: "x.x.x.x" });

stream.connect(  
    socket,
    Buffer.from(priv, 'hex'),
    Buffer.from("xxxx", 'hex')
);

stream.on('connect', () => {  
    console.log("connected!")
})

これを実行すると、コネクションを確立できる。

~/D/noise ❯❯❯ node main.js                                                                                                                                                              2019/10/18 9:49:21 
connected!  

docker composeで同じコンテナでも実施可能。

docker-compose run -d --name alice lnd-btc                                                                                                             2019/10/18 8:46:51 +[master]  
Starting btcd ... done  
bash-5.0# lncli --network=simnet connect xxxx@x.x.x.x  
{

}
bash-5.0# lncli --network=simnet listpeers  
{
    "peers": [
        {
            "pub_key": "xxxx",
            "address": "x.x.x.x:9735",
            "bytes_sent": "139",
            "bytes_recv": "139",
            "sat_sent": "0",
            "sat_recv": "0",
            "inbound": false,
            "ping_time": "0",
            "sync_type": "ACTIVE_SYNC"
        }
    ]
}

K8S側で確認すると、接続を確認できる。

lncli --network=simnet listpeers  
{
    "peers": [
        {
            "pub_key": "x.x.x.x",
            "address": "x.x.x.x:xxxx",
            "bytes_sent": "1683",
            "bytes_recv": "1683",
            "sat_sent": "0",
            "sat_recv": "0",
            "inbound": true,
            "ping_time": "6026",
            "sync_type": "ACTIVE_SYNC"
        }
    ]
}

接続される側なので、"inbound": trueとなっている。