Polkadotのアドレス形式とリプレイプロテクションの仕組み

1. はじめに

こんにちは、ウォレット開発運用部アプリケーション開発グループの山崎です。
アプリケーション開発グループとは暗号資産関連のバックエンド開発を担当するチームで、私は1年ほど前からモバイルアプリの開発を担当するモバイルグループと兼務をさせていただいています。アプリケーション開発グループという名前なのでモバイルアプリの開発をしているチームとよく間違えられるのですが、暗号資産に関わるアプリケーション開発を担当しているチームという意味でモバイルグループとは全然違う領域を担当しております。
アプリケーション開発グループについては以前赤根谷さんが書いたこちらの記事もよろしければご覧ください。
コインチェックに入社して3ヶ月過ごした感想 - coincheck tech blog

モバイルエンジニアとしてはiOSのWidgetに関するブログを以前書いたことがあったのですが、アプリケーション開発グループとしては書いたことがなかったので、今回はじめて暗号資産の技術的な部分をテーマにブログを書いてみようと思います。
iOSのウィジェットに新機能を追加したときにメモリで苦しんだ話 - coincheck tech blog
iOS14から登場したウィジェット(WidgetKit)の開発過程で感じた今までのウィジェット(Today Extension)との違い - coincheck tech blog


今回はCoincheckにて2022年9月1日より取り扱いを開始したPolkadotについて、アドレス形式とリプレイプロテクションの仕組みについてのお話をしていきます。

corporate.coincheck.com

 

2. Polkadotのアドレス形式

PolkadotではSS58というアドレス形式が使われています。SS58はビットコインのBase-58-checkをマイナーチェンジしたものです。Base-58-checkについては以前のやなぎーさんの記事をご参照ください。
ビットコインで使われるアドレスの話 - coincheck tech blog


SS58の大きな特徴としてアドレスのプレフィックスを見ることでどのネットワークのアドレスなのかを判別できることが挙げられます。

例えばPolkadotではアドレスは1から始まり、Kusamaではアドレスはアルファベットの大文字から始まります。(KusamaとはPolkadotの姉妹ネットワークで実験的な試みの場として使われています。)

例として以下に2つのアドレスを挙げて説明します。(以下の2つはTreasuryと呼ばれている、各トランザクションから少しずつプールされて、開発資金等に利用されるアカウントです。中央集権的な仕組みでブロックチェーンの理念上からはやや違和感がある仕組みですが、開発者への明確なインセンティブが可視化されていることはある意味良いことなのかもしれません。)
Polkadot
13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB
Kusama
F3opxRbN5ZbjJNU511Kj2TLuzFcDq9BGduA9TgiECafpg29

このようにネットワークごとにアドレスプレフィックスが異なることは取引所への誤入金を防ぐ上で有効です。

たとえばBitcoinとBitcoin Cashでは、古いアドレス形式の場合、BTCアドレスとBCHアドレスは形式が同じなので混合して誤送金してしまい、資産を紛失するケースがあります。今回のPolkadotとKusamaのようにネットワークごとにアドレスプレフィックスが異なることでこのようなミスに対して未然に注意喚起をすることができます。(重ねてのお願いになりますが、最近誤入金が増えていますので、暗号資産の入金の際はアドレスとタグのご確認をお願いいたします。)
【ご注意ください】暗号資産の送金に関して – Coincheck blog


3. リプレイアタックとその対策

ここからPolkadotにおいて、リプレイアタックに対して施されている対策(リプレイプロテクション)について説明していきます。

リプレイアタックとは第三者によってブロックチェーン上でトランザクションの転送が不正に繰り返されることなどによって、送金者の意図しない形で資産が移動してしまう攻撃のことです。(アタックと呼称されていますが、悪意がないユーザーによっても成立しうります。)

例えばPolkadotネットワークのメインチェーンであるリレーチェーンでAさんからBさんへの送金トランザクションがあったとして、それをBさんがパラチェーン上でも実行して記録された場合、Aさんはパラチェーン上で意図しない送金をしてしまうことになります。

このリプレイアタックを防ぐために施される対策をリプレイプロテクションと呼びます。このリプレイプロテクションには大きくわけて 別チェーンへのリプレイアタック に対するものと 同一チェーン上のリプレイアタック に対するものの2つがあります。

