PSBTを利用したOrdinal Inscriptionsのダッチオークション
オークションって面白いですよね。アート、中古車、不用品、鮮魚、公共事業など様々なものがオークションで値付けされています。ゲーム理論を勉強するのにうってつけの題材でもあります。
自分はこの興味からライトニングのいわゆるHodl Invoiceを利用したオークションサイトを作ったりしました。(今はたぶん改修しないと使えません)
さて、オークションといえばアートと連想する方も少なくないように、NFTなどの世界でも日常的にオークションが開催されていて、最近ではBitcoin上のOrdinal Inscriptionもオークションで売買されていたりします。その中で面白いと思ったのはPSBTを使ったダッチオークションです。詳細を見ていきましょう。
PSBTとは
PSBTとはPartially Signed Bitcoin Transaction (部分的に署名されたビットコイントランザクション)の略で、複数のウォレットが1つのトランザクションに署名する際に署名途中のトランザクションデータをやり取りするための規格のことです(BIP-174)。シンプルな利用例の1つにマルチシグからの送金があります。
例えばAさんとBさんが両方署名しないと送金することのできないビットコインUTXOを考えます。まずAさんがこのUTXOを入力に、新しい送金先アドレスXを出力にしたトランザクションを作成して署名します。(このとき、XはAさんとBさんが事前に話し合って決めたアドレスでも良いし、このAさんによって署名されたトランザクションをもってAさんがBさんに提案しても良い)
BさんはこのPSBTを受け取ると内容を確認し、問題なければ自身もマルチシグのUTXOに署名します。これでトランザクションの署名が集まったので、ビットコインネットワークに配信し、あとはマイナーがブロックに追加してくれるのを待つのみです。

PSBTはこのような手動のマルチシグの他にもライトニングチャネルの作成や更新、ミキシング、エアギャップされたウォレットからのトランザクション配信などにも使われており、ウォレット間の互換性を担う重要な規格の1つです。
ドライにウォレット間でデータをやり取りするだけのこれらのユースケースに対して、今回取り上げるオークションは例の中で注釈した「AさんがPSBTに署名してBさんに提案する」に近い側面があります。
SIGHASHフラグ
PSBTダッチオークションの説明に入る前に、ビットコイントランザクションに対する署名についてもう少し詳しく知る必要があります。
電子署名は何らかのメッセージに対して行われるもので、ビットコインの場合はメッセージ=トランザクションなのですが、ビットコインでは必ずしもトランザクション全部に対して署名をする必要はないようにSIGHASHフラグというものが用意されています。
トランザクションの各入力に添えられたそれぞれの署名の末尾に1バイト追加されるSIGHASHフラグには、以下のようなものがあります:
SIGHASH_ALL (既定):すべての入力・出力にコミットした署名である (署名後に入力・出力を追加・変更不可能)
SIGHASH_NONE:すべての入力にコミットし、どの出力にもコミットしない署名である (出力のみ署名後に自由に追加・変更できる。「コインの送り先はどこでも良い」)
SIGHASH_SINGLE:すべての入力と、自身と同じ位置の1つの出力にのみコミットした署名である (署名後に指定した1つ以外の出力は追加・変更しても良い)
SIGHASH_ANYONECANPAY(上記3つのいずれかと組み合わせて利用):この署名はすべての入力ではなく、この入力のみにコミットする (他の入力は自由に追加・変更可能。「コインの出し手は誰でも良い」)
すなわち、SINGLE|ANYONECANPAYであらかじめ入力、出力を1つずつ確定させたPSBTを公開すると、他の人はそのトランザクションに自由に入力・出力を追加することができるのです。
ちなみにこれで複数人が1つのトランザクションに相乗りすることで送金手数料を少し圧縮することもできますが、節約できる金額は誤差レベルな上に、参加者間で誰が手数料をいくら払うのかという問題が発生します。
他の利用例だとALL|ANYONECANPAYでクラウドファンディング用のトランザクションを作成する(1BTCの入力1つと10BTCの出力1つを持ち、他のユーザーが合計9BTC以上の入力を追加しないと成立しない)というものも考えられます。
ダッチオークション
ダッチオークションとは値段が徐々に下がっていき、最初に入札した人が落札するオークション方式で、日本だとバナナの叩き売りのイメージがあるかもしれません。

上で説明したSIGHASH_SINGLE|ANYONECANPAYで作成したInscription出品トランザクション (入力:Inscriptionが含まれるUTXO、出力:自分のアドレス宛に支払って欲しい金額)を金額ごとにいくつか作成しておき、高い順から公開していくことでダッチオークションがオフチェーンで開催できるというわけです。
実際のところはダッチオークション機能を提供しているInscriptionマーケットプレイスはなく、初回は販売機能を使って手動で行われたようです。
fuck it, let's do the first dutch auction on bitcoin
— dennis (@pourteaux) February 23, 2023
here is a PSBT at 20% off
i'll decrease by 20% every 12hrs or so until it is soldhttps://t.co/G52CB5C8Qu
オークションとして見たときの欠点としては急に落札されるので盛り上がりにくいこと、ダッチオークションは第一価格オークションという買い手不利な仕組みであること、PSBTを扱う性質上カジュアルユーザーが排除されやすいことでしょうか。最後の点に関してはプラットフォーム側で工夫しているようです。
ウォレットアプリの中にはPSBTが編集できるものもありますが、誤って資金を盗まれうる状態にしてしまう危険性もありアドバンスユーザー向きの機能です。Inscriptionsの売買プラットフォーム(openordex.org, generative.xyzなど)ではメタマスクを使ってBitcoinアドレスを生成し、ブラウザ内でPSBTを更新・署名することで外部のビットコインウォレットとのやり取りを不要にし、ユーザー体験をシンプルにしているようです。
メタマスクを使っているため、ビットコインアドレスを再利用してしまう欠点もありますが、Ordinal Inscriptions自体がバッドプラクティスの宝箱みたいなものではあります。
今後もPSBTを応用したオフチェーンプロトコルが考案されていくと面白いですね。ただし、SIGHASHの使い方を間違えると思わぬ理由で資金を失ってしまうことがあるので、利用の際には注意が必要です。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。
ディスカッション