ブロックチェーンの二重支払いや二重使用について調べているとトランザクション展性って言葉が出てきませんでしたか?
「トランザクション展性ってなんやねん!女神転生しか知らないわ!」
そんな、私と同じ気持ちになった人でもわかるようにトランザクション展性を解説してみました。


実は、このトランザクション展性の「展性」、言葉でいうと難しそうですが要するに書き換えができるという意味合いになります。
アルミニウムのような変形しやすいけど柔らかく形が変わるだけでポキっと壊れるわけではない金属の延びる性質のことを「展性(マリアビリティ)」と言います。
ブロックチェーンを「金属としてのチェーン」に見立てて、ブロックチェーンを破壊(改ざん)できるわけではないけど柔らかい金属のように小細工ができることを言い表してそうですね。
この記事では、具体例とともにトランザクション展性でできること、具体例、そして仕組みについては図を持ってわかりやすく理解できるように解説しました。
草猫店長の目次ノート

二重支払い(二重使用)とトランザクション展性の関係
そもそもトランザクション展性でできることは何でしょうか。
結論からいえば、トランザクション展性ではトランザクションIDの改ざんはできて、二重支払いはできません。
よく二重支払いのために使われたという文脈で語られがちなトランザクション展性です。
ですが、実際のところトランザクション展性そのものでは二重支払いを引き起こすことはできません。
実質的にトランザクション展性を引き起こすためにはトランザクション展性プラスのもう一つの力が必要になります。
それはソーシャルエンジニアリングです。
ソーシャルエンジニアリングというとかっこいい言い方なのですが、ハッキングの専門用語なので一緒に覚えておいておくと頭が良くなった気持ちになれます。
ソーシャルエンジニアリングとは要するに対人で人を騙すハッキング手法です。
結果としてはインターネットやコンピューターのハッキングになるけど、ハッキングを実現するために人を騙す行為全般がソーシャルエンジニアリングと呼ばれています。
トランザクション展性プラスにして人をハッキングして二重支払いは引き起こされていたんですね。
Mt.GOXの残念ユースケース
マウントゴックスの実例があります。
マウントゴックス社は管理がずさんだったため、とあるユーザーから「送金が成功していない」と通知を受けた際に、それが詐欺だと気がつかずに送金してしまいました。
実際は送金は成功していたのですが、トランザクションID上では失敗しているように見せかけていたため、騙されて二重支払いをしてしまいました。
つまり「送金が成功していない」とソーシャルエンジニアリング的に騙すことに成功して二重支払いを成功させました。
なんどもマウントゴックスではハッカー(クラッカー)によって悪用されていたようです。
一つの要因としては自動的に失敗したトランザクションは再度送金するようにしていたそうです。
マウントゴックスが倒産するまでマウントゴックスの存在自体を知らなかったのですが、マウントゴックスについて調べると今の取引所も問題が少なくありませんかなりまともに思えてきますね。
トランザクション展性はUTXO(インプットとアウトプット)に関係している
さて、ここまででトランザクション展性自体では二重支払いできないことは分かりましたでしょうか。
❷. 送金先を変更することはできない
❸. 送金量を変更することはできない
上記の3ポイントがトランザクション展性の悪用でのポイントです。あくまで見かけ上のトランザクションの一部を改ざんできるだけですね。
ですので送金先や送金量を改ざんすることはできないということでマウントゴックスのような管理方法でなければ問題は生じない脆弱性であったりします。
トランザクション展性を少し深堀してみる
トランザクション展性はUTXO(インプットとアウトプット)の内のインプットを改ざんすることで実現します。
UTXOって何?というあなたへ
UTXOとはトランザクションを構成している一要素になります。UTXOの塊が一つのトランザクションになります。

