記事を購入しました。 mic51u97c
サトシの受け取りはバケツで
ウォレットをバケツにたとえた説明は分かりやすい。もし受け取る水がバケツから溢れる場合、バケツを大きなものと取り換える。この際、オンチェーンへの書き込みが発生する。以前までは、バケツから溢れる場合、新たにバケツを用意していたが、スプライシングを使うことでバケツを大きなものと取り換え、常に1つのバケツを保有しているだけでよい。 ※ウォレットをバケツにたとえているが正確にはチャネル <iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen" class="" style="position: static; visibility: visible; width: 550px; height: 417px; display: block; flex-grow: 1;" title="Twitter Tweet" src="https://platform.twitter.com/embed/Tweet.html?dnt=true&embedId=twitter-widget-0&features=eyJ0ZndfdGltZWxpbmVfbGlzdCI6eyJidWNrZXQiOltdLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2ZvbGxvd2VyX2NvdW50X3N1bnNldCI6eyJidWNrZXQiOnRydWUsInZlcnNpb24iOm51bGx9LCJ0ZndfdHdlZXRfZWRpdF9iYWNrZW5kIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19yZWZzcmNfc2Vzc2lvbiI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9LCJ0ZndfZm9zbnJfc29mdF9pbnRlcnZlbnRpb25zX2VuYWJsZWQiOnsiYnVja2V0Ijoib24iLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X21peGVkX21lZGlhXzE1ODk3Ijp7ImJ1Y2tldCI6InRyZWF0bWVudCIsInZlcnNpb24iOm51bGx9LCJ0ZndfZXhwZXJpbWVudHNfY29va2llX2V4cGlyYXRpb24iOnsiYnVja2V0IjoxMjA5NjAwLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3Nob3dfYmlyZHdhdGNoX3Bpdm90c19lbmFibGVkIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvb
GreenlightとコミットメントTX
Greenlightは、クライアント側に秘密鍵を保有しつつLNのノード管理をクラウド上で行えるBlockstream社のサービスです。LNでの2者間の残高は、署名済みコミットメントTXとしてお互いがオフライン(ローカル)で管理しています。もし相手が音信不通になればこのコミットメントTXをブロードキャストすることで資金をオンチェーン上で回収できます。 ここで疑問となるのは、Greenlightのクラウド上ではこのコミットメントTXが管理されているので、運営側はユーザーの同意なしにコミットメントTXをブロードキャストできるのでしょうか? 答えは、できないです。コミットメントTXは署名済みではありますが、この署名済みとは、相手側の署名のみです。そのため、Greenlight上で管理されているコミットメントTXをブロードキャストするにはクライアント側で署名をする必要があります。GreenlightのFAQページにもその旨が記載されています。
Greenlightのgl-clientとバージョン互換
Greenlightのgl-clientでハマった点の備忘録。Greenlightの使い方はこちらの記事を参照してみてください。 BreezSDKでGreenlightのノード登録をすると、v23.08としてCLNのインスタンスが生成される。しかし、PyPIに公開されているgl-clientはv23.05なので、BreezSDKで登録したGreenlightのノードをgl-clientで操作しようとするとバージョンの違いによってRPCがハングする。v23.08用のgl-clientを使うにはgreenlightのレポジトリをローカルに複製してビルド、インストールする必要がある。 # 複製したGreenlightのレポジトリ配下でビルド $ git clone git@github.com:Blockstream/greenlight.git $ cd greenlight $ make build-py # ビルドされたフォルダへ移動してgl-clientをインストール $ cd ./libs/gl-client-py/dist $ pip install gl_client-0.1.9-cp37-abi3-manylinux_2_27_x86_64.whl
ビットコインがチューリング完全に対応!?任意のプログラムを実行検証するBitVMとは
BitVMはビットコイン上で任意のプログラムを実行したかを検証するプロトコル。現状のビットコインは限られたプログラムしか実行できないが、BitVMを使うことで任意のプログラムを実行できる。ただし、このプログラムが実行されるのはビットコイン上ではなく、オフチェーン上で実行される。その実行結果が正しいかの検証をビットコイン上で行う。もし実行結果が間違っている場合、Fraud Proofを使って資金を没収することができる、というのがBitVMの仕組み。 BitVMの提案書はページ数も少なく内容も難しくないのでこちらの原文を読むのがおすすめ。日本語での解説記事はこちら。 論理回路コミットメントという発明 BitVMではBit Value Commitmentという0または1を出力するためのプリイメジハッシュをそれぞれ構成する。これをOP_BITCOMMITMENTと呼ぶ。 #Bit Value Commitment OP_IF OP_HASH160 <hash1> OP_EUALVERIFY <1> OP_ELSE OP_HASH160 <hash0> OP_EUALVERIFY <0> OP_ENDIF 次に、NAND回路を構成するが、これは既存のビットコインスクリプトであるOP_BOOLAND, OP_NOTを使うことで簡単に構成できる。これをOP_NANDと呼ぶ。 #OP_NAND OP_BOOLAND OP_NOT OP_BITCOMMITMENTとOP_NANDを使ってLogic Gate Commitment(論理回路コミットメント)を構成する。これもプリイメジハッシュをセットすることで論理回路にコミットする。0または1に対応するプリイメジを公開することで論理回路の出力を制御することができる。 //Cのビット値をALTSTACKへ退避 OPBITCOMMITMENT OPTOALTSTACK //Bのビット値をALTSTACKへ退避 OPBITCOMMITMENT OPTOALTSTACK //Aのビット値をSTACKへセット OP_BITCOMMITMENT //Bのビット値をSTACKへセット OP_FRO
LoopのMusig2によるプライバシー向上と手数料削減
Loopのこちらのリリース(2023年4月)から、デフォルトのスワップにMusig2が使われることになっていました。Musig2を使うことでよりプライバシーの向上や手数料の削減になります。以下、その概要です。 ユーザーとLoopはMusig2を使い両者の鍵を集約する。Tapleafにはプリイメジハッシュをセットする。 LoopはHodlインボイスを生成し、ユーザーが支払う。 Loopは1.で作ったP2TRアドレスへオンチェーン送金する。 ユーザーはプリイメジを公開する。 Loopはそのプリイメジを使い2.のLN送金を決済させる。 ユーザーは自身とLoopの両者が署名をしてオンチェーン資金を回収する。 もしLoopが署名をしない場合、プリイメジを使ってTapleafからオンチェーン資金を回収する。 6.はトラストポイントになりますが、最悪7.でユーザーは非協調的、アトミックにスワップを実行できます。Loopとしては協調的に署名をしなくても問題ないですが、ユーザー側の手数料削減やオンチェーンフットプリントの低減に貢献することで、サービス満足度を向上できるので、ビジネス的にやらない意味はないでしょう。
Elements/Liquidでコベナンツを作ってみた
ElementsとはLiquidなどのサイドチェーンを運用するためのソフトウェアです。Bitcoinを拡張した実装となっています。 Elementsに追加された新OPコード Elementsでは以前からビットコインにはないOPコードがいくつかあります。OP_CATとOP_CHECKSIGFROMSTACKを使うことでコベナンツを実現できますが、この方法は計算コストがかかるというデメリットがあります。そこでインプットやアウトプットを直接調べるためのOPコードが追加されました(詳細はこちら)。これらのOPコードはSegwit V1(別名P2TRアドレス)として使うことができます。例えば、OP_INSPECTOUTPUTVALUEはアウトプットの金額を参照することができ、以下のようなスクリプトを構成することで送金金額を制限できます。こちらのツールを使うことで、スクリプトの実行経過を確認することができます。 //インデックス0のアウトプットの金額を取得 OP0 OPINSPECTOUTPUTVALUE OP1 OPEQUALVERIFY //1000のリトルエンディアンを指定 <0xe8
Spotlightのバグ修正
「Spotlightへ投稿した記事のアクセス統計が表示されない」という問い合わせがありました。 UA廃止に伴いGA4へ移行するのを忘れてました。この1週間くらいのアクセス統計が取れてなく、ごめんなさい🙇 入出金やTwitterログインなども不具合があったので対応しました。マイニングおみくじ機能も復活しています。 コピペで他のサイトから記事の転載をする際の不具合はデザイナーの倉谷さんにも直してもらいました。ありがとうございます。(ただ、単にコピペした場合にフォーマットが引き継がれてしまう問題(?)は根本的に解決してません。フォーマットを消した状態でコピペする場合は、Ctrl + Shift + Vでお願いします。) 今後ともSpotlightは細々と継続していくのでよろしくお願いします
RGB-Channel in Lightning
ライトニングネットワークはビットコインをオフチェーン上で送金する仕組みである。そのネットワークを構成するペイメントチャネルは2者間のビットコイン残高の状態を管理している。このチャネルの状態にビットコイン残高以外の特性を持たせようとする取り組みがいくつかある。 RGB-Channel in Lightning ビットコイン以外のトークン残高を管理できるようにするチャネル Lightning Network compatibility - RGB Docs DLC-Channel in Lightning 残高はビットコインのままだが、残高状態を更新するために必要な二者間の署名以外にオラクルの署名も有効とするチャネル DLC on Lightning. TLDR; | by Thibaut Le Guilly | Crypto Garage | Medium 今回はRGBチャネルに焦点を当ててその実用性を考察してみる。 RGBチャネルのプロコン RGBチャネルの場合、チャネル開設者がアセットを持ってさえいればよい。これはRGBチャネルのメリットである。なぜなら、RGBのオンチェーン送金では受け取り側もUTXOを事前に用意する必要があるから。RGBチャネルを開設さえすれば、受け取り側はLN上で0承認かつ低手数料で何度も送受信が可能で、アセットをオンチェーンへ引き出す際はチャネルを閉じるだけでよい。 現状のRGBチャネルは1チャネル1アセットなので、複数アセットを扱う場合、それぞれのチャネルを開設する必要がある。そのため、受け取りたいアセットのチャネルがない場合は受け取ることができない。RGBチャネルが普及する場合、特定のアセット、例えばUSDTなどのチャネルに限定的になる可能性が高い。 チャネル間を通してアセットを送金する方法は、分散ネットワーク型、ハブ&スポーク型、ゲートウェイ型の3通りある。RGBチャネルが普及する場合、特定のアセットに限定的になる可能性が高いので、その場合は分散ネットワーク型になる可能性もあるが、取引所やLSPなどがゲートウェイとしてRGBチャネルを運用する未来像の方がイメージしやすい。
SphinxプロトコルにHMACを追加する理由はリプレイ攻撃対策
ライトニングネットワーク上の送金はプライバシー向上のためにオニオンルーティングが使われている。そのプロトコルとしてSphinxプロトコルをベースとしているが、そこにHMACがなぜ追加されているのか、以下のLNメーリスに回答があったので、その備忘録。 [Lightning-dev] Reason for having HMACs in Sphinx (linuxfoundation.org) オニオンルーティングのペイロードのラップ、アウンラップについては以下のサイトが参考になるので、それをもとに以下、詳細を割愛しながら説明する。 lnbook/10_onion_routing.asciidoc at develop · lnbook/lnbook (github.com) オニオンペイロードのラップ・アンラップ オニオンペイロードは送信者によって構成される。このペイロードは1300バイトの固定長である。例えば、A→B→C→Dという経路で送信する場合、AはまずDへの情報をセットし、残りのスペースを1300バイトになるまでフィラーで埋め、Dとの共有鍵から生成したrho鍵でXORしてペイロードを暗号化(難読化)する(1)。次にCへの情報をセットし、暗号化したデータ(1)を追加する。この時、1300バイトを超過したデータは切り捨て、Cとの共有鍵から生成したrho鍵で全体を暗号化する(2)。次にBへの情報をセットし、暗号化したデータ(2)を追加する。この時も1300バイトを超過したデータは切り捨てて全体を暗号化する(3)。こうして入れ子になったデータをオニオンペイロードと呼ぶ。 Aはこのオニオンペイロードの先頭にBとのセッションキー(※1)をセットしてBへ送信する。Bはオニオンペイロードに1300バイトのゼロ埋めされたフィラーを追加して、共有鍵を使い2600バイトのペイロードを復号して(先頭1300バイトが復号され、残りの1300バイトは難読化される)、自身のペイロードを切り取る。残ったペイロードを左へシフトして、1300バイトを超過するデータを切り捨てる。Bはこのオニオンペイロードの先頭にCのためのセッションキーをセットしてCへ送信する。Cも同様にペイメントの先頭に1300バイトのフィラーを追加してから共有鍵を使いペイロードを復号して自身のペイロードを切り取る。残ったペイロードを左へシフトして、1300バイトを超過するデータを切り捨てる。Cはこのオニオンペイロードの先頭にDのためのセッションキーをセットしてDへ送信する。Dも同様な処理を行い、自身のペイロードからこの送金
LDP Seminar Week 1の備忘録
Chaincode labsが開催しているLDPというオンラインセミナーに参加しているので、そのWeek 1の復習を兼ねての備忘録。 Week 1はライトニングの基本的なプロトコルに関する内容で、事前に参加者には宿題が与えられるので当日までに解いておく。そして、当日その問題をグループ内でディスカッションする形式となっている。その中から一部抜粋してその問題を以下に記載する。 ・・・ 問題1 Why do we need the HTLC-Success and HTLC-Timeout transactions? Why can't we just use a sequence delay on the to_local output conditions of the HTLC itself? 回答 アリスからボブへの送金において考える。まずはアリスのコミットメントであるOffered HTLCについて。このHTLCのアウトプットの使用条件は以下の3つ ボブがプリイメジを使う CLTVによる絶対時間の経過後にアリスが自身の署名を使う ボブがrevocation keyを使う(アリスが古いコミットメントを送信した場合) ただし、CLTV経過後、アリス自身が使用する場合にはto_self_delayの相対時間も経過する必要がある(※1)。言い換えると、HTLCの有効期限が切れたのに
Eltoo: SIGHASH_ANYPREVOUTによるバインディング技術
Eltooはペイメントチャネルの残高更新の仕組みを簡素化する仕組みです。現状のライトニングネットワークに使われているペイメントチャネルはペナルティ型で、一方が不正をすると他方が全額没収することができる仕組みになっています。ペナルティ型のペイメントチャネルは、残高が更新される度にその更新に使われた鍵情報(revocation key)を保存する必要があり、データ容量を圧迫してしまいす。Eltooでは最新の残高に関するデータのみ保存するだけでよくなります。 Eltooの実現にはBIP118のSIGHASH_ANYPREVOUTと呼ばれる新しいSIGHASHタイプが必須で、ソフトフォークが必要です。Eltooの俯瞰図は以下が詳しいです(eltoo with Anyprevout and Taprootより抜粋)。またこちらの記事も日本語で詳しく解説されています。 Eltooでは、チャネルのライフサイクルを3つに分けて考えます。 セットアップ:funding_txとupdate_txを作る ネゴシエーション:update_txとsettelment_txを作る セトルメント:協調的な場合はclose_txを作り、非協調的な場合はupdate_txとsettlement_txをブロードキャストする ネゴシエーションは送金をする度に実行されます。ここで重要なのはupdatetxが消費できるtxは複数あることです。上図のUpdate:3を見ると、そのtxが消費できるtxはFunding:0、Update:1,Update:2の3つあることが分かります。現状ではtxに署名をする場合、そのtxが消費するtxをインプットとして指定する必要があります。しかしSIGHASHANYPREVOUTではインプットを指定することなく署名できるようになるので、どのtxに対しても有効な署名済みtxになります。そのため、もし相手がSettle:1の残高でセトルメントを実行しようと思いUpdate:1を
ペイメントチャネルのサイズ変更をするスプライシング(Splicing)
Splicingはペイメントチャネルのサイズを変更するための仕組みです。サイズを小さくする場合はSplicing-out、大きくする場合はSplicing-inと呼んだりします。現状のLNでチャネルのサイズを変更するには、一度チャネルを閉じて開き直す必要があり、これには2つのトランザクションが必要になります。Splicingを使うことでこのトランザクションを1つに纏めることができます。さらに、というよりこれが要点ですが、Splicingでチャネルサイズを変更している間(この新しいチャネルが未承認の場合)でも、既存のチャネルでルーティングを継続することができます。 既存のチャネル(これは閉鎖中のチャネルとも呼べる)と開設中のチャネルが共存するなか、どうやってルーティングをしているかというと、既存のチャネルのコミットメントにHTLCが追加・削除される場合、開設中のチャネルにも同じ金額のHTLCを追加・削除します。このHTLCは両コミットメントに共存していますが(コミットメントはオフライン上のデータであることに注意)、HTLCがオンチェーンに展開される場合、最終的にブロックチェーンに刻まれるのはどちらか一方なので、チャネル間の残高の整合性は担保されます。 Splicingの仕様は以下リンクに詳しいです。 Splice draft (feature 62/63) by rustyrussell · Pull Request #863 · lightning/bolts (github.com) Alternative splicing specification proposal with detailed examples (github.com) また、Splicingではinteractive-txと呼ばれる新しい仕様も必要になり、その仕様は以下のリンクに詳しいです。 interactive-tx: Add dual-funding flow, using the interactive tx protocol (feature 28/29) by niftynei · Pull Request #851 · lightning/bolts (github.com) interactive-txは、チャネル開設時にOpenerだけでなくAccepterにもfundingtxのためのインプットを追加できるようにするもので、より柔軟にfundingtxを構成