スマートコントラクトの基礎となる着金時のトリガープログラムを仮想通貨NEMで実装する。

  • 23
    いいね
  • 0
    コメント

スマートコントラクト、最近いろいろなところで聞くようになった話題ですが、その定義は人それぞれです。

それら共通に感じ取れることは、送金、着金の管理が煩わしく、お金を発生させる方がコストのかかってしまうような契約を技術的に解決してしまおうという動きです。
IoTなどがもう少し普及すれば、ロボット同士が労働の対価として仮想通貨をやりとりすることも出てくるでしょう。そういうと、もう少し先の話に聞こえるかもしれません。
でも、インターネット上を見渡せば、Web上ではすでにたくさんのロボットが活躍しています。

その実現のためにもどうしても必要な仕組みが、アカウントへの着金を確認したらサービスを開始するためのシステムです。

今回は仮想通貨NEMの場合に、どうやって着金を確認するかの方法を説明します。
といっても、今回も簡単です。

NEMにはとても優れたAPIが各ノードに標準実装されていて、WebSocket通信も可能です。
本来であれば、仮想通貨ネットワーク上にUnconfirm状態で乗ったトランザクションに対してポーリングで状態監視し、Confirmされたタイミングでサービスを開始する、そういった監視アルゴリズムが必要です。ところがWebSocekt通信を使えば、プロトコルの実装方法にもよりますが、Confirmされた時だけトリガーを発行する、といったプログラムが簡単に書けてしまいます。

以下にサンプルプログラムを提示しておきます。

trigger
var nem = require("nem-sdk").default;

var NODES = Array(
"http://alice2.nem.ninja",
"http://alice3.nem.ninja",
"http://alice4.nem.ninja",
"http://alice5.nem.ninja",
"http://alice6.nem.ninja",
"http://alice7.nem.ninja"
);

var node_url;
function getEndpoint(){

        return NODES[Math.floor(Math.random() * NODES.length)];
}
node_url = getEndpoint();
var endpoint = nem.model.objects.create("endpoint")(node_url, nem.model.nodes.websocketPort);

// Address to subscribe
var address = "NBZNQL2JDWTGUAW237PXV4SSXSPORY43GUSWGSB7";
var connector = nem.com.websockets.connector.create(endpoint, address);
connect(connector);

function connect(connector){
  return connector.connect().then(function() {

      nem.com.websockets.subscribe.account.transactions.confirmed(connector, function(res) {
              console.log("confirmed");
              //以下は送金時にメッセージを入れていないとエラーになります。
              var message = JSON.parse(nem.utils.format.hexToUtf8(res.transaction.message.payload));
              console.log(message);
      }
  }
}

nodejsで書いています。ライブラリはNEM-sdkを利用しています。
とりあえず、指定アドレスに着金した時にメッセージ内容をコンソールに出力するだけのサンプルプログラムです。

var message = JSON.parse(nem.utils.format.hexToUtf8(res.transaction.message.payload));
console.log(message);

この部分を書き換えれば、着金した時にツイッターで天気予報をつぶやいたり、金魚にエサをやったりするプログラムも簡単に作れそうですね。

どうですか?もうNEMでしか課金プログラム書く気しなくなってきませんか?
また思いついたらいろいろアップしていきます!

それでは!