ConohaWINGでNode.jsを使いUNISWAP V2 APIでETH/USDTの最新価格を取得しWordPressで表示する
はじめに
最新のETH/USDのペア価格などは、CryptCompareなどから取得可能ですが、無料の公開APIは帯域制限や商用での利用制限があります。
また、このようなAPIでは、API提供者を信用する必要性が発生します。
一方、The Graphから、Uniswapのサブグラフを使って仮想通貨ペア価格も取得可能ですが、クエリを一定数行うと有料になってしまいます。
さらに、多くのエンジニアやDeFierにとって、多額のAPI費用を払う金銭的余裕はありません。
これを解決するために、今回は激安で最速のConohaWINGのWordPressレンタルサーバにNode.jsをインストールし、バックエンドでInfuraやAlchemyなどのブロックチェーン・アズ・ア・サービスを使います。
そして、直接Uniswap V2コントラクトにアクセスし、最新の価格を計算し取得します。
また、最新のETH/USDTのペア価格をWordPressから簡単なJSON APIとして公開します。
これにより、無料でかつトラストレスに取得した最新のETH/USDTのJSONを、フロントエンドのJavaScriptで通信制限や商用利用制限に触れることなく利用することができます。
他のAPIやアプリに頼ることないので、APIサービスへの通信オーバヘッドを減らすことができます。
それに加え、トラストレスに最新価格知る必要があるとき(DeFiボットの作成など)に必須スキルだと思われます。
ペア価格の最小桁数も、プログラムを使って独自に設定できるので、ちょっとした価格変動も見逃しません。
以下にて、その方法をご紹介します。
手順
手順1~3までは、「ConohaWINGでNode.jsを使いイーサリアムの最新ブロック情報を取得しWordPressで表示する」と同様です。
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. UniswapV2ペアコントラクトのABI (Application Binary Interface) を取得
コントラクトのメソッドにアクセスするにはABIが必要になります。
$ curl -O https://unpkg.com/@uniswap/v2-core@1.0.0/build/IUniswapV2Pair.json
5. ETH/USDTの価格を取得し、JSONを出力するJavascriptコードの実装
以下、Javascriptコードを実装します。
const fs = require('fs');
const themePath = '[出力したいWordPressテーマのディレクトリ]';
const Web3 = require('web3');
const UniswapV2Pair = require('[4のABIを配置したディレクトリ]/IUniswapV2Pair.json');
async function getEthPriceOnUniswap() {
const web3 = new Web3('[3で取得したInfuraやAlchemyのAPIのURL]');
const pairAddress = '0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852'; // UniswapV2 ETH/USDTのペアアドレス
const pairContract = new web3.eth.Contract(UniswapV2Pair.abi, pairAddress);
const reserves = await pairContract.methods.getReserves().call(); // 最新リザーブの取得
const token0 = await pairContract.methods.token0().call();
// const token1 = await pairContract.methods.token1().call();
let ethReserve, usdtReserve;
if (token0.toLowerCase() === '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2') { // WETHアドレスの確認
ethReserve = reserves[0] ? reserves[0] : reserves;
usdtReserve = reserves[1] ? reserves[1] : reserves;
} else {
ethReserve = reserves[1] ? reserves[1] : reserves;
usdtReserve = reserves[0] ? reserves[0] : reserves;
}
const ethPrice = ((usdtReserve) / (ethReserve) ) * (10 ** 12); // 現在価格の計算
const latestEthUsdt = {"USDT":ethPrice.toFixed(2),"time": Date.now()}
console.log(`Current ETH/USDT price on Uniswap: ${ethPrice.toFixed(2)}`); //小数点第三位を四捨五入し第二位まで表示する
fs.writeFile( themePath + 'latestEthUsdt.json', JSON.stringify(latestEthUsdt), (err, data) => {
if(err) console.log(err);
else console.log('write end');
});
}
getEthPriceOnUniswap();
UNISWAP V2 APIに関して、ethereum.orgのわかりやすい記事があります。
残念ながら、現在英語ですが、近々、日本語訳も公開予定です!
翻訳されたものがお望みでしたら、公開前の日本語訳はこちらからアクセスできます。
※再度となりますが、ethereum.orgの翻訳ボランティアへの参加、お待ちしております。
6. cronで定期実行
ConohaWINGでは、cronのようなものが使えます。
cronを開き、イーサリアムのブロックが更新される12秒ごとにジョブを実行します。
イーサリアムのブロックと共にリザーブ量が変化し、ペア価格が更新されるため、同様に12秒ごとになります。
※最新のブロック情報を、誰よりも早く価格を取得したいならば、もっと頻度を増やす必要があるかもしれません。
$ crontab -e
* * * * * PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getEthUsdtPair.js
* * * * * sleep 12; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getEthUsdtPair.js
* * * * * sleep 24; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getEthUsdtPair.js
* * * * * sleep 36; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getEthUsdtPair.js
* * * * * sleep 48; PATH="$PATH:/home/$USER/[Node.jsインストール先]/share/nodejs/node-v14.13.1-linux-x64/bin" node ~/getEthUsdtPair.js
7. 動作確認
WordPressで出力されたJSONを取り込み、表示するプログラムを実装します。
これにより、12秒ごとにETH/USDTの最新価格をインターネットを通してJSONで取得できます。
以下にて、JSONを公開してますので約12秒ごとに最新価格が更新されていることを確認ください。
※小数第三位以下の変動は、四捨五入しているので表示されません。
※ブロックチェーンノードやサービスの遅延などで12秒ごとに取得できない場合もあります。
また、サンプルとして当ホームページのトップページの2段目のグラフセクションにて12秒ごとにETH/USDTの最新価格を表示するガジェットを実装しています。
ご覧いただけますと幸いです。
まとめ
国内最速激安ConohaWINGレンタルサーバ(月1000円程度)にて、ETH/USDTの最新価格を取得する簡単なJSON APIを実装することが出来ました。
トレードの分野では、他者に出し抜かれないように素早くトラストレスに価格情報を取得する必要がありますが、このような方法で実現可能です。
※AlchemyやInfuraなどのクラウドのブロックチェーンではなく、自分のノードを持っていればよりベストだと思います
また、制限の多い公開ノードを使うことなく、安定しており、比較的トラストレスなInfuraやAlchemyなどのブロックチェーン・アズ・ア・サービスを無料枠内で活用しました。
この実装の場合、(Infuraのダッシュボードを見ると)2リクエスト/12秒となるので、一日でも、14,400 (2560*24) リクエストです。
Infuraの場合の無料枠は、上限100,000/日ですので、まだまだ無料枠を使って他の機能が実装が可能です。
最後に、ConohaWINGの契約をしたい場合は、当リンクから申し込みいただけますと幸いです。
また、コードで不明な点や、改善点があれば、ご指摘いただけますと大変ありがたく存じます。
ここまで読んでくださり、ありがとうございました。