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

ticketsystem

チケット販売システム:

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

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

すべてのロジックをブロックチェーンにアップする代わりに、 API によってテスト済みの機能を使用し、価値、認可、トレーサビリティ、そして認証の移転と格納を行うことができます。
残りのコードは オフチェーン のままです。これにより必要に応じてプロセスを変更できるため、固有の不変性リスクが軽減。

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

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

チケット販売者と購入者を別のアカウントとして表現

build/generated-addresses/addresses.yaml
この中からアドレスを選択して作成します。

$ $ nem2-cli profile create
Introduce network type (MIJIN_TEST, MIJIN, MAIN_NET, TEST_NET): MIJIN_TEST
Introduce your private key: BC9584E192E096220E8F09D716DD2BA2F45CFA910F88F7F7E2BB1DBCEC5DC505
Introduce NEM 2 Node URL. (Example: http://localhost:3000): http://localhost:3000
Insert profile name (blank means default and it could overwrite the previous profile):

Profile stored correctly
default->
    Network:    MIJIN_TEST
    Url:        http://localhost:3000
    GenerationHash:    EE1EBA3D0F18D2468EAADF60791E4F54D82B2DA5859D343CAC583A256F1B9513
    Address:    SAQSNVT434DLRLRPSL3H3PHVPK3PLC5POJRSVOX5
    PublicKey:    73E9CCFC89808AE0430B97F0F60882A4FC33606077926BC47421E2A07FEE820B
    PrivateKey:    BC9584E192E096220E8F09D716DD2BA2F45CFA910F88F7F7E2BB1DBCEC5DC505

Profile stored correctly
default->
    Network:    MIJIN_TEST
    Url:        http://localhost:3000
    GenerationHash:    EE1EBA3D0F18D2468EAADF60791E4F54D82B2DA5859D343CAC583A256F1B9513
    Address:    SDQ43FZIEZOYOESCWFELONI77JX3KIK2EICEVCIV
    PublicKey:    42EE3B5A9A3BE553BDD8B62262D011F33E2FA63E1A21D4FEA478FDA966B24732
    PrivateKey:    28711B6FD4E3EAD67967788C57BB55A4CF112A05C2F27ED175B8867281999E90
$ nem2-cli account info

Account:    SAQSNV-T434DL-RLRPSL-3H3PHV-PK3PLC-5POJRS-VOX5
-------------------------------------------------------

Address:    SAQSNV-T434DL-RLRPSL-3H3PHV-PK3PLC-5POJRS-VOX5
at height:    1

PublicKey:    0000000000000000000000000000000000000000000000000000000000000000
at height:    0

Importance:    3750000
at height:    1404

Mosaics
3cd772a6fec09570:    449949999.9
1e0e497445744578:    3750

$ nem2-cli account generate --network MIJIN_TEST --save --url http://localhost:3000 --profile buyer

New Account:    SAYT5E-BHCQVN-T7RCRB-GHHWVP-DVEK4J-TTSNY3-HMFL
Public Key:    85F41F2A3E453FECC9D45C23842102804EAF306688F247C8D2680F0232E9FC84
Private Key:    AE6961A1BD30551B960D327AC872F8BB32328AAD384A9A328C7D0D2B256A0212

Stored buyer profile

$ nem2-cli profile list

default->
    Network:    MIJIN_TEST
    Url:        http://localhost:3000
    GenerationHash:    EE1EBA3D0F18D2468EAADF60791E4F54D82B2DA5859D343CAC583A256F1B9513
    Address:    SAQSNVT434DLRLRPSL3H3PHVPK3PLC5POJRSVOX5
    PublicKey:    73E9CCFC89808AE0430B97F0F60882A4FC33606077926BC47421E2A07FEE820B
    PrivateKey:    BC9584E192E096220E8F09D716DD2BA2F45CFA910F88F7F7E2BB1DBCEC5DC505

buyer->
    Network:    MIJIN_TEST
    Url:        http://localhost:3000
    GenerationHash:    EE1EBA3D0F18D2468EAADF60791E4F54D82B2DA5859D343CAC583A256F1B9513
    Address:    SAYT5EBHCQVNT7RCRBGHHWVPDVEK4JTTSNY3HMFL
    PublicKey:    85F41F2A3E453FECC9D45C23842102804EAF306688F247C8D2680F0232E9FC84
    PrivateKey:    AE6961A1BD30551B960D327AC872F8BB32328AAD384A9A328C7D0D2B256A0212

上記のようになります。

ブロックチェーンの監視

新しく3つのターミナルを開く。

バリデーションエラーのある アナウンスされたトランザクションの監視、未承認、承認の3つ

$ nem2-cli monitor status
Monitoring SAQSNV-T434DL-RLRPSL-3H3PHV-PK3PLC-5POJRS-VOX5 using http://localhost:3000
connection open

$ nem2-cli monitor unconfirmed
Monitoring SAQSNV-T434DL-RLRPSL-3H3PHV-PK3PLC-5POJRS-VOX5 using http://localhost:3000
connection open

$ nem2-cli monitor confirmed
Monitoring SAQSNV-T434DL-RLRPSL-3H3PHV-PK3PLC-5POJRS-VOX5 using http://localhost:3000
connection open

チケットの作成

チケットを NEM モザイクとして表現。

 
プロパティ 説明
Divisibility 0 “0.5 tickets” が送信できないように、モザイクは可分しないようにします。
Duration 1000 モザイクは 1000 ブロック登録されます。
Amount 1000000 作成するチケットの量
Supply mutable True モザイク供給量は後に変更可能です。
Transferable False モザイクはモザイク作成者だけに送り返すことしかできません。


$ nem2-cli transaction mosaic --amount 1000000 --supplymutable --divisibility 0 --duration 1000
Do you want an eternal mosaic? [y/n]: y
Do you want mosaic to be transferable? [y/n]: n
Transaction announced correctly
Hash:    1E22DC2B58C3ED58099254B15DAF240C1D7F725A1F6ECE94B838CA70A588575A
Signer:  DD6EB023BE98FC9FC8E08B0995C1772736545F3C5F2FEACB6ADA60071A2A228E
Your mosaic id is:
Hex:  1799ee6137edb222
Uint64: [ 938324514 395964001]

トランザクション承認後に、 monitor confirmed に返された mosaicId を確認。

AggregateTransaction:  InnerTransactions: [ MosaicDefinitionTransaction: MosaicName:1799ee6137edb222 Divisibility:0 SupplyMutable:true Transferable:false Signer:SAUIIB-CWAI63-6C27OC-PUF7A5-OVYEKF-L3GDTD-3QVN Deadline:2019-08-03 MosaicSupplyChangeTransaction: MosaicId:1799ee6137edb222 Direction:IncreaseSupply Delta:1000000 Signer:SAUIIB-CWAI63-6C27OC-PUF7A5-OVYEKF-L3GDTD-3QVN Deadline:2019-08-03 ] Signer:SAUIIB-CWAI63-6C27OC-PUF7A5-OVYEKF-L3GDTD-3QVN Deadline:2019-08-03 Hash:1E22DC2B58C3ED58099254B15DAF240C1D7F725A1F6ECE94B838CA70A588575A

チケットの送信

TypeScriptソースコード

転送トランザクション をアナウンスする販売者アカウントに company.ticket を 1 つ送信します。

転送トランザクションを用意:

const mosaicId = process.env.MOSAIC_ID as string;
const address = process.env.ADDRESS as string;

const transferTransaction = TransferTransaction.create(
    Deadline.create(),
    Address.createFromRawAddress(address),
    [new Mosaic(new MosaicId(mosaicId), UInt64.fromUint(1))],
    PlainMessage.create('enjoy your ticket!'),
    NetworkType.MIJIN_TEST
);
プロパティ 説明
Deadline Default トランザクションがブロックチェーンに取り込まれるまでの最大時間
Recipient SC7A4H…2VBU 受信のアカウントアドレス
Mosaics [1 7cdf3b117a3c40cc] 送信するモザイクの配列
Message enjoy your ticket 添付されたメッセージ
Network MIJIN_TEST ローカルネットワーク識別子

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

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

const privateKey = process.env.PRIVATE_KEY as string;
const networkGenerationHash = process.env.NETWORK_GENERATION_HASH as string;

const account = Account.createFromPrivateKey(privateKey,NetworkType.MIJIN_TEST);
const signedTransaction = account.sign(transferTransaction, networkGenerationHash);

 

署名が終わったらトランザクションをネットワークへアナウンスすることができます。

const transactionHttp = new TransactionHttp('http://localhost:3000');

transactionHttp
    .announce(signedTransaction)
    .subscribe(x => console.log(x), err => console.error(err));

トランザクションが承認されたら、チケット購入者がチケットを受信したことを確認します。

$ nem2-cli account info --profile buyer

Comments