ブロックチェーン業界にインターンとして参加した話

初めまして.株式会社Next Finance Techで10月後半よりインターン生としてリサーチ業務に携わっている,宮本と申します.

普段は電気システムや情報通信システムなどを学んでいる大学生です.

今回はインターンに参加してからの備忘録としてやったことの振り返り記事です.私がブロックチェーンやLightning Network(LN)について学んだ軌跡とLNのネットワークに参加した体験記などが主な内容です.

きっかけ

  ブロックチェーンに興味を持ったきっかけは,Youtubeで「ブロックチェーン時代の認証(rmanzoku)-builderscon tokyo 2019」を見て,ゲームに経済性を与える技術という文言に惹かれブロックチェーンに興味を持ちました.それからはブロックチェーンの基礎を学ぶのも兼ねて簡易的なブロックチェーンを作ったりして遊んでいました.
  そういった経緯もあり,ブロックチェーンに関わっている企業でインターンしたいなと思っており,まだ何の実績もない私を快く受け入れてくれた株式会社Next Finance Techでインターンさせていただくこととなりました.

インターンの内容

10/18 ~ 10/20 Mastering Bitcoinを読み,ブロックチェーンの基礎を学ぶ

  最初は「Mastering Bitcoin」を読み,ブロックチェーンとは何ぞというのを学びました.ブロックチェーンと聞くと「あぁ,仮想通貨のことね」となる方もいますが,ブロックチェーンとは分散型台帳という技術基盤のことを指し仮想通貨とは別の意味です.しかし,ブロックチェーンはビットコイン(BTC)開発の過程で生まれたこともあり,説明では切っても切り離せない関係にあります.

  個人的なブロックチェーンを学ぶ上で重要なポイントは,Bitcoinの所有権とやり取りについてとネットワーク構造,コンセンサス形成についてだと思っています.以下に軽く備忘録としてまとめておきます.

・Bitcoinの所有権とやり取りについて
  Bitcoinの所有権とは,未使用のトランザクション(UTXO)の所有する権利のことを意味します.もっと詳しく説明すると,Bitcoinの取引というのはトランザクション(Tx)と言われる小切手のようなもので行われ,Txはインプット(資金源)とアウトプット(送り先)で構成されています.UTXOとは,アウトプットが記録されていないTxのことになります.

  次にやり取りについて説明する上で重要なキーワードとして,公開鍵暗号方式とBitcoinアドレスについて触れておきます.
  公開鍵暗号方式は,Bitcoinアドレスの作成やデジタル署名として使われています.ここでは公開鍵暗号方式についての詳しい説明は割愛します.公開鍵とは,他者に公開してもよいもので秘密鍵から作られます.一方の秘密鍵とは,他者に公開してはいけない鍵になります.この公開鍵と秘密鍵からデジタル署名を生成することでUTXOの署名となります.

  Bitcoinアドレスとは,送り先(Bitcoinを受け取る人)の公開鍵から作られるアドレスのことです.Bitcoinアドレスを作るにあたり,何回かハッシュ化されるためBitcoinアドレスから公開鍵を導くことはできません.

  BTCの取引は,相手のBitcoinアドレスをアウトプット先に指定し,インプットに自分が所有しているUTXOを指定しそれに自分のデジタル署名を付けてブロードキャストすることで取引が始まり,ブロックに追加されることで取引が終了します.

・ネットワーク構造について
  BTCのネットワークの特徴は,非中央集権であることです.すべてのノードが平等であり,Peer to Peerネットワークとして構築されています.