4. 別チェーンへのリプレイアタックに対するリプレイプロテクション

リプレイプロテクションの仕組みは各通貨で仕様もまちまちで、Polkadotネットワークの場合 - [`CheckGenesis`]: Checks the provided genesis hash of the transaction. Must be a part of the signed payload of the transaction. となっているように、署名時にジェネシスブロックのハッシュを指定することによって別チェーンでも意図せずトランザクションが有効になってしまうことを防ぎます。

wiki.polkadot.network


なおこのジェネシスブロックのハッシュで判定できるようにする手法は他の暗号資産ネットワークでも全て共通する仕様というわけではなく、例えばEthereumとEthereum Classicは、署名時の入力値にChain ID(EIP155から導入されました)を指定することで判定できる仕様に現在はなっています。

github.com



5. 同一チェーン上のリプレイアタックに対するリプレイプロテクション

Polkadotネットワークでは、同一チェーン上のリプレイアタックに対するリプレイプロテクションも施されています。その一つがcheckpointとEraの設定です。

The transaction payload includes a block number and block hash checkpoint from which a transaction is valid and a validity period (also called "era" in some places) that represents the number of blocks after the checkpoint for which the transaction is valid.


とあるように、checkpointとは、トランザクションが有効になるブロック番号やブロックハッシュであり、Eraとはトランザクションが有効になるcheckpoint以降のブロック数を表す有効期間のことです。
Polkadot Protocol Information · Polkadot Wiki


なぜEraを設定することがリプレイプロテクションになるのかを説明するためにまずnonceについて説明します。

PolkadotにおけるnonceはEthereum同様、送信者アカウントがこれまでに送ったトランザクションの個数を表現しています。この送信者アカウントにおいてはユニークなnonceをトランザクションに含めて署名することで、同じトランザクションが二度実行されるのを防ぎ、リプレイプロテクションとなります。(このような手法はブロックチェーンに限らず一般的に見られる脆弱性対策です。)

しかしPolkadotにおいては送信者アカウントのnonceがユニークにならないケースがあり、これだけだとリプレイプロテクションとしては不十分です。その理由がExistential DepositとReapingという仕組みです。
Polkadot Accounts · Polkadot Wiki


PolkadotにはExistential Depositというアカウントが最低限保持しておかなければならない数量が定められており、Existential Depositを下回った場合、アカウントはreap、つまり刈り取られてしまいます。これはdust アカウントの大量生成で、エクスプローラのインデックスに負荷がかかることへの対策として導入されている仕組みです。

Existential Depositの数量はPolkadotのリレーチェーンで1DOTです。reapされた場合、アカウントのnonceはリセットされます。
Polkadot Protocol Information · Polkadot Wiki

つまりreapされる前の送金のnonceと、reapされた後の送金のnonceは重複する可能性があるのでPolkadotにおいてnonceは必ずしもユニークとは限りません。なのでこちらにて
It is an important safeguard against certain transaction replay attacks and should generally be used
となっている通り、トランザクションに有効期限をつけることができるEraとcheckpointという概念がリプレイプロテクションにおいて重要となっているのです。
ちなみに意図せず残高がExistential Depositを下回るような送金をしてしまわないようにKeep-Alive Checksという仕組みが送金において用意されています。transfer keep-aliveを利用することで、Existential Depositを下回る送金をしてしまうことを防ぐことができます。

wiki.polkadot.network



6.最後に

簡単にですが、Polkadotのアドレス形式とリプレイプロテクションの仕組みについて説明させていただきました。一口に暗号資産と言っても、通貨によって仕様や思想がそれぞれ異なることも面白さだなと感じています。

最後にコインチェックではエンジニアを積極募集中です。今話題のWeb3、ブロックチェーンの領域で勝負したいエンジニアの方などご興味ある方はお気軽にお申し込みください。

corporate.coincheck.com



また最近コインチェックに興味がある方、転職を検討している方に向けて社内の情報をゆるく発信していくCoincheck FMも始めましたので、よろしければ聞いてみていただけると幸いです。

open.spotify.com