読了時間:7分
概要
暗号技術やブロックチェーンにおいて、秘密鍵は最も機密性の高いデータの一つです。しかし、カストディアルウォレット(ウォレットプロバイダーがユーザーの秘密鍵を管理するタイプ)とノンカストディアルウォレット(ウォレットユーザーが秘密鍵を管理するタイプ)のどちらを選ぶべきかについては、常に議論や混乱が生じてきました。 本ガイドでは、カストディアルウォレットとノンカストディアルウォレットの違いについて詳しく解説し、Quicknode を使用してノンカストディアル取引を行う方法について詳しく説明します。
前提条件
- お使いのシステムにNode.jsがインストールされていること。
- テキストエディタ。
- ターミナル、別名コマンドライン。
非カストディアルウォレットとは何ですか?
非カストディアルウォレットとは、ウォレットの所有者が完全な管理権を持ち、秘密鍵を自ら保管するブロックチェーンウォレットのことです。 非カストディアルウォレットの作成および利用には、2つの方法があります。1つは秘密鍵(英数字の文字列)を使用する方法、もう1つはニーモニックシードフレーズ(12~24語のフレーズ)を使用する方法です。ニーモニックシードフレーズはウォレット所有者側で保管され(通常は書き留めて、インターネットやコンピュータから隔離された安全な場所に保管されます)、これを使用してウォレットにアクセスします。
非カストディ型ウォレットには、以下のような利点があります:
- 自律性— ユーザーは自身の資金を完全に管理しています。なぜなら、ユーザーこそが自身の資金を完全に管理できる唯一の存在だからです。ウォレットの管理やセキュリティ確保において、第三者に依存する必要はありません。
- 安全性― ユーザーが秘密鍵をインターネットやコンピュータから切り離した場所に保管するため、セキュリティ侵害が発生する可能性はほぼ皆無です。
- 即時出金- 非カストディアルウォレットを利用すれば、ユーザーは出金リクエストの承認を第三者に頼る必要がありません。これにより、プロセス全体が効率化され、即時出金が可能になります。
非カストディ型ウォレットとカストディ型ウォレット
- 秘密鍵の管理主体- 暗号資産ウォレットを比較する際に最も重要な要素は、秘密鍵の管理権限の所在です。非カストディアル型ウォレットの場合、ユーザーが秘密鍵を管理します。一方、カストディアル型ウォレットでは、第三者(通常はウォレットプロバイダーや取引所)が秘密鍵を管理します。
- 取引の種類- 非カストディアルウォレットによる取引は、オンチェーン上で即座に確認できます。一方、カストディアルウォレットによる取引は、第三者によるさまざまなチェックを経る必要があり、遅延が生じやすい傾向があります。
- セキュリティ- 非カストディアル型ウォレットでは、ユーザーが秘密鍵をローカルに保管します。ユーザーが秘密鍵を他人と共有したり、デバイスが盗難に遭ったりしない限り、このウォレットは非常に安全です。一方、カストディアル型ウォレットでは、秘密鍵などの機密性の高いユーザーデータはすべて、ホットストレージ(即時に更新される)やコールドストレージ(随時更新される)に保存されますが、これらは通常、ハッキングの標的になりやすい傾向があります。
- オフラインでの利用- 非カストディアル型ウォレットは、常時インターネット接続を必要としません。一方、カストディアル型ウォレットは、データが通常、中央集権型のサーバーに保存されているため、インターネット接続が必要です。
- バックアップと復旧- 非カストディアルウォレットの唯一の欠点は、秘密鍵やニーモニックシードを一度失うと、ウォレットを復旧する方法が一切ないことです。対照的に、カストディアルウォレットのユーザーは、第三者に復旧を依頼することができます。
非カストディアルノードの使用
Quicknodeでは、世界中で多数のノードを運用しています。これらのノードはすべて常にインターネットに接続されており、動的に変化しています。QuicknodeのAPIは、高性能なノードからなるグローバルネットワークに接続されています。これらのノードは、常に単一のインフラストラクチャコンポーネントに接続されているわけではありません。APIは、安定性と稼働率を向上させるため、個々のインフラストラクチャコンポーネント間で動的に切り替えを行うように設計されています。そのため、ノードは常に変化しているため、機密データをノード上に保存することは望ましくありません。 また、これらのノードはインターネットに公開されているため、セキュリティ上の懸念もあります。ユーザーのデータの安全性を確保するため、ノードに秘密鍵を保存することは許可していません。 また、ノードは動的であるため、パフォーマンスを向上させるために頻繁に状態が変化します。これにより、鍵が失われる可能性があり、結果としてユーザーのデータが失われる恐れがあります。これらが、非カストディアルノードを運用し、ユーザー自身がウォレットの唯一の管理主体となるようにした理由です。次のセクションでは、ライブラリを使用してウォレットを作成し、非カストディアルな取引を行い、Quicknode を使用して送信する方法について解説します。
Quicknodeのイーサリアムエンドポイントを設定する
今日の目的であれば、Geth や OpenEthereum(旧称 Parity)など、ほぼどのイーサリアムクライアントでも使用可能です。ただし、トランザクションの送信には少し手間がかかるため、ここではQuicknode の無料アカウントを作成し、簡単にイーサリアムのエンドポイントを生成することにします。送金には Kovan テストチェーンを使用します。無料のイーサリアムエンドポイントを作成したら、HTTP プロバイダーの URL をコピーしてください:

