NEMを利用したチケット販売サイト案
NEMの機能を用いて、イベントのチケット販売サイトを作るとしたらどうするか?
というのを少し考えてみた。
実際に開発する場合は細かい部分まで詰める必要があるけど、大枠の流れはこんな感じで。
※ただし、自分で作る予定は無いので作りたい人はどうぞご自由に
※全部実装するのは大変なので、作るなら小規模イベント向けに必要な部分から実装することを推奨
1.前提事項
- 登場人物は参加者、開催者、販売サイトの三者
- 三者はそれぞれNEMのアドレスを取得済み
- 入場チケットの代わりにモザイクを使うので、参加者はモザイクの送信が可能なWalletを使う
- チケットの代金はXEM払いのみ
- 販売サイトは入場チケットの代わりになるモザイク(チケットモザイク)を発行する
- 販売サイトはイベント毎にNEMのアドレスを生成する(1イベント=1アドレス)
※販売サイトのアドレスはモザイクを発行するアドレス1つと、イベント用のアドレス複数(イベントの数だけ)用意することになる - 販売サイトは一定条件でモザイクやXEMの送信が可能
- 販売サイトのログインとか細かい部分は煩雑になるので割愛(それでも長いorz)
2.基本的な流れ
2.1.イベント登録
- 開催者が販売サイトに開催者のNEMアドレスとチケット販売金額(XEM)、チケットの販売数、キャンセル条件、イベント概要等を登録
- 開催者が販売サイトに登録料金(モザイク作成代+サイト使用料等)のXEMを送金することでイベント登録完了
- 販売サイトはアドレスを1つ生成し、イベント用(チケット代金振込先)のアドレスとする
- 販売サイトはイベント毎にチケットモザイクを作成する
- 販売サイトのイベント一覧ページ等にイベント概要を表示
2.2.チケット販売期間
- 参加者が販売サイトのイベント用アドレスにチケット代のXEMを送金
- 販売サイトは送金先のアドレスを監視し、どのイベントのチケット購入か判別する
- 販売サイトはイベント用アドレスに紐付くチケットモザイクを参加者に送信
2.3.イベント当日
- 現地で参加者が開催者のアドレスにチケットモザイク1枚を送信
- その場で送信することで、アドレスの持ち主(=購入者)であることを示す
- モザイクがない人、送信出来ない人は入場不可(チケットを買ってない、他人のアドレスを見せていると判断)
2.4.イベント開催から数日後
- 販売サイトがチケット代金のXEMを開催者のアドレスに送金
- 何らかの理由により開催出来なかった場合や開催延期の場合は、開催者が返金手続きまたは延長手続きを販売サイトに行う
- 即座に開催者または参加者に送金しないことで、キャンセルや延期の対応期間を作る
※代金送付の条件を厳しくするなら、開催者のアドレスに一定量のチケットモザイクがなければ参加者に返金処理をする等の対応も検討
※図はイベントが開催され、開催者に代金を送金する場合のイメージ
3.参加キャンセル処理
- 参加者が販売サイトにチケットモザイクを送信すると、キャンセル条件に応じたXEMが返却される
例)
・7日以上前なら送金手数料を除いた金額を返金(XEMの手数料を開催者が負担する設定なら全額でも良い)
・7日前~前日なら5割返金
・当日以降は返金なし
※返金されなかった分はチケット代の一部として開催者へ送金される
4.販売サイトの機能概要
4.1.イベント情報の登録、管理
- 普通にWEBで送金フォームを作り、DB等に情報を格納する仕組みで良いと思う
- 送金フォームはアドレスの手入力を避けるため、QRコードの読み取りや自動設定等を行う
- QRコード自体はNano Walletでも発行できるが、送金指定までするならXEMReceiverやXEMPrice(試験中)等を使う
http://xembook.net/xemreceiver2.html
http://xembook.net/xemprice2.html - イベント情報はデータ破損や改竄対策として登録した情報をPDFファイル等に出力し、それをNEMのアポスティーユにファイルを登録する
- DBの内容と齟齬が発生した場合は、アポスティーユした内容(改竄されていない情報)を正とする
- OpenApostille 等を利用して一般に公開することで、参加者自身が正しい内容を把握することが可能
※イベント情報を修正した場合は複数の情報が存在することになるので、何らかの形で履歴管理と最新版への誘導が必要
4.2.チケットの発行
- 参加者から一定量のXEMを受け取ったら、自動的にチケットモザイクを返送する
- nem Petit ICO を拡張すれば、チケットモザイクの発行以外の各種管理も出来そう
https://github.com/44uk/nem-petit-ico/blob/master/README.ja.md
4.3.チケットの代金管理
- 販売サイトのイベント用アドレスに代金(XEM)を貯めておくだけ
- イベント後、イベント用のアドレスから送金手数料を除いた額(または販売サイト側の利益を除いた額)を開催者へ送金
- キャンセル時はキャンセル条件に従って参加者へ送金
- チケット枚数を超えた場合や期間超過したイベントアドレスへの送金も自動返金
※イベント毎にアドレスを生成し、1アドレス1イベントにするため、他のイベント代金が混ざることを避けられる
※自動送金はチケット発行と同様にnem Petit ICO を拡張するイメージ
4.4.販売サイト関係者のチケット代金(XEM)持ち逃げ防止
- 販売サイトのアドレスはマルチシグにして、複数人の承認を必要とすることで内部犯行を防ぐ
- 販売サイト関係者数人が共謀した場合でも、どのアドレスが承認したか分かる(?)ので警察が追いやすい
- マルチシグにすることで、ハッキング対策にもなる
4.5.開催者のチケット代金(XEM)持ち逃げ防止
- 開催者に代金を渡すのは開催日よりも後の日程にしか設定出来ない様にし、キャンセルや延期の猶予期間を設ける
※参加者から販売サイトに苦情が入った場合は、出金処理を停止する等の対応もあり得る
※参加者が直接開催者に送金する方が仕組みは楽だが、持ち逃げを防ぐために販売サイトを中継する
5.NEMを使うメリットデメリット
5.1.NEMを使うメリット
- 販売サイト用に銀行口座不要
NEMのアドレス発行は無料 - 参加者の個人情報が不要
NEMのアドレスとチケットモザイクさえあれば参加者=購入者の判別が可能 - 金銭管理が容易
マルチシグを使うことでGox対策や持ち出し対策が可能、現金管理が不要 - イベント情報の改竄対策が容易
アポスティーユを使うことで正確なイベント情報がパブリックチェーン上に残る - チケット管理が容易
モザイクの発行が容易で偽造も出来ない、物理的なチケットも不要なので盗難も防げる
5.2.NEMを使うデメリット
- NEM(XEM)を知らない人が多い
概要や使い方、自己責任等についてを教える必要あり
チケット購入や当日モザイクを送信するアドレスには、必要以上にXEMを入れておかない方が無難 - 誰でも買える
個人情報が不要なので、年齢制限等を付ける必要がある場合は別の仕組みを併用する必要あり - 開催者が円に換金するとき、金額が補償されない
XEMの価格が上がっていれば得するし、下がっていれば損する
ただし、開催者が換金するタイミングを自分で判断出来るので下がったならXEMのまま保持すると言う選択肢もある
※参加者が買うときは円換算でXEMに置き換えることも可能なので、円換算で損させないことも出来る(チケットが1枚1000円の場合、販売システムで購入するときに1000円分のXEM数を自動算出) - モザイク送信に1分程度掛かる
規模が大きいイベントだと入場作業だけで時間が掛かるので何かしらの対策(単純に人海戦術をとったり、モザイクの送信までは行わずにアドレス提示で済ませる等)が必要
※参加者のアドレスがマルチシグ設定している場合は、更に手間取る可能性もある
6.想定される問題点と解決案
無駄に長くなったので流し読み推奨
- 開催者が意図的にイベントを開催しなかった(詐欺を働こうとした)場合
販売サイトがチケット代金を開催者宛に送金するのを、イベント開催から数日後に設定する
その間に参加者が販売サイト宛てに通報することで、販売サイト側が送金処理を行わないように設定変更する
※悪意による未開催というのは発生頻度が低いと考え、販売サイトが自動で行うよりも手動で対応した方が楽な気がする - 台風などにより参加者が極端に少なかった場合
手動対応:開催自体はしているので、開催者に代金として渡し、それ以降の対応は開催者の判断に任せる
自動対応:キャンセル処理を利用して不参加のアドレス(チケットモザイク所持アドレス)宛てに返金する - 販売サイト関係者の資金持ち出しやGox
マルチシグ化して、送金のハードルを上げると共にGox対策する
個人ではなく企業サービスとして提供する(内部犯が持ち逃げしたら企業の信頼が無くなるので、最悪の場合は企業が補填する可能性が高い) - 開催者が知らぬ間に後から条件を変更したとか無効だとかの揉め事
販売サイトにキャンセル条件等を登録したら、販売サイトが条件をPDF化して、アポスティーユに登録(設定変更があれば、都度登録して履歴を追えるようにする)
PDFはDL可能にしておき、参加者も参照可能にする - チケットの転売
モザイクを転送不可設定で作成する
転送を許可した上で高額な転売だけを制限するのであれば、参加者のアドレスからモザイクのトランザクションを追いかけて、購入金額が極端に高い場合は参加不可にする等の対策を考える - 参加者が開催日前に誤って開催者のアドレスにチケットモザイクを送信
送信出来ないように、開催者のアドレスは当日まで非公開にする
完全非公開が嫌ならアドレスの部分公開(先頭と末尾の数桁だけ等)でも良い
それでも発生した場合は、開催者に依頼して返送して貰うか、当日の受付で送信トランザクション等の情報を提示してなんとかして貰う - 参加者が複数のアドレスから送金を行いたい
不許可にして、事前に送金アドレスを1本化してもらう
許可するのなら、送金時に一意のメッセージを設定して送信し、同一メッセージなら同じ参加者としてまとめる等の対応も考えられるが、返送先のアドレスの判断や金額過不足、キャンセル処理等が面倒になるので許可しないのが手っ取り早い - 参加者が販売サイトのイベントアドレスを間違えて送金した
XEM送金フォームを販売サイトが用意し、手入力によるアドレスミスを減らす
販売サイト内の別イベントに送金した場合は、キャンセル処理を行うことで返金
間違えたペナルティとして手数料分は参加者が負担するということなら、返金は全額ではなく手数料を除いた額にするのもあり
販売サイト外のアドレスに送金した場合はどうしようもない(送金先が有効なアドレスなら個別にメッセージを送って返してもらえる様に依頼することも出来るが、未使用アドレスだと諦めるしかない)
※販売サイト側の送金フォームでアドレスの手入力を不可にすれば、少なくとも未使用アドレスへの送金は発生しない - 販売サイトが同じモザイクを別のイベントでも使用したい(モザイクの発行手数料を抑えたい)
モザイクの使い回しをしたいなら、イベント単位にアドレスを発行せず、メッセージでイベントを判断し、アドレスは1つ(ないし少数)にする
※メッセージ間違い、開催者への代金誤送金(金額が多い・少ない、別の開催者に送金)等が起こらない様にシステム化する必要があるので、モザイク発行よりも高く付く可能性大 - 複数イベントに参加する場合、どれがどのチケットか分からない
モザイク名を販売サイトのイベントIDとして管理し、販売サイトのイベント情報に載せる
または、販売サイトにイベントを登録するときにモザイク名を開催者が任意設定可能にするのでも良い
更に、何度も開催する人向けにサブネームスペースを作るというオプション(追加料金)を付けてわかりやすくするのも良い
例)
ネームスペース名:Ticket
サブネームスペース名:siwon_g
モザイク名:Event0001
Wallet上に表示されるモザイク名:Ticket.siwon_g.Event0001 - チケットモザイクを買ったが個人的理由で不参加
どうもしない
小規模なイベントなら、不参加者(開催者にモザイクを送っていないのでチケットモザイクを保有したまま)にチケットモザイクと交換で返金や何か補填しても良い - イベントの再入場
モザイクの発行を1参加者あたり1枚ではなく、1.00001枚のように小数点付きで発行する
整数部の1枚を入場券、小数部の0.00001枚を再入場券として使えば対応可能
複数回の再入場を許可する場合は0.000001枚単位で利用する等の工夫で対応可能(この場合、10回まで再入場許可)
再入場時もモザイクの送信を行うことで、本人のアドレスであることを示す
別のアドレスから送信して再入場を偽装するのを避けるため、同じアドレスから当日に1枚以上の送信履歴があることも確認する
小数部の数値が大きいと、人数を集めることで入場券代わりになるので注意(1参加者1.1枚の発行だと10人集めれば1人分になる)
※厳密な対応をする必要がないイベントなら、物理的にリストバンドを渡す等の対応の方が多分楽 - イベントの数だけアドレスを生成せずに1アドレスにした方がマルチシグの扱いが楽では?
1アドレスにするとイベント毎にメッセージで管理する必要があるので、メッセージの入力ミスの対応が必要
万が一ハッキング等で盗難された場合、1アドレスだけで資金を管理していると全部持って行かれるのでCold Wallet等の対応が必要 - こんなに大がかりにする必要ある?
小規模なイベント、且つ開催者を信頼出来るなら開催者のアドレスでモザイク発行だけ行えば事足りる
開催者の不正を防止するため参加者と開催者の間にシステムを、システムの不正を防止するためにマルチシグやアポスティーユを・・・という感じに拡大していった結果がこれ
7.NEMの技術情報
- NEM Technical Reference
- NEM APIマニュアル
https://www.pr1sm.com/crypto-coin/nem-nis-api-documentation-in-japanese/
※APIを発行する場合は、一つのノードに集中して負荷を与えないようランダムにする等の配慮をお願いします - mijin Forum 技術・開発資料系(技術系リンク集)
http://mijin.io/forums/forum/日本語/nem/2362-技術・開発資料系
※上記2つのリンク含む