![見出し画像](https://assets.st-note.com/production/uploads/images/161760790/rectangle_large_type_2_07b69c0a951d610a63c942b1cb39b2df.png?width=1200)
ウォレットとは?By Jarrod Watts 2024年9月16日
本記事はhttps://www.abs.xyz/blog/articles/what-is-a-wallet (by Jarrod Watts) を和訳したものです。
ウォレットは、ユーザーがブロックチェーンのアカウントを管理するために不可欠なツールです、ブロックチェーンの状態を変更するためにトランザクションに署名します。
この記事では、ウォレットとは何か、ウォレットはどのように作られるのか、楕円曲線暗号を使用して秘密鍵と公開鍵のペアを生成して安全に保管し、シードフレーズを導き出し、安全なブロックチェーンのやり取りを促進する方法について説明します。
ウォレットとは?
ウォレットとは、自分のブロックチェーン・アカウントを表示し、やり取りするためのアプリケーションです; これらのアカウントにより、トークンの送信やスマートコントラクトとのやり取りなどのアクションを実行するためのトランザクションを送信することができます。
ブロックチェーン上の各アカウントは、暗号鍵ペア; 互いにリンクされた2つの鍵のセットです。ブロックチェーンの文脈では、この種のアカウントは通常、外部所有アカウント(EOA)と呼ばれ、公開鍵と秘密鍵で構成されます:
公開鍵: あなたのウォレットのアドレス。これは誰とでも共有でき、他の人(またはスマートコントラクト)はこれを使ってあなたに暗号通貨を送ることができる。
秘密鍵: メッセージやトランザクションに署名するために使用する「署名キー」。秘密鍵にアクセスできる人は誰でも、ウォレット内の資金を完全にコントロールできる。
この鍵ペアはトラップドア機能と呼ばれる強力な機能を持っている:
秘密鍵を持っていれば、公開鍵を見つけ出すのは簡単である。(A→B)
公開鍵を持っていても、秘密鍵を知ることは不可能である。(B→A)
![](https://assets.st-note.com/img/1731522783-cFLCG7eyMg3Ais1IblKwN09k.png?width=1200)
ウォレットは何に使われるのか?
ウォレットは、ウォレットの秘密鍵を使ってメッセージや取引に署名し、ブロックチェーンに送信するために使われます。
ウォレットは、ウォレットがどのようなメッセージやトランザクションに同意したかを知る方法を提供します。トランザクションの送信者の公開鍵は、トランザクションの署名から復元することができるからです。これは偽の/悪意のある取引がブロックチェーン上で受け入れられるのを防ぐために不可欠である。
例えば、JarrodはAbrilがこの取引に同意していなくても、5ETHを送ったと主張する取引を提出することができる。しかし、ブロックチェーンは各取引の署名を検証するため、署名から復元されたアドレスが取引の「送信者」(すなわちアブリル)と一致しないため、すぐに取引を拒否します。
イーサリアムのようなブロックチェーンはECDSA(楕円曲線デジタル署名アルゴリズム)を使用して、トランザクションの署名から復元された公開鍵がネットワークにトランザクションを送信した人の公開鍵と一致するかどうかをチェックします。
ウォレットはどのように作られるのか?
ウォレットを作成するには、公開鍵と秘密鍵のペアを作成する必要があります。ただし、この鍵ペアの値がブロックチェーン上で機能するためには、いくつかのルールに従う必要がある。
秘密鍵は64文字の16進数(0→F)で構成される。
公開鍵は楕円曲線暗号(ECC)を使って秘密鍵から導き出される。
公開鍵は切り刻まれ、ハッシュ化され、42文字のアドレスに整形される。
この3段階のプロセスが、ブロックチェーン上でアカウントが生成される仕組みの核となる流れだ。
次に、楕円曲線と秘密鍵を使ってどのように公開鍵が導き出されるのかについて掘り下げていく。しかしその前に、ウォレットについて皆さんが抱いているであろう以下のような質問にお答えします:
秘密鍵がランダムに生成されるようにするには?
自分の秘密鍵がランダムに生成されるようにするには?
シードフレーズはこのプロセスにどのように適合するのか?
一つのシードフレーズから複数の鍵ペアを生成する方法は?
シードフレーズとは?
先ほど示したように64進数のランダムな値を生成することは可能だが、通常、秘密鍵はビットコインに由来する特定の標準を使用して生成される。これらの標準は、ユーザーがシードフレーズを記憶することを可能にする。シードフレーズは12-24語のフレーズで、それに関連付けられた新しいアカウントをいくつでも作成するために使用できる。
これにより、ユーザーは1つの単語を覚えておくだけで、個々の公開鍵と秘密鍵のペアを持つすべてのアカウントにアクセスできる。新しい秘密鍵は、特定の鍵導出関数(KDF)を使って、1つのシードフレーズからいくつでも導出できる。
そこでまず、シード・フレーズがランダム・エントロピーによって生成される仕組みと、シード・フレーズから秘密鍵が導出される仕組みを説明し、最後に秘密鍵から公開鍵が導出される仕組みを再確認しよう。
シードフレーズの仕組み
最初にウォレット・アプリケーションをインストールすると、通常、シード・フレーズをどこかに書き留め、安全に保管するよう求められます。
可能な英単語のリストの例をここで見ることができる、このリストの長さは2048語であることにお気づきでしょう(この数については、また後ほど説明します)。
BIP-39とは?
ニモニックシードフレーズを保存するというこのアイデアは、2013年にBIP(Bitcoin Improvement Proposal);BIP-39で導入されました。この提案は、ランダムなエントロピーを生成し、それを一連の覚えやすい単語に変換する標準化された方法を提供します。
シードフレーズはどのように生成されるのか?
まず、シードフレーズがランダムに生成されることを確認する必要があります、結局のところ、私たちは他の誰かが誤って私たちの財布に入り、私たちの資金にアクセスすることを望んでいません。
そのために、CSPRNG( Cryptographically secure pseudorandom number generator)を使って乱数を生成します:
この乱数はエントロピーと呼ばれます。このエントロピーは、シード・フレーズを形成する単語のセットを作成するのに使われる。この場合、128ビットは12ワードに対応するが、以下のような他の長さを使うことも可能である:
15単語: 160ビット
18単語: 192ビット
21ワード:192ビット 224ビット
24ワード 256ビット
では、このビットを使ってどのようにシードフレーズを作るのか?ビットと単語の関係は?まず、エントロピーのチェックサムが作成され、128ビットに付加される。これは、エントロピーの完全性を保証するために作成された4ビットのハッシュである。
つまり、128ビットのエントロピー+4ビットのチェックサムで、合計132ビットになる。次に、132ビットを2進数に変換する。具体的には、11ビットの塊に分割する。
これで12個の2進数の集合ができ、それぞれの長さは11ビットとなる。ヒント:12個の数字があるので、シード・フレーズは12ワードになる!
リストには2048個の単語があり、2048が選ばれたのは、11ビットで作れる2進数が2048通りあるので、2048が2^11になるからである。
あとは、これらの2進数を単語リストの単語に変換するだけだ。これは、2進数をインデックスとして使用し、単語リストの単語を検索することで実行される。例えば、2進数が10の場合、(インデックス0から始まるので)リストの9番目の単語を使う:
000000111,(2進数で7)はリストの8番目の項目で、これはabstractです!
11111111111、(2進数で2047)はリストの最後の項目(2048番目)で、「zoo 」である。
これを12回、11ビットの数字ごとに1回ずつ繰り返すと、12個の単語を含むシードフレーズになる。
![](https://assets.st-note.com/img/1731549357-dOkI7v9wWGCtZAX4DhmYx3n0.png?width=1200)
ランダムなエントロピー値を生成し、それをバイナリのチャンクに分割し、それらのバイナリ値を単語リストの単語を検索するためのインデックスとして使用することで、ランダムなシードフレーズに行き着く。
誰か、私のシードフレーズを当てられる?
これに対して、あなたはすぐにこう反応するかもしれない: 「2048語しかないのなら、誰かが私のシード・フレーズを当てることはできないのだろうか?」 まあ、技術的にはイエスだが、それは本当に...本当に、ありえないことだ。どのように可能性が低いか?
128ビットのランダム生成ステップを忘れて、リストから12個の単語を手動で選ぶとしよう。単語を選択するたびに、2048語のプールの中から1つの選択肢を選ぶことになる。
つまり、他の誰かがこの同じ単語の並びを推測するためには、1/2048の確率で12回連続して私たちと同じ単語を正しく推測する必要があると言えます。今、あなたは「 そんなに難しくなさそう .... ..」と思っているでしょう?でも、実際にやってみましょう:
最初の単語:2048の選択肢
つ目の単語:2048の選択肢
12個まで:2048の選択肢
これは2048×2048×2048......12回。あるいは2048^12。これは...途方もなく大きな数だ。ざっと、5,000億、あるいは5,000億。私たちには理解できないが、やってみよう...
1秒間に1兆個のシードフレーズを推測できる非常に強力なコンピュータを使って、あなたが今すぐ推測を始めたとしよう。このマシンが1つのフレーズを当てるのに159兆年かかる。あるいは(何を信じるかにもよるが)、現在の宇宙年齢のおよそ11,000倍もかかることになる。
24語のシードフレーズは12語より優れているのか?
128ビット(12単語)を選ぶウォレットもあるが、最近のウォレットはシードフレーズとして24単語を覚えるよう求めている!これまたとんでもなく大きい。
![](https://assets.st-note.com/img/1731549640-eYxzEL9CSZvlbMA58H4WinNq.png?width=1200)
シードフレーズから秘密鍵が生成される仕組み
さて、12単語のシード・フレーズを手に入れたが、それを使ってどのようにアカウントの秘密鍵を作成するのだろうか。そのためには、シード・フレーズをウォレットの生成に使用できるバイナリ・シードに変換する必要がある。このプロセスには以下のステップが含まれる:
オプションとして、ユーザーは追加のパスワードを提供する。
PBKDF2(Password-Based Key Derivation Function)と呼ばれるアルゴリズムが、次のものを取り込む: シードフレーズ。文字列「ニーモニック」とオプションのパスワードの組み合わせ。
このプロセス(鍵導出関数と呼ばれる)は、擬似ランダム関数としてHMAC-SHA512と呼ばれる別のアルゴリズムを使用して、バイナリシードと呼ばれる64バイトのハッシュ値を出力する。
出力された64バイトのハッシュ値は、他のビットコイン標準、すなわちBIP-32とオプションでBIP-32の拡張であるBIP-44に由来するロジックを使用してアカウントを生成するために使用することができます。
BIP-32とは?
BIP-32は、階層的決定論的(HD)ウォレットを導入します。ここでは、1つのシードから多くのウォレットを派生させることができ、それらのウォレットからさらに多くのウォレットを派生させて、ウォレットの「ツリー」を作成することができます。
BIP-44とは?
BIP-44は、次の構造に従って特定の派生パスを実装することにより、単一のバイナリシードからウォレット構造の階層を作成するための標準化された方法を提供します:m / purpose' / coin_type' / account' / change / address_index:
purpose: 使用されるBIP標準を識別します。BIP-44の場合、44'です。
coin_type : 暗号通貨を指定する。例えば、ビットコインは0'、イーサリアムは60'。
account : 異なるユーザーアカウントを区別する。
change : アドレスの種類を示す: 0は受信、1は変更。
address_index : 同じアカウントと変更タイプの各アドレスに一意なインデックスを提供します。
すべてのウォレットがBIP-44を使用しているわけではありませんが、バイナリシードからどのようにアカウントを派生させるかを標準化する一般的な方法です。
バイナリ・シードから秘密鍵はどのように作られるのか。
先に述べたように、秘密鍵は64文字の16進数で32バイトである。では、この64バイトのハッシュ値を使って、どのように秘密鍵を作成するのだろうか。
まず、ハッシュを32バイトずつ2つに分割する:
前半はマスター秘密鍵である。前半はマスター・プライベート・キーで、バイナリ・シード(あなたのシード・フレーズを使って生成された)とあなたのウォレットを直接1-1でマッピングしたものです。この鍵は、子鍵を作成する際に使用することができる。
後半はチェーンコードである。これは、子鍵が漏洩してもマスター鍵が安全であることを保証するためのものである。子鍵は一貫して作成でき、それぞれ一意である。
ここまでで、秘密鍵がどのようなものか、どのようにランダムに生成されるのか、そして1つのシード・フレーズから複数の鍵がどのように導き出されるのかを理解した。次に、公開鍵が秘密鍵からどのように派生するかを見ていこう。
公開鍵と秘密鍵の仕組み
楕円曲線暗号(ECC)を使えば、与えられた秘密鍵に対する公開鍵を割り出すことができる。楕円曲線にはさまざまな種類があるが、ビットコインとイーサリアムの両方で使われているのはsecp256k1と呼ばれるものだ。
この楕円曲線の仕様には、曲線の他の点を作るための出発点として使われる基点Gが含まれている。この始点から、ある回数(秘密鍵によって決定される)、特定の方法で曲線の周りを 「移動 」する。このプロセスを止めたときに行き着く曲線上の点が、私たちの公開鍵となる。
曲線の周りを 「移動 」する方法をスカラー倍算と呼ぶ。楕円曲線を扱う場合、スカラーとは曲線上の点を拡大縮小するために使われる数値を指す。基点Gを取り、そこにスカラー数を適用し、その点を「伸ばす」ことによって曲線上の新しい点に到達する。
基点に適用するスカラー番号は、私たちの秘密鍵である、簡単に言えば、始点Gに秘密鍵をスカラー倍して公開鍵に到達するのだ。
![](https://assets.st-note.com/img/1731550024-4dDFTg6HWpCSArMz73JIqoKf.png?width=1200)
実際には、曲線は素数体Ȓp上で定義されるため、散らばった点の束のように見えるが、楕円曲線の性質は変わらない。
このスカラー倍処理(<秘密鍵>の周りを何度も跳ね回る)が終わると、私たちは曲線上の新しい点に行き着き、それが私たちの公開鍵となる。このプロセスはこのようなものだと想像できるだろう:
![](https://assets.st-note.com/img/1731550000-Mdu2CIVmLNtEzTa4frGAh8YQ.png?width=1200)
ブロックチェーンの公開鍵は何に使われるのか?
公開鍵はその名の通り、誰とでも公に共有することができます。公開鍵は以下のような用途に使われる:
ブロックチェーン上で誰がトランザクションを送信したかを確認する。
他のウォレットからETHなどの資金を受け取る。
秘密鍵がメッセージに署名したかどうかを検証するために使用できます。
まとめ
ウォレットは、楕円曲線暗号を使用してユーザーが自分のアカウントからトランザクションを送信したりメッセージに署名したりできるようにするブロックチェーンの不可欠なコンポーネントです。
しかし、Abstractのようないくつかのブロックチェーンは、スマートコントラクトアカウントと呼ばれる、より多くの機能を提供し、より強力なセキュリティや回復メカニズムなどを可能にする新しい種類のウォレットもサポートしています。
Abstract Offiicial links
Website: https://www.abs.xyz/
X: https://x.com/AbstractChain
Discord: https://discord.gg/abstractchain
YouTube:https://www.youtube.com/@AbstractBlockchain
Instagram: https://instagram.com/abs/
Meme Depot: https://memedepot.com/d/abstract
翻訳 by https://x.com/yuyumannn