https://d226lax1qjow5r.cloudfront.net/blog/blogposts/connect-to-the-ethereum-blockchain-with-node-js-and-vonage-dr/Blog_Blockchain-Event_1200x600.png

Node.jsとVonageでイーサリアム・ブロックチェーンに接続する

最終更新日 November 5, 2020

所要時間:4 分

ブロックチェーンはよく使われる用語で、それに関連する多くの革新的な技術がある。ブロックチェーンは文字通り、ブロックの連鎖であり、各ブロックは公開データベースであるチェーンに保存された情報の一部である。そのようなブロックチェーンの1つがイーサリアムであり、ブロックチェーンの概念をまったく新しいレベルに引き上げている。

イーサリアムは分散型台帳であり、ユーザーはコードの実行とデータの更新に便利に合意することができる。実行されるコードは分散アプリケーションであり、ユーザーインターフェイスとブロックチェーン上のデータ間のインタラクションを可能にするロジックを含んでいる。ブロックチェーンとユーザーインターフェイス間のインタラクションの主要な促進要因はイベントである。

スマート・コントラクトはブロックチェーンからイベントを発信し、ユーザー・インターフェースはそれをリッスンして特定のアクションを有効にしたり、イベント・ログ(データ)をブロックチェーンに書き込んだりすることができる。これらのログはユーザー・インターフェースから要求することもできる。

このチュートリアルでは、ブロックチェーンイベントについて学び、これらのイベントをどのように Conversion APIとどのようにリンクさせることができるかを学びます。とどのようにリンクさせることができるかを学びます。

この記事のコードは GitHub.

前提条件

{"type":"signUp","props":{"number":false}}

アプリケーションの作成

Vongage Conversation APIを使い始めるには、まずアプリケーションを作成する必要があります。これはVonage APIダッシュボードから "Create a New Application "ボタンをクリックすることで行えます。

Create Vonage APIs ApplicationCreate Vonage APIs Application

作成プロセス中に、公開鍵と秘密鍵が生成されます。秘密鍵は自動的にローカル・マシンにダウンロードされますので、大切に保管してください。

アプリケーションが作成されると、アプリケーションIDとAPIキーが発行され、Vonage APIアプリケーションにプログラムでアクセスできるようになります。

依存関係のインストール

コードを書き始める前の最後のステップは、NPMを使ってNode.jsの依存関係をインストールすることだ:

npm init -y npm install web3 nexmo@beta dotenv npm install nodemon --save-dev

次に、アプリケーションの実行を助けるNPMスクリプトをいくつかセットアップする:

"scripts": { "start": "node nexmo.js", "develop": "nodemon nexmo.js" }

Solidity契約のセットアップとコンパイル

ソリディティは、イーサリアム・ブロックチェーン上でスマート・コントラクトを作成するために使用される高水準プログラミング言語です。このチュートリアルでは、メッセージが送信されたらイーサリアム・ブロックチェーンからイベントを発行するスマートコントラクトをセットアップします。

contract TextMessage {
    // define event
    event NewText(address sender, string content);
    function sendMessage(address _sender, string memory _content) public {
        // emit event
        emit NewText(_sender, _content);
    }
}

次に、このスマート・コントラクトをNode.jsアプリケーションで簡単に使える形にコンパイルする。このコンパイルは トリュフ.

truffle compile

コンパイルが完了すると、スマート・コントラクトを記述したJSONファイルがカレント・ディレクトリ内の build/contractsフォルダに生成される。

Node.jsアプリケーションのセットアップ

アプリケーションをスムーズに実行するために、いくつかの環境変数を設定する必要がある。これらによって、Vongage Conversation API を使ってイーサリアム・ノードと簡単にやり取りできるようになる。

const dotenv = require('dotenv');
const fs = require('fs');
const path = require('path');
dotenv.config();

const pkey = fs.readFileSync(path.join(__dirname, 'private.key'), 'utf8');

module.exports = {
    NEXMO_PRIVATE_KEY: pkey,
    NEXMO_APPLICATION_ID: process.env.NEXMO_APPLICATION_ID,
    NEXMO_API_KEY: process.env.NEXMO_API_KEY,
    NEXMO_APP_SECRET: process.env.APP_SECRET
    };

NexmoアプリケーションID、APIキー、APPシークレットは、アプリケーションのダッシュボードで確認できます。 .envファイルに保存する必要があります。これらの定数はVonage SDKインスタンスで初期化されます。

const { NEXMO_API_KEY, NEXMO_APPLICATION_ID, NEXMO_APP_SECRET, NEXMO_PRIVATE_KEY } = require('./config');
    
const nexmo = new Nexmo({
    apiKey: NEXMO_API_KEY,
    apiSecret: NEXMO_APP_SECRET,
    applicationId: NEXMO_APPLICATION_ID,
    privateKey: NEXMO_PRIVATE_KEY
});

Videoage Conversation APIは、複数のチャネル(Voice、Text、Video)でのリアルタイムコミュニケーションを可能にするAPIのホストを提供します。これらのチャネルを介した対話は 会話.

