はじめてのアプリケーションを作成

このガイドでは NEM 開発サイクルを紹介します。NEM ビルドイン機能 を組み合わせたあと、あなたは初めてのトランザクションをブロックチェーンへ送ることになります。

背景

チケット二次市場は、再販市場としても知られており、最初の販売者からチケットを購入した後に個人間で行われるチケット交換です。最初の販売者は、イベントウェブサイト、オンラインチケット販売プラットフォーム、イベントの入口にあるショップまたは売店であったりします。

最初の販売者ではない人からチケットを購入しても、必ずしもそのチケットの料金をさらに支払うという意味ではありません。これは、最初の販売者が問題の解決のために何もできない、偽の、もしくは複製されたチケットを購入してしまう被害者となる機会です。

私達は何を解決したいのでしょう?

../_images/getting-started.png

認証モデル

チケット販売者はシステムのセットアップを望んでいます:

  1. 各チケット購入者を識別する。
  2. チケットの転売防止。
  3. 未認証のチケットとその複製の防止。

何故NEMを使うのでしょう?

ブロックチェーンテクノロジーはこのようなケースに適用できます:

  • 様々な参加者が関係します。
  • 参加者はお互いに信頼する必要があります。
  • 不変のイベントの集合を追跡し続ける必要があります。

NEMは フレキシブルなブロックチェーン テクノロジーです。すべてのアプリケーションロジックをブロックチェーンにアップロードする代わりに、 API呼び出し によってテスト済みの機能を使用して、価値、認可、トレーサビリティ、そして認証の移転と格納を行うことができます。

残りのコードは オフチェーン のままです。これにより必要に応じてプロセスを変更できるため、固有の不変性リスクが軽減されます。

前提条件

  • 入門セクション を終了していること
  • テキストエディタ または IDE
  • NEM2-SDK と CLI
  • XEM を保有したアカウント

それではコードを見ていきましょう

1. 各参加者のアカウントを作成

まず、私達が解決したい問題の渦中にいるアクタを認識します:

  • チケット販売者
  • チケット購入者

チケット販売者と購入者を分けた アカウント として表現することにしました。各アカウントは一意であり、アドレスによって識別されます。アカウントは、適切な秘密鍵によって変更することができる、ブロックチェーン上の金庫にアクセスします。

テストネットXEMを保有したアカウントの読み込みは済ませましたか?まだ終わっていないのであれば 入門セクション に戻ってください。この作成したアカウントはチケット販売者を表します。

  1. 以下のコマンドを実行した後、このような行がスクリーンに表示されているはずです:
$> nem2-cli account info


New Account: SCVG35-ZSPMYP-L2POZQ-JGSVEG-RYOJ3V-BNIU3U-N2E6

[...]

Mosaics

3628d0b327fb1dd8:       1000000
  1. アカウントは 1,000,000 XEM を保有しています。もし mosaics の次の行が空であるならば、 前のガイド に従ってください。
  2. チケット販売者を識別するための2つ目のアカウントを作成します。
$> nem2-cli account generate --network MIJIN_TEST --save --url http://localhost:3000 --profile buyer

2. ブロックチェーンの監視

アカウントはトランザクションを通じてブロックチェーンの状態を変更します。アカウントが正しく構成されているトランザクションをアナウンスすると、サーバーは OK のレスポンスを返します。

OK のレスポンスを受信することは、トランザクションが正当であることを意味するわけではなく、まだブロックには含まれていないことを意味します。トランザクションをアナウンスする前に監視を始めておくのがよいでしょう。

新しく3つのターミナルを開くと良いでしょう:

  1. 最初のターミナルはバリデーションエラーのある アナウンスされたトランザクションの監視 をします。
$> nem2-cli monitor status
  1. 未承認 の監視はトランザクションがネットワークに到着したことを確認できますが、まだブロックには含まれてません。
$> nem2-cli monitor unconfirmed
  1. トランザクションが含まれると confirmed の下に表示されるでしょう:。
$> nem2-cli monitor confirmed

3. チケットの作成

チケットを NEM モザイクとして表現しています。 モザイク はブロックチェーン上で、モノ、チケット、クーポン、株式そして暗号通貨のような、あらゆる資産を表現します。それらは作成時に定義される変更可能なプロパティを持ちます。例えば、 転送可能プロパティを false に設定します。これは、チケットの転売を防止するために、チケット購入者がモザイクの作成者だけに送り返すことしかできないことを意味します。

チケット販売者アカウントでモザイクを作成する前に、ネームスペースを登録する必要があります。 ネームスペース はネットワーク上においてあなたの資産を識別するための一意な名前です。

  1. company というネームスペースを登録します。名前が有効かどうか確認してください。
