ブロックチェーンの現場でのよくある質問集


前置き

ブロックチェーンに携わっていると、ブロックチェーンの仕組みについて質問されることがある。
それに対し実際に答えたことや、こう答えればよいのではないかということを書き記しておく。
なお「ブロックチェーン」と言っているが、ほぼEthereumに関する質問である。

質問集

ERC20トークンを取引所ウォレットで受け取れないのはなぜ?

かなりよくある質問。
WEBの記事などで、「取引所のウォレットではトークンを受け取れない」と表現されていることがあるが、正確には「受け取れているが、それを人に送付する方法がない」である。同じことのようだが、「受け取れない」⇒「取引所ウォレットにトークン送付しようとしても失敗する」⇒「トークンは送る側に残る」と思ってしまう可能性があるので、区別しておきたい。

「受け取れてはいるが、それを人に送付するインターフェースを取引所が用意していないため。」

「その取引所が、当該トークンの取扱いをはじめれば(インターフェースを用意してくれれば)、トークンの取り出しは可能になる。」

「実際、取引所でやり取りできるERC20トークンもある。」

ERC20トークンに対応していないウォレットで受け取ってしまった場合、もう取り出せない?

取引所以外のウォレットでも、ERCトークンに準拠していないウォレットで受け取ってしまっては駄目なのではないか、という質問。
例えば、紙ウォレットで受取ると、この紙はERC20準拠じゃないからもう駄目だ、と考えてしまいがちである。
ウォレットをそのままお財布的なものだと思っている方には、ウォレットの正体について軽くご説明するとわかっていただきやすい。

「ウォレットの本体は秘密鍵なので、秘密鍵さえ自分で管理できる状態であれば、ERC20トークンの送付機能を持たないウォレットでトークンを受け取ってしまっても、秘密鍵を別の(トークン送付可能な)ウォレットに移すことで、トークンを取り出すことは可能である。」

トークンの全削除が行われた場合、自分のウォレットに入っているトークンはどうなる?

「トークンの全削除」とは、solidityで用意されているselfdestructメソッドのこと。つまり、トークンのコントラクト自体を削除した場合、各々がウォレットで持っているトークンはどうなってしまうのか、という質問。
これも、「自分の持っているお財布にトークン(コイン)がチャリンチャリンと入っている」という認識が元になっていると思われる(「コントラクトが削除されても、手元のコインは残るのでは?」)。

「自分の持っているトークンも全て削除されます。」

「ブロックチェーン上にデプロイされたコントラクトにアクセスすることで『誰々がいくらもっている』という情報を得ることができる。各ウォレットアプリで『私は◯◯トークンをいくら持っている』という情報が見られるのも、ウォレットアプリからコントラクトに情報を取りに行っているから。コントラクト自体がselfdestructされると、その情報に誰もアクセスできなくなるため、もはやそのトークンを持っているとは言えなくなる。」

Walletアドレスってたまたま他の人とかぶったりしないの?

ちゃんと納得してもらおうとすると、けっこう難しい。
下のやり取りは架空のもの。

発端

[Q] Walletアドレスってたまたま他の人とかぶったりしないの?

[A] しません。

[Q] ほんとに?可能性ゼロ?

[A] ゼロではないですが、確率は非常に、ゼロと言っていいくらい低いです。

[Q] (ゼロではない……?それってセキュリティ的にどうなの……?)

[A] (しまった、単にゼロですと言ってしまえばよかった)

確率

[Q] 確率が非常に低いって、どのくらい低確率なのか?たとえば、悪意を持ったハイテクノロジーな人が大量に秘密鍵を生成したとしてもかぶらないのか?

[A] 秘密鍵は256ビット(0か1が256個並ぶ)の情報を持っているので、2の256乗通りある。
つまり、115,792,089,237,316,195,423,570,985,008,687,907,853,
269,984,665,640,564,039,457,584,007,913,129,639,936通りある(不正確な言い方だが、あとで言い直す)。
1秒に3億手読む将棋ソフトがあるらしいので、もう少しがんばって毎秒10億個の秘密鍵を生成するとして、50年がんばると
100,000,000 * 60 * 60 * 24 * 365 * 50 = 150,768,000,000,000,000(通り)
の秘密鍵を生成できますが、先程の115,792,089,237,316,195,423,570,985,008,687,907,853,
269,984,665,640,564,039,457,584,007,913,129,639,936通りと比べると、全体の0.000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,001%しか調べられていない。この確率のガチャに課金する人がいるかというと疑問です。

重複チェックしない問題

[Q] walletアドレスを作成するとき、重複チェックしないじゃないですか。WEBサービスにアカウント登録するとき、アカウント名を入れると「そのアカウント名はすでに使われています」とか表示されて登録できないことがあるけど。
walletアドレスを作成するときに、既存データに問い合わせて既存のアドレスと突き合わせている様子はないし、そもそもオフラインでも生成できる。
これでは、かぶりを防止できないし、もしかぶったとしても気づくことはできないし、だめなのではないか?

[A] 重複チェックせずとも、心配する必要がないくらい低確率なので、重複チェックが必要ないです。

ランダム性

[Q] 秘密鍵が本当にランダムに生成されるのであればよいが、偏りがあった場合はもっと早くに衝突してしまうのではないか?乱数生成アルゴリズムに問題はないのか?

[A] 秘密鍵は、正確には「2の256乗個あるものから1つを選んだもの」ではなく「2の256乗の情報量を持つもの」ですので、定義上、偏りを持ちません。

[Q] どういうこと?

[A] 「2の256乗通りの中から真に偏りなく、ランダムに1つを選び出している」ときと同じランダム性を確保しているということです。それが、「2の256乗の情報量を持つ」ということです。「情報量」は英語でentropy(エントロピー)といいます。

[Q] ……その「2の256乗通りの中から真に偏りなく、ランダムに1つを選び出している」の「真に偏りなく、ランダムに」の部分は信用できるのか?本当に?

[A] そこを解説するには、楕円曲線暗号の知識が必要です。ここでは(何を隠そう私もよくわかっていないので)説明しませんが、多くの、賢く、嘘をつくことにメリットもない人たちが「信用できる」と言っているので、どうかひとつ。

最後は情けに訴える形になってしまったが、システムに絶対はないので、この辺で手打ちとさせていただく。

終わりに

質問内容がだいぶ偏ってしまった(全部ウォレット関連)。