はじめに
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メソッドは、アドレスや公開鍵などをパラメータとして、通常のウェブサイトと同様に以下のように行います。
しかし、POSTメソッドは通常のウェブサイトと異なります。
通常のウェブサイトの場合、フォームから入力されたデータをそのまま POST メソッドで host に送信しますが、mijin では、各パラメータからシリアライズ化された data を作成、トランザクション作成者の秘密鍵から作られた電子署名と合わせて、以下の json 形式で POST を行います。
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へアクセスするだけでアカウントが発行されます。
たったこれだけです。
ただし、もし誰でもアカウントを発行できると、見知らぬ誰かがアカウントを大量に作成し、場合によっては悪用(といっても所持コインはゼロなので作成しただけでは何もできませんが)しようとすることも考えられます。
またアカウント作成時に、アドレス・公開鍵・秘密鍵情報が通信上に流れることになります。
そのため、mijinでは秘密鍵が通信上に流れるAPIについては通常NGとし、IPアドレスで制限をかけております。アカウントの発行は、以下手順で行えるようになります。
アカウントの発行準備
1.ノードにSSHでログイン
2.config-user.properties を開く
3.nis.additionalLocalIps に許可するIPアドレス追加(複数の場合、バルブ区切り)
4.mijin を再起動
kill -9 プロセス番号
$ screen -S mijin -d -m /home/[アカウント名]/mijin/startnem.sh
または
$ nohup ./startnem.sh &
これで設定されたIPアドレスからアカウントを作成することができます。試しに接続先ホストを入力し「アカウント作成」をクリックしてください。
レスポンス結果に作成されたアカウントのアドレス・公開鍵・秘密鍵が表示されたはずです。
なお、http://<ホスト名>/account/generateへアクセスしても同様にアカウント作成結果が得られます。
ブロックチェーンに保持している情報
ブロックチェーン上には、アカウントのアドレス、公開鍵、秘密鍵は保持しておりません。
各種情報の保持についてはアプリ、またはユーザー側に委ねられます。
送る、もらう
送金準備
それではさっそくアドレス間で送金を行います。送金は以下手順で行います。
送金手順
1.送金元アドレスと送金先アドレス情報を用意
2.必要パラメータの値を入力するHTMLフォームを用意
3.ノードへPOST
送金先アドレスは「アカウント発行」にある「アカウント作成」で作成できます。
では、さっそく新たに作成したアカウントへ送金を行います。
ワンクリックで送金
送金用フォームを用意いたしました。
相手に xem を送金します。xemは mijin でデフォルトで用意されている通貨(コイン)です。単位はミリマイクロです。
送金には手数料がかかります。
ブロックチェーンでは合意形成へ協力(マイニング)したアカウントへ報酬として通貨をプレゼントします。その報酬は、トランザクション生成時に徴収した手数料によって支払われます。mijin もその思想上にあり、トランザクション生成時には手数料を付与する必要があります。
手数料はトランザクション生成時に自由に設定できますが、最低 0.1 以上必要です。xemの送金については config-user.properties の設定により 0 とすることが可能です(ただし、mosaic送金には最低1xemが必要です)。なお、手数料はシステム上のアカウントに送られ蓄積され、mijin の各ノードにマイニング報酬として支払われます。
では早速送金します。必要な情報をコピー&ペーストし「送金ボタン」をクリックしてください。
※秘密鍵や公開鍵などのユーザーの入力手間を省きたい場合は、ブラウザのローカルストレージなどに保持して、内部処理から値を取得するなどの処理を入れますが、本アプリでは確認等をしやすいようフォームにてコピー&ペーストしていただく形としています。
これで送金完了です。
通常のウェブサイトでは、このあと送金された額について不正がないかどうかのチェックをサーバに配置されたアプリケーションで行う必要がありますが、mijinの場合、それらの確認はノード間で行います。送金が完了したかどうかは、APIを経由して行います。
受取確認
実際に相手に通貨(コイン)が送られたかどうかを確認します。
確認は「/account/transfers/incoming」のAPIを使用します。入力フォームに相手のアドレスをコピー&ペーストし、「受取確認」ボタンをクリックしてください。
送金確認
同様に送金が完了したかの確認もAPIにて行います。
送金確認は「/account/transfers/outgoing」を使用します。入力フォームに送金元のアドレスをコピー&ペーストし、「送金確認」ボタンをクリックしてください。
/account/transfers/outgoing
ノード間の同期確認
上記トランザクションが他のノードにも同期されているかどうか確認します。
http://<ホスト名>/account/transfers/incoming?address=アドレス のURLでホスト名に他のノードのホストを入れて、ブラウザからアクセスしてください。同期済みであれば上記確認結果と同様の結果が得られます。