本連載では、ビットコインが抱えるトランザクション展性（Transaction Malleability）、スケーラビリティ（Scalability）と呼ばれる２つの問題と、その解決策について基本的な概念から説明していきます。

まずはトランザクション展性について。展性とは元々、金属を叩くと壊れずに延びることを意味する言葉です。ビットコインにおけるトランザクション展性は、TxId（トランザクションID; 検証可能な取引のid）を取引当事者ではない第三者が自由に書き換えることができてしまう脆弱性のことを指します。

と言われてもなんのこっちゃという感じと思いますので（私はそうでした）、今回の記事ではトランザクションの構造から順を追って説明していこうと思います。

トランザクションの構造

ビットコインの取引単位であるトランザクションの構造を見ていきましょう。ここではBobが、以前Aliceから送られた1BTCを使って、Carolから0.5BTCのコーヒーを買う状況を想定します。着目するのはBobからCarolへの送金です。

Bobはまず、Carolに送金を行うためにトランザクションを作成します。トランザクションはインプットとアウトプットから構成されます。

アウトプットには、いくら送金するか、どうすれば送金されたビットコインを使用できるかの手順が書かれています。通常は秘密鍵を用いた電子署名によって使用できます。インプットは、以前のトランザクション・アウトプットへの参照です。つまりこの場合は、「AliceからBobに送金するトランザクションのアウトプット」への参照（Index）が含まれます。残りは電子署名と、以前のトランザクションID（AliceからBobへ送金したtxid）です。

簡単に言えば、インプットは使用するビットコインがどこから来たかを示しており、アウトプットはビットコインがどこに行くかを示していると言えます。

このインプットとアウトプットを合わせたデータを、ハッシュ関数（データを要約する関数のようなもので、ハッシュ値から元のデータを推測できない）を用いてハッシュ値を作り、それをTxId（トランザクションID）とします。これらをまとめて１つのトランザクションとし、ビットコインのネットワークにブロードキャストすることで「このような取引があったよ」ということを世界中に知らせます。

トランザクション展性

では、トランザクションについて概要を理解した上で、どのようにTxIdを書き換えるかについて見てみます。

上述したように、TxIdはトランザクションのデータ全体のハッシュをとったものです。ハッシュ値は、データが少し違うだけでも全く異なる値になります。したがって、実際にTxIdを書き換えるためにはトランザクションの意味（誰が誰にいくら送金したか）を変えず、あまり重要でない部分に手を加えます。

元来、インプットに含まれる署名は、当然ですがインプットに署名をするために使われます。上の図では署名（Signature）自体もインプット（input）に含まれていますが、実際にはインプットから署名自身を除いたものに対してSignatureを用いて署名を行います。つまり、Previous TxId と index に対して署名をします。これは暗号学的に、署名自身に署名することは適切ではないからだそうです。以上は署名をする時の話ですが、ハッシュ値を計算する時には、インプットに署名自身も含まれます。そして、TxIdを計算する際には署名が正しいかどうかも詳細にチェックされません。これを利用してTxIdを書き換えることが出来ます。

具体的にはどう変えるのか。トランザクションインプットに含まれる電子署名は決まった形式で書かれています。そこにプログラムが意味を読み取り容認する記述ができてしまうのです。ここでは詳細に立ち入るのは避けますが、例えるならば、書類の年齢欄に「21歳」と書くべきところを「021歳」と書くイメージです。

トランザクション展性の何が問題か

トランザクション展性は、ビットコインを自分のウォレットで管理し、そのウォレットが残高を計算するときにTxIdだけを参照しているのでなければ問題は起こりません。どのような場合に問題になるかといえば、取引所やウェブウォレットなどによるビットコインの管理の際に問題が起こります。例えば取引所が顧客による引出履歴をTxIdで管理している場合、一度作成したTxIdを改ざんすることで、あたかもそのトランザクションがビットコイン・ネットワークに承認されてないかのように取引所側に見せかけることが出来てしまいます。つまり、システムがそれを誤検出することで何度もビットコインの再送を外部から行えてしまうのです。

以上、トランザクション展性というビットコインの問題についてでした。次回は、この問題を解決するために発案されたSegWitと呼ばれる案について解説する予定です。