後で必要になるので、コピーして保存しておいてください。
ウォレットを作成し、テスト用のETHを入手する
ウォレットの作成には、数あるWeb3ライブラリのどれでも利用できます。今回は、JavaScriptライブラリであるethers.jsを使用して、トランザクションの署名と送信を行うウォレットを作成します。また、Go/Python/Ruby/PHPでのイーサリアムウォレットの作成方法については、当サイトのガイドもご参照ください。
node.js に付属する npm(Node Package Manager)を使用して、ethers をインストールします。cmd またはターミナルを開き、以下のコマンドを入力して、node.js がインストールされているかどうかを確認してください:
node -v
これで、インストールされている Node.js のバージョンが表示されるはずです。インストールされていない場合は、Node.js の LTS バージョンを公式サイトからダウンロードしてください。
プロジェクト用の新しいディレクトリを作成し、cmd/ターミナルでそのディレクトリを現在の作業ディレクトリに設定しましょう:
mkdir noncusTransaction
cd noncusTransaction
次に、以下のコマンドを入力して「ethers」をインストールしてください:
npm i ethers@5.7
Ethers.js バージョン 5.7 をインストールしていることを確認してください
このステップで最もよく発生する問題は、`node-gyp` の内部的な不具合です。node-gyp のインストール手順については、こちらをご覧ください。
注:node-gypに関する問題が発生した場合は、お使いのPythonのバージョンが、上記の手順に記載されている互換バージョンのいずれかと一致している必要があります。
もう1つよくある問題として、キャッシュが古くなっていることが挙げられます。cmdやターミナルで以下のコマンドを入力するだけで、npmのキャッシュをクリアできます:
npm cache clean
すべてが順調に進めば、ethers.js がシステムにインストールされます。
それでは、テキストエディタを開き、「transaction.js」という名前の新しいJavaScriptファイルを作成してください。以下の内容をそのファイルにコピー&ペーストしてください。
var ethers = require('ethers');
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.ウォレット(秘密鍵);
コンソール.log("アドレス: " + wallet.address);
上記のコードの説明:
1行目:ethersライブラリをインポートします。
2行目:秘密鍵を変数「privateKey」に格納します。必ずご自身の秘密鍵を使用してください。秘密鍵の生成方法については、JavaScript を使用した秘密鍵の生成に関するこのガイドを参照してください。
注:コードをインターネット上(公開GitHubリポジトリなど)に公開する場合は、秘密鍵を.envファイルに保存し、環境変数を通じてメインのコードで読み込むようにするのが常に良い慣行です。
3行目:秘密鍵を使用して新しいウォレットアドレスを作成し、それを変数「wallet」に格納します。
4行目:ウォレットアドレスと文字列を一緒に表示します。
それでは、ファイルを保存して、スクリプトを実行してください。
ノードトランザクション
こんな感じになるはずです。
それでは、トランザクションの送信やガス料金の支払いに使うテスト用のETHを入手しましょう。出力欄からアドレスをコピーし、KovanのファウセットにアクセスしてGitHubまたはGitLabでログインします。ファウセットのテキストフィールドにウォレットアドレスを貼り付け、「Send me KETH!」をクリックしてください。

