はじめに
なんかアプリとかゲームとかで、ユーザーがなんかミッションをクリアしたら、システムから自動的にXYMかモザイクを送りたい、といった場面があるかもしれません。
そういった場合、ユーザーが保有しているアドレスを入力してもらうことが必要になると思います。
けど、ユーザーが入力した受取アドレスが間違っている可能性があります。
アドレスフォーマットのチェックはできますが、ユーザーが保有しているアドレスかどうかを確認するのは難しいです。
そこで、この記事は、ユーザーがそのアドレスの所有者である確度を少しでも上げるために、シークレットロックトランザクションと、シークレットプルーフトランザクションを利用するアイディアについて書きつづります。
シークレットロックトランザクション
シークレットロックトランザクションとシークレットプルーフトランザクションについて少し説明します。
シークレットロックトランザクションは、トランスファートランザクションと同様に、XYMなどのモザイク(資金)を特定のアドレスに対して送ることができます。しかし、資金は手元を離れますが、この段階ではまだ相手には届きません。
上記のトランザクションによって指定されたアドレスの持ち主は、シークレットプルーフトランザクションを送信することで、資金を受け取ることができます。
このとき、シークレットロックトランザクションに設定されたシークレットというバイト値が、プルーフから計算される値と一致している必要があります。(プルーフはシークレットプルーフトランザクションにて指定します。)
もしこれが一致していない場合、シークレットプルーフトランザクションは送信に失敗します。
一定の期間、シークレットプルーフトランザクションが送信されない場合、資金は送り主に戻ってきます。
公式ドキュメント
https://docs.symbolplatform.com/ja/serialization/lock_secret.html#secret-lock-transaction
応用シーン
このことを利用して、資金を受け取って欲しい人に対して、安全に送金することができる可能性があります。
例えば、とある開発者がゲームを作ったとします。このゲームのユーザーは、ミッションをクリアすると、XYMを受け取ることができます。
初めに、ユーザーはゲーム内で自分の所有しているアドレスを入力します。
次に、何かしらのミッションをクリアしたり、報酬受け取りボタンを押したりして、XYMを受け取る段階になったとします。
このとき、ゲームのサーバーはユーザーの入力したアドレスに対して、シークレットロックトランザクションを送信します。(資金の拠出は開発者が行うとします)
そしてつぎに、アプリやメールなどでプルーフを開示します。
最後に、ユーザーは自らシークレットプルーフトランザクションを送信し、資金を受け取ります。
このとき、ユーザーが入力したアドレスが、実はユーザーが所有しているものでなかった場合、シークレットプルーフトランザクションは失敗します。
そして、誰も受け取らないまま一定期間が過ぎると、資金は開発者に返却されます。
これにより開発者は、ユーザーが入力したアドレスが間違っていた場合に資金を失うというリスクを避けることができます。ユーザーもまた、入力したアドレスが間違っていたことを通知してもらい、再度正しいアドレスを入力することにより、確実にXYMを受け取ることができるようになります。
アグリゲートトランザクションでいいじゃん
アグリゲートトランザクションでも似たようなことができると思われます。
ゲームのサーバーは以下のようなアグリゲートボンデッドトランザクションを送信します。
- サーバーからユーザーにXYMを送金する。
- ユーザーからサーバーに0XYM送金する。
こうすることで、サーバーとユーザーの両方の署名が揃わないと、トランザクションが成立しなくなります。
ユーザーが入力したアドレスが間違っていた場合、ユーザーは署名を作成することができないため、安全に送金することができるようになります。
アグリゲートの欠点
ユーザーから資金を送信するトランザクションが含まれるため、ユーザーは内部トランザクションをしっかり確認しないと、資金を抜かれる恐れがあります。
アグリゲートボンデッドトランザクションを送信するためには、ロックハッシュトランザクションによって10XYMを供託しなければなりません。これは場合によってはかなりのコストになり得ます。
注意点
シークレットロック/プルーフトランザクションは、シークレットとプルーフに加え、受取人アドレスを指定します。
このとき、シークレットプルーフトランザクションに署名するアカウントは、受取人アドレスのものでなくても問題ありません。
ですので、以下のようなことが起こってしまう可能性があります。
ユーザーがアプリ/ゲームに入力したアドレスが間違っていたとして、XYMを受け取ろうとしてシークレットプルーフトランザクションを送信する際、受取人アドレスをその間違ったアドレスを指定してしまうと、その間違ったアドレスに資金が送られてしまいます。(=ユーザーは資金を受け取れない)
なので、ユーザーがシークレットプルーフトランザクションを送信するときには、受取人アドレスには、必ずトランザクションに署名したアカウントのアドレスを指定するようにしなければなりません。
でないと、間違ったアドレスに送金してしまうことを防ぐことができません。