・コンセンサス形成
  ブロックチェーンのコンセンサス形成とはインターネット上で合意を形成するという意味で,マイニングという作業によりコンセンサス形成が行われます.そのマイニングでは,新しいBTCの供給と不正なTxや二重支払から保護する役割を担っています.
  具体的な手順は,以下のようになっていきます.

  1. Txの検証と集積

      Txが不適切なものじゃないか確認が行われます.不適切なTxだった場合は,その他のノードにそのTxを共有することをしないことで不適切なTxの蔓延を防ぎ,適切なTxのみがブロックチェーン上にあるように調節されます.そして,適切なTxはいったんTxプールに集積され,優先度ごとに新しいブロックに追加されていきます.

  2. ブロックの構築

      Txプールにある優先度が高いTxをブロックに追加された新しいブロックは,Proof of Work(PoW)アルゴリズムが実行されます.PoWについての詳しい説明は割愛しますが,決められた難易度に基づきハッシュ値の計算を行います.このPoWには約5~10分ほどの時間がかかるようになっており,この時間こそがブロックチェーンの改竄の可能性を限りなく不可能なものにしてくれています.

  3. ブロックチェーンにつなぐ

      ブロックが構築されると次は検証が行われます.ブロックの構造やPoWがきちんと行われたかが確認され,適正ならばブロックチェーンにつながれます.この時,ブロックはブロックヘッダに格納されている親ブロックを探しメインチェーンにつながれるようになっています.

      最後に,ブロックチェーンの改竄の可能性とTxの二重支払ができない仕組みになっているところを説明しておきたいと思います.まず,ブロックチェーンの改竄の可能性ですがこれは限りなく不可能となっています.まずブロックチェーンでは最もPoWが計算されたいわゆるディフィカルティが高いチェーンにブロックを追加する性質があります.また,ブロックは前のブロックの情報をハッシュ化して保持します.そのため,過去のTxを書き換えた場合はそのブロックの情報が変わるため,そのブロック後につながっているブロックのPoWを計算し作り直さなければいけません.当然,現在のチェーンのディフィカルティに追いつくことはできないため改竄はできません.Txの二重支払の防止に関しては,ブロックチェーンはデータベースが公開されているため,それに適してなければそのTxは不適切ということになりTxが通ることはありません.

・参考文献
Mastering Bitcoin:原点にして頂点,日本語翻訳されているのもありとても分かりやすかったです.

10/21 ~ 11月中 Lightning Network(LN)についての勉強

  次にブロックチェーンの問題の一つである「スケーラビリティ問題」を解決する一つの方法であるLightning Network(LN)について勉強することにしました.勉強した理由は,インターンの当初の目標であったLNのノードを立ち上げることだったので,LNについて仕組みとか知っておこうという感じで始めました.

  個人的にLNの重要なポイントは,概念とペイメントチャネルネットワーク(PCN),Hash Time-lock Contract(HTLC)の3点だと思っています.備忘録がてらまとめておきます.

・概念
  最初にLNが誕生した理由,ブロックチェーンのスケーラビリティ問題について説明し.次にLNの考え方について説明します.

  現状のブロックチェーンではブロック1個を生成するのに5~10分ほどかかります.また,ブロックのサイズが1MBと制限されています.現在の決済プラットフォームであるVISAでは,VISAではピーク時には1秒間に47,000件のTxが発生しそれを処理しています.現状のブロックチェーンでは処理はもちろんできません.たとえブロックサイズの制限を無制限にしたとしても,47,000/tpsでは1Tx-300byteかかると考えた場合1秒で8GB年間だと400TB必要になってしまいます.これではブロックチェーンのネットワークに参加できるノードが限られてしまい,分散化が崩壊してしまいます.
  この問題を解決するために生まれたのが,LNというわけです. LNの考え方として,かっこいい決め台詞があります.

森の中で気が倒れても,周りにそれを聞く人がいなければ,その木は音を立てるだろうか

  どういうことかというと,取引を行った2つのノードで残金を保証する仕組みがあれば,いちいちブロックチェーンに参加しているすべてのノードに知らせなくていいよねという意味です.

・ペイメントチャネルネットワーク(PCN)について
 