KovanのEtherscanにアドレスを貼り付けることで、テスト用のETHを受け取ったかどうかを確認でき、ETHの残高が表示されます。

非カストディアル取引の送信
先ほど作成したウォレットを使ってトークン転送トランザクションを作成し、Quicknode を使ってそのトランザクションをチェーンに送信しましょう。
transaction.js を次のように更新してください:
var ethers = require('ethers');
var url = ''ADD_YOUR_ETHEREUM_NODE_URL'';
var customHttpProvider = new ethers.providers.JsonRpcProvider(url);
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
tx = {
to: "0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE",
value: ethers.utils.parseEther("0.05"),
chainId: 42,
nonce: 11
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
tx.gasLimit = estimate;
tx.gasPrice = ethers.utils.parseUnits("3.14085197", "gwei");
wallet.signTransaction(tx).then((signedTX)=>{
customHttpProvider.sendTransaction(signedTX).then(console.log);
});
});
それでは、`ADD_YOUR_ETHEREUM_NODE_URL` を、上記のセクションに記載されている HTTP プロバイダーに置き換えてください。
上記のコードの説明。
1行目:ethersライブラリをインポートしています。
2行目:QuicknodeのURLをurl変数に格納します。
3行目:新しいethersプロバイダーをインスタンス化し、変数customHttpProviderに格納します。
4行目:秘密鍵をprivateKey変数に格納します(秘密鍵はご自身で生成する必要があります)。
5行目:秘密鍵から新しいウォレットを作成する。
6行目:ウォレットアドレスと文字列を一緒に出力します。
7行目~12行目:トランザクションオブジェクトを初期化し、パラメータを指定します。まず「to」には受信者のアドレス(トランザクションを送信する先の任意のアドレス)を指定します。次に「value」には、送金するETHの金額を指定します。3つ目に「chainId」にはチェーンのネットワークIDを指定します(ここではKovanテストネットを使用しているため、42となっています)。 最後に、「nonce」は送信者がこれまでに送信したトランザクションの回数を表します。この値は、常にこれまでのトランザクション数+1である必要があります。
また、ethers.jsのgetTransactionCount()メソッドを使用することで、指定されたアドレスのノンセを取得することもできます。
13~14行目:プロバイダーを使用してガス量を推定し、それをトランザクションオブジェクトの gasLimit 変数に格納します。
15行目:ガス価格を設定し、トランザクションの gasPrice 変数に格納する。
16行目:ウォレットを使用してトランザクションに署名する。
17行目:プロバイダを使用して署名済みトランザクションを送信し、トランザクションの詳細をコンソールに出力します。
ファイルを保存し、次のコマンドで実行してください:
ノードトランザクション
次のような出力が得られます:

トランザクションのハッシュをコピーし、Kovan Etherscanの検索バーに貼り付けて、確認されたかどうかを確認してください。
結論
ノンカストディアル取引を完了し、ご自身の資金の唯一の管理者となられたことをおめでとうございます。秘密鍵は決して誰にも教えないでください。ウォレットと資金の安全性を高めるため、常に安全な場所に保管してください。
イーサリアムに関する記事やガイドをもっと読みたい方は、ニュースレターにご登録ください。また、TwitterやDiscordコミュニティサーバーでもいつでもご連絡いただけます。そこには、あなたがこれまでに会った中で最もクールな開発者たちが集まっています :)
皆様からのフィードバックを心よりお待ちしております!❤️
ご意見や新しいトピックに関するご要望などがありましたら、ぜひお知らせください。皆様からのご連絡を心よりお待ちしております。