$> nem2-cli namespace info --name company
  1. そのネームスペースは有効ですか?ネームスペース名とブロック数で数えたレンタル期間を指定して取得してください。
$> nem2-cli transaction namespace --name foo --rootnamespace --duration 1000

アカウントのトランザクションを監視しているターミナルで何が起きたかを確認しましたか?トランザクションはまず unconfirmed の下に表示され、その後 confirmed になります。

  1. ticket という名前のモザイクを作成します。
  • これは、供給量が 100 で、 company ネームスペース配下にあるべきです。
  • このモザイクは 転送可能 を false に設定します。
  • “0.5 company:tickets” が送信できないように、可分性は 0 にセットします。
$> nem2-cli transaction mosaic --mosaicname ticket--namespacename company--amount 1000000 --supplymutable --divisibility 0 --duration 1000

4. チケットの送信

NEM の中で最も一般的なアクションの1つである、 転送トランザクション をアナウンスする販売者アカウントに company:ticket を1つ送信します。

  1. 転送トランザクションを用意します。三つの主要な属性は転送トランザクションを形作ります。
  • 受信アカウントアドレス: SC7A4H-7CYCSH-4CP4XI-ZS4G2G-CDZ7JP-PR5FRG-2VBU.
  • メッセージ: enjoy your ticket
  • モザイク配列: [1 company:ticket].
import {
    Account, Address, Deadline, UInt64, NetworkType, PlainMessage, TransferTransaction, Mosaic, MosaicId,
    TransactionHttp
} from 'nem2-sdk';

const transferTransaction = TransferTransaction.create(
    Deadline.create(),
    Address.createFromRawAddress('SC7A4H-7CYCSH-4CP4XI-ZS4G2G-CDZ7JP-PR5FRG-2VBU'),
    [new Mosaic(new MosaicId(company:ticket'), UInt64.fromUint(1))],
    PlainMessage.create(‘enjoy your ticket’'),
    NetworkType.MIJIN_TEST
);
import io.nem.sdk.model.account.Address;
import io.nem.sdk.model.blockchain.NetworkType;
import io.nem.sdk.model.mosaic.Mosaic;
import io.nem.sdk.model.mosaic.MosaicId;
import io.nem.sdk.model.transaction.Deadline;
import io.nem.sdk.model.transaction.PlainMessage;
import io.nem.sdk.model.transaction.TransferTransaction;

import java.math.BigInteger;
import java.util.Arrays;

import static java.time.temporal.ChronoUnit.HOURS;

final TransferTransaction transferTransaction = TransferTransaction.create(
    Deadline.create(2, HOURS),
    Address.createFromRawAddress("SC7A4H-7CYCSH-4CP4XI-ZS4G2G-CDZ7JP-PR5FRG-2VBU"),
    Arrays.asList(new Mosaic(new MosaicId("company:ticket"), BigInteger.valueOf(1))),
    PlainMessage.create("enjoy your ticket"),
    NetworkType.MIJIN_TEST
);

トランザクションは作られましたが、まだネットワークへはアナウンスされていません。

  1. ネットワークがトランザクションの信頼性を検証できるように、まずチケット販売者のアカウントでトランザクションに署名をします。
const privateKey = process.env.PRIVATE_KEY;

const account = Account.createFromPrivateKey(privateKey, NetworkType.MIJIN_TEST);

const signedTransaction = account.sign(transferTransaction);
final String privateKey = "";

final Account account = Account.createFromPrivateKey(privateKey,NetworkType.MIJIN_TEST);

final SignedTransaction signedTransaction = account.sign(transferTransaction);
  1. 署名が終わったら、トランザクションをネットワークへアナウンスします。
const transactionHttp = new TransactionHttp('http://localhost:3000');

transactionHttp.announce(signedTransaction).subscribe(
    x => console.log(x),
    err => console.log(err)
);
final TransactionHttp transactionHttp = new TransactionHttp("http://localhost:3000");

transactionHttp.announceTransaction(signedTransaction).toFuture().get();
$> nem2-cli transaction transfer --recipient SD5DT3-CH4BLA-BL5HIM-EKP2TA-PUKF4N-Y3L5HR-IR54 --mosaics company:ticket::1 --message enjoy_your_ticket
  1. トランザクションが承認されたら、チケット購入者がチケットを受信したことを確認します。
$> nem2-cli account info --profile buyer

次は?

提案されたユースケースは解決できたでしょうか?

✅ 各チケット購入者の識別: 各購入者のNEMアカウントの作成

✅ チケットの転売防止: 転送不可能なモザイクの作成

✅ 未認証なチケットとその複製: company:ticket という名前の固有ネームスペースとモザイクの作成

NEM ビルドイン機能 の学習を続けたり、 自己ペーストレーニング で練習する。