Tutorial

はじめに

mijinとは、「ブロックチェーン」を誰もが気軽にプライベートP2Pネットワークとして利用できるよう開発された汎用プラットフォームです。

このチュートリアルでは、サーバ上に mijin がインストールされ、mijinのP2Pネットワークが構築されている環境を持っていることを前提に進めます。

mijinの概念

まずは、以下の図をご覧ください。

点線がブロック、あるいはトランザクションです。4台のサーバにmijin がインストールされ、node1-4 として Port:7895 を使い通信し合い、ブロック、トランザクションを同期していることを示しています。

mijin のブロックチェーンには、他のブロックチェーンにあるようなノードごとの権限、例えば「1: クライアント、2: 非検証ピア、4: 検証ピア、8: 監査人」といった役割はありません。各ノードがブロックやトランザクションを共有し、各ノード自身が検証を行い、そして共有し自身のブロックチェーンにつなぎます。

逆に言えば、以下のような使い方でノードごとに役割を持たせることも可能です。
以下の図をご覧ください。一般ユーザーからのトランザクションは node:4 で受け入れ、企業からのトランザクションは node:2 で受け入れています。

例えば、上記のような役割分担をもとに以下のようなアプリケーションを構成することも可能です。

mijinとのやりとり

mijinとのデータのやりとりはAPIを経由して行います。通信メソッドは POST/GET です。
通常のウェブサイトと同様、mijin がインストールされた host へ、HTMLフォームから POST/GET を行います。

POST/GET について

POST/GET はそれぞれ以下で使用します。

  • POST ... トランザクション送信
  • GET ... 各種情報取得

GETメソッドは、アドレスや公開鍵などをパラメータとして、通常のウェブサイトと同様に以下のように行います。

http://<ホストのIPアドレス>:7895/account/transfers/incoming?address=TALICELCD3XPH4FFI5STGGNSNSWPOTG5E4DS2TOS

しかし、POSTメソッドは通常のウェブサイトと異なります。
通常のウェブサイトの場合、フォームから入力されたデータをそのまま POST メソッドで host に送信しますが、mijin では、各パラメータからシリアライズ化された data を作成、トランザクション作成者の秘密鍵から作られた電子署名と合わせて、以下の json 形式で POST を行います。

{"data": "01010000010000604781b90320000000462ee976890916e54f…0000000000000000000000000000000000000000000000000", "signature": "8584d64446316cafbfa6ea92b772a21cdcb18b72b36ae5f91f…d8605c09c06a3faf905f02de8b68b1069e49e631382c70a09"}

POSTメソッドで以下の処理が行なえますが、ノードへPOSTする際はいずれも上記 JSON 形式に変換した上でPOSTメソッドを使用する必要があります。

POSTメソッドで行えるトランザクション
  • 送金(モザイク含む)
  • マルチシグアカウント作成
  • マルチシグトランザクション作成
  • マルチシグトランザクションへの署名
  • ネームスペースの作成
  • モザイク作成

図にすると以下のようになります。

では、電子署名のJSONデータはどこで作成すればよいでしょうか?

mijin では各種パラメータからJSONデータを作成するAPI(/transaction/prepare-announce)が用意されています。ただし、各種パラメータを付与してノードへ向けてこのAPIをコールすると、秘密鍵情報が通信上に流れてしまいます。

使用する場合は、mijinがインストールされているサーバのローカル環境などで使用し、それ以外の場合は、クライアント側でJavaScriptを使用し JSONデータを作成、作成されたJSONデータをノードへ向けてPOSTするようにします。そうすることで、秘密鍵を通信上に流すことなくトランザクションをノードに送ることができます。

チュートリアルについて

今回のチュートリアルでは、jQuery ベースで作成された簡易的なアプリを使用します。

このアプリは以下の仕様になります。

  1. 入力フォームに入力された内容を電子署名付きJSON形式に変換
  2. ノードへトランザクションを送信
  3. 結果をレスポンス欄に出力

アプリのほかサイトへの利用方法については、最後に記載します。
それではさっそくチュートリアルを開始します。

ブロックチェーンのアカウントとは?

アカウントの発行

mijinでデータのやり取りを行うには、アカウントが必要です。1つのアカウントには、以下ユニークな値が発行されます。

  • アドレス
  • 公開鍵
  • 秘密鍵

