ルール
参加者は、開催者が隠したお宝を見つけることで、保持しているERC20トークンを増やしていく。
参加者
- 開催前において、人の参加者を予定しているとし、それぞれと表す 。
- 開催中に参加者を増やすことができる。
お宝
- 開催前において、個のお宝を予定しているとし、それぞれと表す 。
- お宝は、QRコードなどの、十分な長さのバイト列を表現できるものとする。
- 開催中にお宝を増やすことができる。
ゲームの流れ
開催前
- 各参加者は、ゲームで使用するアドレスを生成して公開する。
- 開催者は、各お宝に対応する十分な長さのバイト列を生成し、それを記載したものを隠す。
- 開催者は、を計算し、末尾20バイトをアドレスとする 。
- 開催者は、行列を引数として、トークンコントラクトを生成する。
- トークンコントラクトは、行列をストレージに保存する。
開催中
- トークンコントラクトは、からへトークンを移転するとき、が行列の第行に存在するならば、に報酬トークンを与える。
- お宝を発見した参加者は、を計算することができ、からへトークンを送り報酬を得る。
- 開催者は、参加者を増やすとき、人の新規参加者のアドレスと個の既存お宝のバイト列から、を計算し、末尾20バイトをアドレスとする 。そして、行列をトークンコントラクトに送信する。トークンコントラクトは、新規行列を既存行列に合成して保存する。
- 開催者は、お宝を増やすとき、人の既存参加者のアドレスと個の新規お宝のバイト列から、を計算し、末尾20バイトをアドレスとする 。そして、行列をトークンコントラクトに送信する。トークンコントラクトは、新規行列を既存行列に合成して保存する。
考えられる戦略と耐性
- 参加者は、公開情報を用いて報酬を得ることができない。
- 参加者は、トークンコントラクトが保存している行列の第行を知っても、Keccak256の弱衝突耐性により、トークンを送ると報酬を得られるアドレスを計算することができない。
- 参加者は、参加者のトークン移転トランザクションを傍受しを知っても、Keccak256の原像攻撃困難性により、を計算することができない。
- 参加者は、お宝を発見したならば、その報酬の内容を事前に知ることができる。
- 参加者は、お宝を発見したとき、がのうちのどれかを直ちに知ることはできない。しかし、とを用いてを計算し、トークンコントラクトが保存している行列でが存在する列を探すことができる。それが第列だったとすれば、を知ることができる。
- 全てのお宝は正の報酬を持っていることが保証されている場合、これは問題にならない。
この戦略を防ぎたいのであれば、全てのお宝は先着1名にのみ報酬を与えることとすればよい。2018-11-06訂正
- 参加者は、レインボーテーブル攻撃を行うことができる。
- ゆえに、お宝のバイト列は十分長くする必要がある。
- 参加者は、複数人を装って登録することで有利になることができる。
- お宝の報酬を何度も得て、1つのアドレスに集約することができる。
- この戦略を防ぎたいのであれば、全てのお宝は先着1名にのみ報酬を与えることとするか、開催者が登録時に本人確認をすればよい。
- 複数人の参加者が結託して有利になることができる。
- お宝のバイト列を共有することができる。
- この戦略を防ぎたいのであれば、全てのお宝は先着1名にのみ報酬を与えることとすればよい。
PoC
https://github.com/AzonTi/TrueTECH
参考
Bitcoinによる新しいCapture The Flag(CTF)
某イベント、トークンに価値をつけないんだったら、そもそもEthereumでやる必要ある?