寛Tweetはじめに「Bitcoin」は、ブロックチェーン上(on-chain)で実現されています。Network」は、ブロックチェーン外(off-chain)技術の1つです。Layer技術」とも呼ばれます。Networkが生まれた背景Bitcoinでは「平均して1秒間に約7取引しかできない」と言われています。これは、以下のBitcoin仕様によるものです。10分に1回程度、取引を入れるブロックを作成するように調整されているブロックのサイズが固定されているため、1回に処理できる取引数に制限がある取引数が少なく、最長10分待つことでブロックに入る(=必要最低限な承認)のであればまだ良いのですが、ブロックに入らなかった場合は次回以降に処理されます。基本的にブロックに入る取引は手数料の高いものが優先されます。そのため、手数料を上げた取引を行う人が増えてきます。それでもまだ処理されないと、また手数料を上げて......と、全体の取引数が増えることにより、手数料が上がってしまう傾向があります。この問題に対しての解決がいくつか提案されています。Network技術の主な特徴は「即時決済」です。ブロックチェーンを使わないため各自が送金を管理する必要があり、オンラインでないと送受金できません。Layer上で決済を完了させることができます。Network技術自体は「このようにすれば、こういうことができる」という理論です。これを実際に動かすためには、ソフトウェアとして実装する必要があります。これまでにも、いくつかソフトウェアが実装されましたが、独自仕様で作成されているソフトウェア同士は理論は同じでも実現方法が異なるため、意思疎通ができません。Technology」、略して「BOLT」と呼ばれるプロジェクトができました。GitHubで公開されているので、見ることはもちろん、内容に問題があれば質問できますし、提案もできます。Networkソフトウェアを作成すれば、同じように作られた他のソフトウェアとも通信できます。2018年6月現在、ソフトウェアとしては「c-lightning」「eclair」「lnd」が有名です。弊社でも「ptarmigan」というソフトウェアをオープンソースで開発中です。Networkについて、主に実現されている下記の3つの機能が「どのように解決されているのか」を解説していきます。Networkがどのように動作するのかを見ていきます。NetworkはBitcoinと同じく、ネットワーク上で「ノード」というソフトウェアを使います(以下、LNノード)。LNノード間をネットワーク接続(P2P)して、送金する場合はノード間に「チャネル」を作成します。チャネルはお互いのLNノードが送金するための経路のようなもので、1つのLNノードが複数のチャネルを作成することも可能です。Layerで送金できるBitcoinの情報も入っています。チャネルを作成するときにBitcoinを入金し、その額の範囲で送金を行います。AさんとBさんがチャネルを開いており、それぞれAさんが「5」、Bさんが「5」のBitcoinを持っていたとします(合計「10」)。ここでAさんがBさんに「2」送金すると、AさんのBitcoin量は2減って「3」に、BさんのBitcoin量は2増えて「7」になります。AさんとBさんの配分が変わっただけで、合計は「10」のままです。チャネルのライフサイクルは、以下のようになります。Networkで送金する前には、まずチャネルのオープンが必要です。一度チャネルをオープンすれば、どちらかがクローズするまで送金ができます。NetworkはLNノードのソフトウェアがすべてです。Network自体が成熟していないこともあり、ソフトウェアの不具合などでチャネル内のBitcoinが取り戻せなくなる可能性もあるため、ご注意ください。個人的には、いきなりMAINNETで使うのではなく、TESTNETで体験する方が良いと思います。チャネルのオープンチャネルはBitcoinの送金によって作られます。チャネルに参加する2名の「マルチシグアドレス」を作成します。マルチシグアドレスとは、複数人が管理するアドレスです。Networkでは「2-of-2」、すなわち2名で管理し、2名が署名しないとBitcoinを送金できないアドレスを作成します(Bitcoinの送金には署名が必要なため、アドレスの持ち主=署名ができる人になる)。次に、このアドレスに送金します。その送金された額の範囲内で、チャネルに送金を行うことになります(仕様上の上限は約0.167BTC)。Networkでの最小単位は「m-satoshi」、すなわち1000分の1satoshiです。チャネルは、Bitcoinを送金したい人が入金することで作成されます。今回は、Aさんが送金したい人として説明していきます。Aさんがマルチシグアドレスに送金した後でBさんが所在不明になったり、署名する鍵をなくしてしまうと、AさんはそのBitcoinを取り戻すことができません。そのため、AさんとBさんは事前に通信を行い、先に「2-of-2アドレスに入金したBitcoinをAさんに送金する」というトランザクションを作ってしまいます。ここで言うトランザクションとは、Bitcoin送金情報のデータです。「Bitcoinで送金した」という場合は、トランザクションがネットワークに送信されたり、ブロックチェーンのブロックに入ったりすることを指します。Aさんは、最悪でもBitcoinを取り戻せることを確認した後で、マルチシグアドレスに送金します。送金されたBitcoinがブロックに含まれ、Bさんが指定した以上の承認数(confirmation数)に達すると、AさんとBさん間にチャネルを開いたことになります。チャネルにはAさんのBitcoinしかないので、送金も「Aさん→Bさん」の方向にしかできません。Networkでの送金はBitcoinと異なります。Networkではノードに送金します。チャネルを閉じるまでの間はLNノードがBitcoin量を管理することになります。基本動作は、チャネル相手への送金です。送金先の相手から、支払うための情報(invoice=請求書)をもらいます。Networkの通信を使いません。あるのは、ホームページで「購入」ボタンを押すとinvoiceのデータを表示する方法です(例:Starblocks、Y'alls)。invoiceには、送金してほしいBitcoin量や不正な送金を防ぐための「preimage-hash」(invoice発行元が持つ「preimage」という秘密データのハッシュ値。preimage-hashからpreimageを求めるのは非常に難しい)などが含まれています。送金者はLNノードのソフトウェアにinvoiceを伝えると、あとはLNノードが自動的に送金を開始します。invoiceを取得した送金元のAさんは、数式的に安全な次の2つの手順で送金を行います。送金:HTLCの追加まず、「HTLC」と呼ばれる送金額が入った情報を送ります(HTLCは送金をBitcoinスクリプトという簡易プログラムで制御する手法です)。お互いにHTLCを追加して、Aさんは「送金額の分が減る」、Bさんは「送金額の分が増える」という情報だけ追加します。この段階では、まだBさんのBitcoin量は増えていません。AさんのBitcoin量は減っていますが、送金に失敗すれば取り戻せるようになっています。HTLCは、invoiceに含まれているpreimage-hashで鍵をかけているような状態になっています。送金:HTLCの反映HTLCを解除するためには、invoiceに含まれていたpreimage-hashの元データが必要になります。invoiceはBさんが作っているため、元データのpreimageもBさんが持っています。Bさんは相手が正しいHTLCの情報を送ってきたことを確認してpreimageの情報を相手に展開します。Aさんは、受信したpreimageが正しいと判断すればHTLCのBitcoin量を反映します。それぞれHTLCを反映し、HTLCを削除すると送金は完了です。送金が完了すると、チャネル内のBitcoin配分が変更されます。Networkの特徴として、直接チャネルを開いていないLNノードに送金できるという機能があります。複数のチャネルを経由して送金するため、いくつか条件があります。中継するそれぞれチャネルに送金するだけのBitcoin量がある【NGの例】チャネルをどう経由しても送金先に届かないどこかのLNノードが起動していない送金額よりも小さい額しか入っていないチャネルがあるただ、これはLNノードが知っておくべき情報であり、LNノードを使用する人が把握しておく必要はありません(人力で行うのは、ほぼ無理です)。使用する人が必要な情報は「1.チャネル相手への送金」と同じです。送金先からinvoiceを取得するinvoiceをLNノードに伝えるinvoiceの取得は「1.チャネル相手への送金」と同じなので、それ以降を説明します。送金するLNノードは、送金先までの経路情報を作成する必要があります。経路情報は以下のようなデータを含んでいます。経路情報は送金経路のLNノードを中継して渡していくことになりますが、途中のLNノードに情報を見られたり、改ざんされたりしないように、送金元の人が暗号化します。経路情報を中継するLNノードは自分が次のLNノードに送金するための情報だけを解読できる仕組みになっています。経路情報に必要なLNノードやチャネルの情報を集めるために、接続されたLNノード間で常にメッセージを交換し合っています。新しくLNノードと接続すると、自分が知っている他のLNノードやチャネルの情報を交換します。新しい情報が追加されるたびに情報交換をしていきます。送金の中継手数料も、交換する情報の中に含まれています。送金者は、最初の送金額に各LNノードに支払う手数料も含めます。中継するLNノードは、受け取ることになる額と、次のLNノードへの送金額の差を手数料として受け取ります。経路によって送金額が変わってくるということになります。経路情報を作成すると、まず送金先のLNノードから最初の中継LNノードに送信します。受信した中継LNノードは、解読して、また次の中継ノードに送信し......を繰り返し、送金先のLNノードまで繰り返します(最初の中継LNノードが送金先のLNノードと同じだった場合が「1.チャネル相手への送金」です)。各チャネルの間で、HTLCの追加と反映を行っています。「1.チャネル相手への送金」では説明しませんでしたが、HTLCには時間制限があります。期限内に何らかの処理をしないと、送金先であってもBitcoinを手に入れられなくなります。時間制限が付けられているのは、中継をしたLNノードが途中で処理を放置しても、タイムアウトすれば送金者に戻ってくるようにするためです。「タイムアウトするまでに送金を終わらせよう(終わらせないと損をする)」というインセンティブを与える側面もあります。再送Bitcoinでは、送金先のアドレスが分かっていれば、相手の状態に関係なく送金ができます。Networkでは相手のLNノードに送金を行うため、ネットワーク上にLNノードが存在していなければ送金ができません。「存在する」とは、送金するタイミングでLNノードがオンラインになっているという意味です。送金先のLNノードがオンラインでも、送金を中継するLNノードのどこかがオフラインになっている可能性があります。そのような場合は別の経路を作って送金し、オンラインになっている最後のLNノードまでは中継が進みます。それ以上は経路に沿って進めないため、中継元のLNノードにエラーを返します。エラーを受信したLNノードは同じように送信してきたLNノードにエラーを返します。これを繰り返し、最終的には送金元までエラーが通知され、その経路での送金は中止されます(時間切れの場合とは異なりHTLCも元に戻ります)。Networkの仕様に再送の規定はありません。途中の経路が原因で送金できないのであれば、ほとんどのLNノードは自動的に別の経路を作って送金するでしょう。通行できなかったチャネルを計算から外して経路を作り直し、新しい経路で送金を開始すれば再送になります。Networkでは「即時決済が可能」という言い方をしていますが、「いつでもチャネルをクローズしさえすればBitcoinとして使用できる状態を維持している」という言い方もできます。LNノード内部では、送金するたびにチャネル内のBitcoin量をお互いに配分するトランザクションを作成しており、そのトランザクションをブロックチェーンに展開すれば、それぞれの手元にBitcoinが戻ってきます。送金前のトランザクションは破棄するルールですが、データとしては手元に存在しています。送金者が「送金をなかったことにしてしまいたい」と考え、Bitcoin量が減る前の古いトランザクションをブロックチェーンに展開したらどうなるでしょうか。ソフトウェアを改造して、そういうことをしてしまう人がいるかもしれません。このような行動を取られた場合の対策も、仕様として考慮されています。「お互いに配分するトランザクション」と解説しましたが、相手のアドレスに直接送金するようにはなっておらず、条件によって送金先が変わるようなBitcoinスクリプトになっています。Aさんが最新ではない配分のトランザクションをブロックチェーンに展開すると、Bさんがチャネルの全額を受け取れるように作られています。悪いことをすると、損をするのです。チャネルのクローズチャネルの内容をブロックチェーンに展開すると、チャネルをクローズしたことになります。クローズの方法には、次の3種類があります。Networkの動作概要を解説しました。Networkで使用されている技術を個別にピックアップし、解説していきます。Nayuta組み込みソフトウェア開発に十数年取り組む。医療機器や携帯電話の組み込み開発等幅広い経験を持つ。Networkノードソフトウェアptarmiganの開発を行っている。ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。Americaサンディエゴで開催。VeloCloudが選ばれる理由SD-WANとはなにか。Linuxエンジニア育成への思いF5とNGINXの組み合わせで、サービス公開をよりセキュアに。ITがお届けするポッドキャストです。