通常のウェブサイトでは、ユーザーがアカウントには、サイト上に用意されている入力フォームに、名前やメールアドレス、ときには住所や電話番号などを入力してSubmitボタンをクリックすることでアカウントが発行されます。これはユーザーにとりとても面倒でストレスが掛かる作業です。

mijinの場合、以下URLへアクセスするだけでアカウントが発行されます。

http://<ホストのIPアドレス>:7895/account/generate

たったこれだけです。

ただし、もし誰でもアカウントを発行できると、見知らぬ誰かがアカウントを大量に作成し、場合によっては悪用(といっても所持コインはゼロなので作成しただけでは何もできませんが)しようとすることも考えられます。
またアカウント作成時に、アドレス・公開鍵・秘密鍵情報が通信上に流れることになります。

そのため、mijinでは秘密鍵が通信上に流れるAPIについては通常NGとし、IPアドレスで制限をかけております。アカウントの発行は、以下手順で行えるようになります。

アカウントの発行準備

  1. ノードにSSHでログイン
  2. config-user.properties を開く
    $ vi config-user.properties
  3. nis.additionalLocalIps に許可するIPアドレス追加(複数の場合、バルブ区切り)
    nis.additionalLocalIps = XX.XX.XX.XX|XX.XX.XX.XX
  4. mijin を再起動
    ps aux | grep java
    kill -9 プロセス番号
    $ screen -S mijin -d -m /home/[アカウント名]/mijin/startnem.sh
    または
    $ nohup ./startnem.sh &

これで設定されたIPアドレスからアカウントを作成することができます。試しに接続先ホストを入力し「アカウント作成」をクリックしてください。

/account/generate

レスポンス結果に作成されたアカウントのアドレス・公開鍵・秘密鍵が表示されたはずです。

なお、http://<ホスト名>/account/generateへアクセスしても同様にアカウント作成結果が得られます。

ブロックチェーンに保持している情報

ブロックチェーン上には、アカウントのアドレス、公開鍵、秘密鍵は保持しておりません。
各種情報の保持についてはアプリ、またはユーザー側に委ねられます。

送る、もらう

送金準備

それではさっそくアドレス間で送金を行います。送金は以下手順で行います。

送金手順

  1. 送金元アドレスと送金先アドレス情報を用意
  2. 必要パラメータの値を入力するHTMLフォームを用意
  3. ノードへPOST

送金先アドレスは「アカウント発行」にある「アカウント作成」で作成できます。

では、さっそく新たに作成したアカウントへ送金を行います。

ワンクリックで送金

送金用フォームを用意いたしました。
相手に xem を送金します。xemは mijin でデフォルトで用意されている通貨(コイン)です。単位はミリマイクロです。

送金には手数料がかかります。
ブロックチェーンでは合意形成へ協力(マイニング)したアカウントへ報酬として通貨をプレゼントします。その報酬は、トランザクション生成時に徴収した手数料によって支払われます。mijin もその思想上にあり、トランザクション生成時には手数料を付与する必要があります。
手数料はトランザクション生成時に自由に設定できますが、最低 0.1 以上必要ですxemの送金については config-user.properties の設定により 0 とすることが可能です(ただしmosaic送金には最低1xemが必要です)。なお、手数料はシステム上のアカウントに送られ蓄積され、mijin の各ノードにマイニング報酬として支払われます。

では早速送金します。必要な情報をコピー&ペーストし「送金ボタン」をクリックしてください。

※秘密鍵や公開鍵などのユーザーの入力手間を省きたい場合は、ブラウザのローカルストレージなどに保持して、内部処理から値を取得するなどの処理を入れますが、本アプリでは確認等をしやすいようフォームにてコピー&ペーストしていただく形としています。

/transaction/announce

これで送金完了です。
通常のウェブサイトでは、このあと送金された額について不正がないかどうかのチェックをサーバに配置されたアプリケーションで行う必要がありますが、mijinの場合、それらの確認はノード間で行います。送金が完了したかどうかは、APIを経由して行います。

受取確認

実際に相手に通貨(コイン)が送られたかどうかを確認します。
確認は「/account/transfers/incoming」のAPIを使用します。入力フォームに相手のアドレスをコピー&ペーストし「受取確認」ボタンをクリックしてください。

/account/transfers/incoming