スライドをもとにPCNの原理について説明できればと思います.今回はAliceとBobがチャネルを開設し,AliceからBobに0.1BTC送金し,その後BobからAliceに0.1BTC返金する一連の流れで説明していきます.

  まず初めにチャネルを開設するとき,Opening Txを作成します.Opening Txとは,インプットはお互いのチャネルのバランスでアウトプットがAliceとBobの両方が著名しなければ取引されない2of2のマルチシグのTxを指定します.そして,Opening Txが作成されたらAliceとBobはお互いにシークレットを作成し,それのハッシュ化したものを交換します.ここでハッシュ化したシークレットの交換の意味は,チャネルでは取引ごとにシークレットを作成し取引が終わればシークレットを交換するため,その際の照合に使われます.

  次に,AliceからBobに0.1BTCを送金するCommitment Txを作成します.Aliceの方では,インプットはOpening Tx,アウトプットはAliceが0.4BTCでOpening Txが0.6BTCのTxを作成します.一方でBobのTxは,インプットは同じくOpening TxでアウトプットはBobが0.6BTCでOpening Txが0.4BTCのTxを作成します.それらのTxができたらTxを交換します.

このTxの特殊な条件が2つあります.
  1つ目は,そのトランザクションを署名しブロードキャストした場合,相手にはすぐにBTCを入手でき自分は1000ブロック経過後BTCが入手できる点です.
  2つ目は,相手のシークレットを知っていれば自分のシークレットで入手可能な点です.

これらの特殊な条件の理由は後ほど説明します.

  お互いのCommitment Txを交換したら,Opening Txをブロードキャストし記録されたらチャンネルが開かれたことになります.

  ここまでがチャネルの開設になります.次に,再度取引を続ける場合にどうなるのかを解説するとともに,Commitment Txの条件のなぞに迫りたいと思います.

  次の取引に移る場合は,最初に前の取引で使用したシークレットを交換します.そして,次の取引で使用する新しいシークレットを作成しそれをハッシュ化したものを交換します.

  新しい取引のCommitment Txを作成します.Commitment Txの内容は上記の画像の通りで条件も最初に作成したCommitment Txと同じです.

  ここで,Commitment Txの条件について説明します.なぜこのような条件があるのかというと,古いTxをどちらかがブロードキャストし不当に利益を手に入れようとするのを阻止するためです.BobがAliceを裏切り前のTxをブロードキャストし不当な利益を得ようとしたとします.その時,Bobは1000ブロック経過までBTCを入手するまで待たなければいけません.しかし,Aliceにはブロードキャストされた瞬間にBTCが手に入ります.そして,不正に気付いたAliceは前の取引で使われたBobのシークレットは知っているので,Bobのシークレットを使用し残りの0.6BTCも手に入れることができます.このように不正を起こした場合は,チャネルに預けたBTCすべてを失うことになります.

・Hash Time-lock Contract(HTLC)
 
次に,他のノードを経由して安全に送金する仕組みであるHTLCについて説明したいと思います.

  画像だと少し見にくいかもしれないですが,左の人が右の人に送金している画像です.手順としては,受け取る人がシークレットを発行しそれを送金者や中間者全員に配布します.それのシークレットを使用しロックしたTxを発行し,ビリヤードみたいにA→B→Cのように送金します.Txはロックされているため中間者はBTCを受け取っても自分のものにすることはできません.受け取る人まで無事に送金が確認されたら,受け取る人はシークレットを含めたTxをブロードキャストします.これにより,シークレットが公開されるため今までロックされていたBTCの支払いが行われます.もし受取人まで到達しなかった場合は,既定の時間が過ぎれば支払いは戻され何もなかったことになります.

  以上がLNの主な概要になります.参考文献に私が今回勉強する上でとても良かったものをそろえています.私が書いていることも間違いがあるかもしれないので本格的に勉強する方は参考にしてみてください.