nexmo.conversations.create({
    "name": CONV_NAME,
    "display_name": CONV_DISPLAY_NAME}, (error, result) => {
        if(error) {
            console.error(error);
        }
        else {
            console.log(result);
        }
    });

返された会話IDは、この会話で発生するイベントの発信とリッスンに使用される。

ユーザー作成される 作成されるこの会話に参加するために メンバーシップ.また、その結果のメンバーIDも記録します。

nexmo.conversations.members.create(CONVERSATION_ID,
        {"action":"join", "user_id":USER_ID, "channel":{"type":"app"}},
        (error, result) => {
        if(error) {
            console.error(error);
         }
        else {
            console.log(result);
        }
    });

イーサリアム・ブロックチェーンに接続する

ローカルのイーサリアム・ノード(イーサリアム・ネットワークに接続するプログラム。 Ganache-cliが提供するイーサリアムネットワークに接続するプログラム) とやり取りするために、Node.js を介して Web3これは、JavaScript と Node.js アプリケーションが Ethereum Node に接続するための API を提供するライブラリのセットです。

const Web3 = require('web3');
    
const provider = new Web3.providers.WebsocketProvider('ws://localhost:8545');
let web3 = new Web3(provider);

ここでは、Node.jsアプリケーションをRPCクライアントに接続するWebSocketプロバイダーを使用します。 Ganache-cliRPC クライアントに接続します。このプロバイダーは、Node.jsアプリケーションをRPCクライアントに接続する。 Ganache-cliコマンドでインストール後に起動する必要がある:

ganache-cli

次に、スマート・コントラクトに関する情報をNode.jsアプリケーションに渡し、コントラクトをインスタンス化する。コントラクト情報は ABI(Application Binary Interface)に含まれている。

let senderAccount = '0xA825e2B7b37377E955b8b892249611EAc7d8d3a0';
    
const contractJSON = JSON.parse(fs.readFileSync('../build/contracts/TextMessage.json'), 'utf8');
    
const abi = contractJSON.abi;
    
const contract = new web3.eth.Contract(abi, senderAccount);

上のコード・スニペットで、トランザクションの送信元となるアカウントが必要なことにお気づきだろう。 Ganache-cli開発プロセス全体を通して使用される、いくつかのテストアカウントとそれに関連する秘密鍵が用意されている。

Ganache-cli provides a couple of test accounts and their associated private keys which are used throughout the development processGanache-cli provides a couple of test accounts and their associated private keys which are used throughout the development process

ネットワークにメッセージを送る

次に、Ethereum Node にメッセージを送信し、トランザクションハッシュが利用可能になったら Conversation イベントを作成する。Conversationイベントにはトランザクションのデータ(送信されたメッセージ)が含まれる。

let receiverAccount = '0x7A5c662d8af4085a579586D50C2027320e5a13c3';
    
contract.methods.sendMessage(senderAccount, receiverAccount, message).send({
    from: senderAccount,
    // gas: 8500000,         // Gas sent with each transaction 
    gasPrice: 20000000000,  // 20 gwei (in wei) 
}).on('transactionHash', function (hash) {
    console.log('hash: ', hash);
    
    //send conversation event to create text
    nexmo.conversations.events.create(NEXMO_CONVERSATION_ID, {
        "type": "text",
        "from": NEXMO_MEMBER_ID,
        "body": {
            "text": message
        }
    }, (error, res) => {
        if (error) {
            console.error(error);
        } else {
            console.log('new text on the blockchain: ', res);
        }
    });
});

ブロックチェーン・イベントを聴く

ブロックチェーンから発信される NewTextイベントをリッスンすることもできる。このイベントが成功したら、ブロックチェーンからのメッセージをリッスンするためにユーザー・インターフェースで使用できるカスタムConversationイベントを発することができる。

contract.events.NewText(function (error, event) {
    if (error) {
        return error;
    } 
}).on('data', function (data) {
    nexmo.conversations.events.create(NEXMO_CONVERSATION_ID, {
        "type": "text:delivered",
        "from": NEXMO_MEMBER_ID,
        "body": {
            "text": data
        }
    }, (error, result) => {
        if (error) {
          return error;
        } else {
          return event;
        }
    });
})

すべてをまとめる

いよいよアプリケーションのテストだ!まず Ganache-cliでスマート・コントラクトがコンパイルされていることを確認する。 Truffle.これらが完了したら npm startを実行します。

ターミナルで Ganache-cliログを見ると eth_sendTransactioneth_subscribeAPI がイーサリアムノード上で呼び出されていることがわかります。これは、Node.js アプリケーションによるトランザクションの開始とイベントのサブスクリプションを示しています。

Logs in the terminalLogs in the terminal

次はどうする?

このアプリケーションをベースに、より強固なエラー処理、ブロックチェーン上のメッセージのインデックス化など、ブロックチェーン上に本格的なチャットアプリケーションを構築することができる!

シェア:

https://a.storyblok.com/f/270183/400x427/7650fcc47e/calebikhuohon.png
Caleb Ikhuohon

Caleb is a software developer who loves learning, teaching, building, and collaborating on distributed software systems that provide amazing value to its users