送金確認

同様に送金が完了したかの確認もAPIにて行います。
送金確認は「/account/transfers/outgoing」を使用します。入力フォームに送金元のアドレスをコピー&ペーストし「送金確認」ボタンをクリックしてください。

/account/transfers/outgoing

ノード間の同期確認

上記トランザクションが他のノードにも同期されているかどうか確認します。
http://<ホスト名>/account/transfers/incoming?address=アドレス のURLでホスト名に他のノードのホストを入れてブラウザからアクセスしてください。同期済であれば上記確認結果と同様の結果が得られます。

独自コイン・地域通貨の流通

先ほどコインの送金・受信を行いました。そのときに使用した通貨はmijinのデフォルト通貨xemでした。たとえば xem ではなく、企業コイン、地域コインなどを受け渡ししたいという要望もあることでしょう。

mijinのモザイク機能を使うことで、独自に通貨を定義し、自らが造幣局となってブロックチェーン上で流通させることが可能です。発行枚数も上限 9,000,000,000まで発行可能です。

通貨を発行するには

ブロックチェーン上に独自通貨(コイン)を流通させる手順は以下になります。

通貨発行手順

  1. ネームスペースの作成
  2. モザイク(独自コイン)の定義

場所を借りる

ネームスペースとは、mijinのブロックチェーン上で独自コインの流通を確保するための空間になります。

レンタルという形での利用となります。そのため作成時にレンタル手数料を決められたアカウントへ xem を支払う必要があります。レンタル手数料は 5000 マイクロxem固定です。

さっそく namespace を作成します。最初に作成するネームスペースが最上位になりますので、上位ネームスペースは空のままにします。

/transaction/announce

ネームスペースを確保できたかどうかは「/account/namespace/page」APIを使用します。

作成者のアドレスを入力し「ネームスペースを確認」ボタンをクリックしてください。

/account/namespace/page

コインを発行する

ネームスペースを確保したら、独自コインを定義し発行します。独自コインの発行はモザイクの機能を使います。モザイクはコインの単位(コイン名)です。定義されたコインはネームスペース上で管理されます。コインの送金時にはコイン名、送金額と合わせてネームスペースをパラメータに付与します。

さっそく独自通貨(コイン)を発行します。

項目についてはAPI モザイク作成で確認ください。
ネームスペースには先ほど作成したネームスペースを入力します。
モザイクを分割できる最小のサブユニット数は、送金時に指定できる小数点になります。手数料として徴収するモザイクには、xem以外に独自に定義したコインを設定することが可能です。今回は、1 xem(ネームスペースをnem)を手数料として徴収します。
またモザイク送金時の手数料受取人として自身のアドレスを設定することも可能です。

/transaction/announce




独自通貨(コイン)が発行されたかどうかを確認します。

/account/mosaic/definition/page APIを使用します。以下入力フォームに、作成者のアドレスを入力し「モザイクを確認」ボタンをクリックしてください。

/account/mosaic/owned

コインを流通させる

定義したコインを相手に送金します。
作成したアカウントが最初にコインを所有者しています。作成者のアカウントから他のアカウントへ独自コインを送金します。

今回手数料として 1 xem を徴収しています。1xemをモザイクと一緒に送金します。xem以外の通貨(独自コイン)を手数料として徴収する設定の場合、送金するモザイクと一緒に独自コインを配列として送金します。
※今回のチュートリアルで使用しているJavaScriptで送金できるのは、xem と 1つのモザイクのみとなります。

モザイクのネームスペースには先ほど作成したネームスペース、モザイク名には先ほど作成したモザイク名を入力します。相手のアドレスをコピー&ペーストし「送金」ボタンをクリックしてください。

/transaction/announce


コインの受取を確認する

独自コインの入金確認は、xem での送金時同様「/account/transfers/incoming」で行います。

/account/transfers/incoming

mosaic を含めたコインの所持状況は「/account/mosaic/owned」でも確認可能です。

/account/mosaic/owned

入金確認が確定していれば、返却結果の「transaction」の「mosaics」に受け取ったモザイクが表示されます。送金についても、xemでの送金時同様「/account/transfers/outgoing」で行えます。

以上でTutorialは終了です。


改訂履歴

  • 2017年3月:初版

トランザクション

				

レスポンス

				

POSTしたJSON