【 仮想通貨のUTXOモデルとは 】 図解説でワカるUTXOの仕組みの画像を一部転載しています。図のように送金をするたびに誰かがアウトプットとして「おつり」と「送金先」に通貨を送ります。
受け手視点ではそれをインプットとして「おつり」と「送金分」の通貨を受け取ります。
このインプットとアウトプットを組み合わせたものがUTXOでUTXOを寄せ集めたものがトランザクションになります。
ビットコインやライトコインのような支払いや決済を目的とした仮想通貨でプライバシー保護の視点から逆探知が難しいUTXOが採用されています。
(実際には探知できてしまいますが比較的にややこしくて探しにくいようになっています。)
UTXO(インプットとアウトプット)はビットコインのための言語(スクリプト言語)が使われている
先ほど説明したUTXOですが、様々なハッキングの手法で攻撃できないようにアセンブリ言語が用いられています。
ビットコインはアセンブリ言語の中の一種に当たるOPコード(スクリプト言語)が用いられています。
チューリング完全と呼ばれている言語で、1命令ずつにしかアルゴリズムを進めていくことができません。
物理的なものの移動に例えると、前に二歩進んだら、元の場所(命令)に戻るためには二歩戻らないといけません。
そのためIf文と呼ばれる命令はできません。
アセンブリ言語とは0と1の機械語にトランスレートできる言語です。要するにデジタルにかなり近い言語ですね。
非常に単純化して話すと、1A2Fという数字はデータを取り出す、とか222Eはデータを取り入れるとか、番号に0101010….の命令が逐一入ってるようなレベルです。
今の便利な言語のコードで「GETほにゃらら」とコードを入力すれば複雑な動きは無視してまとめてデータを取得できるのと比べるととても原始的です。
ビットコインのOPコードがどこに使われているの?という部分ですが今から解説します。
ScriptSigとScriptPubKey
ビットコインではScriptSigとScriptPubKeyと呼ばれるOPコードの塊があります。
この二つの中に、取引のデータが入っています。

画像はポーターとスタウトの取引データですね。
ポーターとスタウトのやり取りをブロックチェーンに取り組むためには、ScriptSigとScriptPubKeyと呼ばれる署名と公開鍵に当たるOPコードのアルゴリズムが必要です。
この二つを合わせて暗号化(ハッシュ計算)させないといけません。
暗号化させると「トランザクションID」が生成されます。

仮にトランザクションIDが「0efb123…」だったとします。
ですが、この「トランザクションID」が生成される前にPUSHDATA2というOPコードをハッカーが意図的にScriptSigに取り組むことができます。

そうすると本来は「0efb123…」のトランザクションIDが生成されるはずだったものが「69ab789….」と全く別物に変わってしまいました。
ここで注意したいのは、すでにポーターからスタウトへ送金した内容そのものは変更できないという点です。
あくまでもトランザクションIDだけ改ざんできました。
このトランザクションIDはUTXOの中の一部の動きです。
ScriptSigとScriptPubKeyについての詳細はまた別の記事で取り上げたいと思います。
トランザクション展性とECDSAの弱点
comming soon..
トランザクション展性(マリアビリティ)はもうできない!Segwitの実装で防ぐ
実はこの手法、すでにできなくなってしまいました。
それはSegwitと呼ばれるビットコインをハードフォークせずにビットコインが10分間でさばける取引件数を増やす技術が実装された際にできなくされました。
Segwitの実装によってUTXOに番号がつけられるようになりました。そのことによってScriptSigを改ざんできなくなっています。
トランザクション展性(マリアビリティ)とは まとめ

トランザクション展性(マリアビリティ)は実は最初からこういう弱点があるということで割とビットコインが出たばかりの頃から知られていました。
ただ、直接的なハッキングには繋がらないため早急に手は打たれなかったようです。
マウントゴックスでは悪用されて二重支払いしてしまいましたが、今はもうできません。
一方で二重支払いを行う手段はまだ残っています。それは51%攻撃(アタック)です。51%攻撃について詳しく知りたい人は 51%攻撃(アタック)とは 図解で51%攻撃の仕組みと対策方法と手順を解説を読んでみてください。トランザクション展性とは違いPoWの弱点になります。
ブロックチェーン全般の知識について網羅したい、もしくはどのような技術が他にあるのだろうということを知りたい人は ブロックチェーンとは ~やさしく仕組みを覚えて仮想通貨を楽しむ~
良かったらシェアしてね♪ /