・参考文献
LNのWhite Paper:英語で所々理解が難しいが,これ読めればLNは完全に理解できる
Mastering Lightning Network:書籍でも購入できるが,英語版は公開されていています.
LNを理解する上でとても参考になったサイト一覧
https://techmedia-think.hatenablog.com/archive/category/Bitcoin
https://lightning.network/#intro

11月中旬 LNのノード立ち上げ,Umbrel君に決めた

  最後にインターン開始時に目標としていた,ノードの立ち上げについてと日本で1番盛り上がりがあるLNのネットワークでるDiamondHandsに参加するまでを書いています.ノードの立ち上げを簡単に説明すると,LNのネットワークを構成する一員に仲間入りすることです.

  ノードの立ち上げで使用した機材は以下の通りです.最初はRaspyでノードを立てようと話し合っていたのですが,運悪くRaspyが半導体不足の影響で手に入りにくくなっており急遽機材を変えることになりました.
・機体:Think Centre
・CPU:Ryzen7 Pro
・メモリ:8GB
・SSD:1TB

  機材は揃い,次にすることはLNに参加するためのソフトウェアの選定です.主なLNのソフトウェアは,c-lightning,LND,éclair,LDKなどがあります.それぞれに特徴はあるのですが,今回はc-lightningとLNDを含むLNに特化したUIなどが完備されたソフトウェアのUmbrelについて詳しく書きたいと思います.

  最初は,話し合いの結果c-lightningでLNに参加しようということになっていました.理由は, UmbrelはRaspyに特化した感じがありその他で立ち上げが楽そうなのがc-lightningだったという理由だったと思います.しかし,実際にc-lightningの実装を進めていくとCLIベースだったこともあり,これでチャネルの開設やインセンティブを受け取れるように設定するの難易度高くないかというところにたどり着きました.いろいろ考え悩んだ末,DiamondHandsのコミュニティにノードの立ち上げについてどれがいいのかメリットなど質問してみたところ,DiamondsHandsの多くの人が使用しているため困ったときにコミュニティの助けがあることや設定が簡単なUmbrelがいいという結論に至りました.

  そして,実際にノードを立ち上げに入りました.ノードの立ち上げについては参考文献に参考にさせていただいたサイトを載せておきます.個人的に思い出深かったエラー2選も載せておきます.

1つ目,CPUがRyzenだと起きる永遠にロードしアプリが開けないバグ
https://community.getumbrel.com/t/ride-the-lightning-stuck-in-starting-loop/47302つ目は,トランザクションのエラーが続きチャネルが開設できなかったバグ
https://community.getumbrel.com/t/errors-trying-to-open-a-new-lightning-channel/448

  この2つともUmbrelのコミュニティで検索することで解決しました.Umbrelは現在LNのノードの全体の8割ほどを占めているのでエラーが発生しても何とかなるイメージがあります.

・参考文献
Umbrel立ち上げで参考にしたサイト
https://umbrelinfo.gitlab.io/getting-started.html#using-a-normal-pclaptopnuc
https://www.youtube.com/watch?v=EJuUVKuEwNQ
https://gist.github.com/mayankchhabra/4997de286ace7ff2b29f16b0576ac6c3

Umbrelホームページ

DiamondHandsホームページ

まとめ&感想

  2021年の10月からインターンを始め,ブロックチェーン周辺についていろいろと勉強してきました.個人的にまだ発展途上なところが多く日々新しいアイデアが議論されていくスピード感がすごく面白く,これからも勉強していけたらなと思っています.

  今回の記事ではインターン体験記を書きましたが,次はLNのノード運用におけるルーティングや論文など読み漁っているのでそこらについても記事にできたらなと思っています.

ここまで読んでいただきありがとうございました!!

Remaining : 0 characters / 0 images
100

Sign up / Continue after login

Related stories

Writer

Share

Popular stories

LNのルーティングシュミレーター「CLoTH」について

155

LNがBotNetとして使われるかもしれない話

94