Ethereum Wallet 調査

Ethereum の Wallet のセキュリティをどう担保するか

Wallet とは暗号通貨を、保持、送受信する機能を持つもの。
いくつか種類があり、Walletの認証に用いる鍵を管理する手法が異なっている。

ウォレットの種類

トランザクションをどう扱うか

ルノード型

全てのブロックとトランザクションを取得して検証する。
全部のトランザクションを持ってるので、容量がめっちゃ必要。
Ethereum だと1TBの容量が必要らしい

SPVクライアント(Light Client)

自分に関するトランザクションを取得して検証する。
ブロックヘッダーのみを保持するので、容量が少なくて済む。
Ethereumでは、Light Clientは現在開発中っぽい。

Light client protocol · ethereum/wiki Wiki · GitHub

APIクライアント(Remote Client)

ルノードをREST API等を経由して利用する。

送金に必要な秘密鍵をどう管理するか

サーバで持つ場合

事業者が責任を持つ。
そのため、事業者のサーバが落ちたら利用できないし、事業者側がハックされたときどうしようもできない。
ユーザ的には管理は楽。

クライアントで持つ場合

事業者が鍵を管理する必要がないので、セキュリティ要件が低くなる。
一方で、ユーザはバックアップとかしとかないと、なくしたら二度とアクセス(利用)できないなど、気にすることが増える。

持ち方にはいくつかある。 - クライアントウォレット:スマホとかPCに持つ。 - ハードウェアウォレット:専用の機器を利用する。財布みたいなもの。 - ペーパーウォレット:紙に持つ

参考: DroidKaigi 2019 - いかにしてビットコインを扱うか / ゆいき (@yuikijp) [JA] - YouTube

サーバ側で鍵を管理する

サーバ側で鍵を管理する場合、セキュリティをしっかりと担保する必要がある。
どう言った技術を利用するべきか

注釈

サーバ側での管理をすると、サービス事業者が許可しないと取引を行えない。 ということは、中央による管理となるから、ブロックチェーンの思想に合ってない気もする。

Multi Sig

簡単にいうと、例えば、鍵を3つに分けて、分けた鍵が2つ揃わないと、鍵として利用できないようにするということ。 ユーザ側が2つ、事業者側が1つもつようにすると、ユーザは自分だけで取引可能。事業者側だけでは取引できない。 一方で、ユーザ側が鍵を1つ盗まれても、事業者側の鍵と一緒に使わないと取引できないので安心。

詳しくはこちら! Multisig(マルチシグ)って何? - ビットコインダンジョン2.0

Ethereumでの実装

Ethereumでは、Multisigを実装するために、Contractを作成している。
List of MultiSig Wallet Smart contracts on Ethereum

それを作成するためには、Contractに精通した技術者がいないとセキュリティ担保が難しそう。
Gnosis MultiSig Wallet(ノーシス・マルチシグ・ウォレット)とセキュリティへのコミットメント

LGPLライセンスだったから、下記のContractを真似すれば実装はできそうだけど、知識がなさすぎて怖い。 GitHub - gnosis/MultiSigWallet: Allows multiple parties to agree on transactions before execution.

二段階認証

実装したのでまとめた Rails & Mongoid で二段階認証実装 - okadak1990’s blog

感想

一旦調べた感じ、MultisigをEthereumで用いるには、知識が必要で、下手に実装した場合セキュリティホールになりそう。
クライアントに持たせる形にするか、二段階認証とかで最低限の担保をしてサーバー側で持たせるかが現実的なところかと思う。
ブロックチェーンの思想的には、動画にあった通りクライアントに持ってもらった方がいいと思う。
ただ、金額が少量な場合(サービスの初期段階)は、サーバー側で持つ方針の方が、管理コストをユーザーが払わないで済むという点から良いのかなとも思う。
難しい...