ConohaWINGでNode.jsを使いイーサリアムの最新ブロック情報を取得しWordPressで表示する
はじめに
イーサリアムの最新のブロック情報は、Ethers.js等の公開RPCを使用して無料で取得することもできますが、リクエスト制限や通信制限により、取得できない場合があります。
また、Ethers.jsをフロントエンドのJavaScriptに実装すると、公開RPCへ思わぬアクセス数の上昇が発生すると、またたく間に制限がされてしまいます。
これを回避するために、今回は激安で最速のConohaWINGのWordPressレンタルサーバにNode.jsをインストールし、バックエンドでInfuraやAlchemyなどのブロックチェーン・アズ・ア・サービスを使ってイーサリアムのブロック情報を取得し、WordPressから簡単なJSON APIとして公開します。
これにより、取得した最新ブロック情報のJSONを、フロントエンドのJavaScriptで通信制限や商用利用制限に触れることなく利用することができます。
以下にて、その方法をご紹介します。
手順
1. ConohaWINGへSSHログイン設定とNode.jsのインストールを行う
ConohaWINGサーバには、残念ながら管理者権限がありません。
そのため、ユーザ権限で使用できるように特殊なインストール作業が必要になります。
SSH設定と管理者権限の無いConohaWINGのユーザーでNode.jsをインストールする手順がイブさんのブログにて公開されています。
こちらを参考にして①SSH設定と③Node.jsのインストールをしてください。
※イブさん、有益な情報ありがとうございました!
2. Web3.jsをインストールする
ConohaWINGで以下コマンドを実行し、Web3.jsをインストールしてください。
$ npm install web3
3. ブロックチェーン・アズ・ア・サービスでイーサリアムメインネットのAPIを作成する
InfuraやAlchemyなどのブロックチェーン・アズ・ア・サービスでイーサリアムメインネットのAPIを作成してください。
ethereum.orgのわかりやすい記事がありますので、手順通りに行うとAPIが作成できます。
残念ながら、現在英語ですが、近々、日本語訳も公開予定です!
翻訳されたものがお望みでしたら、公開前の日本語訳はこちらからアクセスできます。
※ethereum.orgの翻訳ボランティアへの参加、お待ちしております。
4. 最新ブロック情報をJSONで出力するJavascriptコードの実装
以下、Javascriptコードを実装します。
const fs = require('fs');
const Web3 = require('web3');
const web3 = new Web3('[3で取得したInfuraやAlchemyのAPIのURL]');
const themePath = '[出力したいWordPressテーマのディレクトリ]';
//最新ブロック番号の取得
web3.eth.getBlockNumber((error, latestBlockNumber) => {
if (error) {
console.log(error);
} else {
//最新ブロック情報の取得
web3.eth.getBlock(latestBlockNumber, (error, block) => {
if (error) {
console.log(error);
} else {
console.log(block);
//JSONファイルを出力
fs.writeFile( themePath + 'latestBlock.json', JSON.stringify(block), (err, data) => {
if(err) console.log(err);
else console.log('write end');
});
}
});
}
});
5. cronで定期実行
ConohaWINGでは、cronのようなものが使えます。
cronを開き、イーサリアムのブロックが更新される12秒ごとにジョブを実行します。
$ crontab -e
* * * * * PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getBlockInfo.js
* * * * * sleep 12; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getBlockInfo.js
* * * * * sleep 24; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getBlockInfo.js
* * * * * sleep 36; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getBlockInfo.js
* * * * * sleep 48; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getBlockInfo.js
6. 動作確認
WordPressで出力されたJSONを取り込み、表示するプログラムを実装します。
これにより、12秒ごとに新しいブロック情報をインターネットを通してJSONで取得できます。
以下にて、JSONを公開してますので約12秒ごとにブロック情報が更新されていることをご確認ください。
※ブロックチェーンノードやサービスの遅延などで12秒ごとに取得できない場合もあります。
また、サンプルとして当ホームページのトップページの2段目のグラフセクションにて12秒ごとにブロック情報を表示するガジェットを実装しています。
ご覧いただけますと幸いです。
まとめ
国内最速激安ConohaWINGレンタルサーバ(月1000円程度)にて、ブロックの最新情報を取得する簡単なJSON APIを実装することが出来ました。
また、制限の多い公開ノードを使うことなく、安定しており、比較的トラストレスなInfuraやAlchemyなどのブロックチェーン・アズ・ア・サービスを無料枠内で活用しました。
この実装の場合、2リクエスト/12秒となるので、一日でも、14,400 (2×5×60×24) リクエストです。
Infuraの場合の無料枠は、上限100,000/日ですので、まだまだ無料枠を使って他の機能が実装が可能です。
最後に、ConohaWINGの契約をしたい場合は、当リンクから申し込みいただけますと幸いです。
また、コードで不明な点や、改善点があれば、ご指摘いただけますと大変ありがたく存じます。
ここまで読んでくださり、ありがとうございました。