主に3種のERC20/ERC721のSmart Contractと、4種の報酬決定用のSmart Contractがサービス内で利用されます。
Polygon PoS上にデプロイされるユーティリティトークン(ERC20)です。
ゲームプレイの報酬や、つるはしの回復、つるはしのレベルアップなどに利用されます。
発行上限は10億トークンで、発行元であるBrilliantcrypto社が任意のタイミングで発行をすることができます。
任意の発行タイミングについてはこちらを参照ください。
Polygon PoS上にデプロイされるつるはしのNFT(ERC721)です。
つるはしはゲームプレイする際に必要なアイテムです。
ゲーム内マーケットで購入した場合はBrilliantcryptoのウォレットで保管され、オフチェーン上でユーザー所有の記録がなされます。
ゲーム外への持ち出しの際にユーザーのウォレットアドレスに転送されます。
ゲーム外への持ち出しの際にはゲーム内でのレベルアップした結果などをNFTに反映するためmetadataの更新が行われます。
ゲームに組み込まれているウォレットからBrilliantcryptoのウォレットに転送することで再びゲーム内での利用(ゲームプレイ、レベルアップ、ゲーム内マーケットプレイスでの販売)が可能になります。
外部マーケット用にRoyalty Fee(ERC2981)の設定がなされています。
またOpenSeaが提供するOperator Filter Registryの機能を用いて、特定のマーケットでの取引を制限する機能を有します。
Ethereum上にデプロイされる宝石のNFT(ERC721)です。
ゲームプレイの報酬として得た宝石は、プレイヤーの任意のタイミングでNFT化することができます。
その際Brilliantcryptoにより、猶予時間を経てユーザーのウォレットに対して発行が実行されます。
ゲームに組み込まれているウォレットからburnを実行することで再びゲーム内での利用(ゲーム内マーケットプレイスでの販売等)が可能になります。
外部マーケット用にRoyalty Fee(ERC2981)の設定がなされています。
またOpenSeaが提供するOperator Filter Registryの機能を用いて、特定のマーケットでの取引を制限する機能を有します。
Polygon PoS上にデプロイされる宝石確定シードとBitcoinのblock hashから鉱山の報酬の概要を決定する参照用のコントラクトです。
報酬の概要は宝石の数と大まかな大きさなどを指します。
このコントラクトはゲームにおける地域単位でデプロイされ、地域内の鉱山の報酬概要に必要な確率の情報が埋め込まれ、デプロイされて以降に変更されることはありません。
地域や宝石の追加をする場合は新たにその地域専用のロジックを持つコントラクトがデプロイされます。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。
Polygon PoS上に宝石確定シードと報酬概要のデータ、Bitcoinのblock hashから鉱山で獲得できる宝石の詳細を決定する参照用のコントラクトです。
詳細というのはクオリティや大きさ、カットなどを指します。
このコントラクトは地域単位でデプロイされ、地域内の鉱山の詳細決定に必要な確率の情報が埋め込まれ、デプロイされて以降に変更されることはありません。
地域や宝石の追加をする場合は新たにその地域/宝石専用のロジックを持つコントラクトがデプロイされます。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。
Polygon PoS上にデプロイされるBrilliantcryptoが公開した鉱山のデータおよびプレイヤーが取得した鉱山のデータを記録するコントラクトです。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。
Polygon PoS上にデプロイされるシードの一部となるBitcoinのblock hashを記録するコントラクトです。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。
鉱山の報酬の概要と宝石詳細の決定がどのようになされるのかを説明します。
大まかなフローは以下のとおりです。
※Bitcoinのblock timeは決定的な値ではないため、参照ブロックからの任意のブロック数先のブロックを詳細の決定に利用します。
※公開する鉱山情報の書き込みが遅れた場合その鉱山の公開はキャンセルされます。また、詳細を決定するためのBitcoinのblock hashの出現までに宝石詳細の参照block hashが書き込めなかった場合は、宝石の詳細決定は次回の宝石決定のタイミングまで延期されます。
タイムラインを図示します。
上記をシードとしてkeccak256を用い、宝石の数、大きさを決定します。
ランダム要素はないため、何度実行しても結果が変わることはありません。
またプレイヤーにより結果が変わることはありません。
※実質的なfinalityである6ブロックを待ってから確定とします
万が一Bitcoinに大規模なreorgが発生した際でもBrilliantcryptoが当時記録したblock hashを変更することはありません。
公開した鉱山について以下のデータをjson化しHash化したものをブロックチェーン上に記録します。
この記録により宝石の概要が定まってないタイミングでのみ鉱山が公開されることを保証します。
期間中にユーザーによって取得された鉱山について以下のデータをjson化しHash化したものをブロックチェーン上に記録します。
この記録により宝石の詳細が決まっていないタイミングでのみ鉱山の取得がなされることを保証します。
上記をシードとしてkeccak256を用い、宝石のクオリティ、サイズ、カットの種類などを決定します。
ランダム要素はないため、何度実行しても結果が変わることはありません。
またプレイヤーにより結果が変わることはありません。
※実質的なfinalityである6ブロックを待ってから確定とします
万が一Bitcoinに大規模なreorgが発生した際でもBrilliantcryptoが当時記録したblock hashを変更することはありません。
「鉱山の報酬、宝石の決定ロジック」で説明した通り様々なデータがブロックチェーンに記録されますが、これらのデータを元に実際に検算することで宝石の情報が改ざんされていないことを証明できます。
検算手順を説明します。
まず、アプリから検算に必要な「宝石確定用パラメータ」を取得します。
鉱山データベースを開き、「採掘された宝石」に検証したい宝石のトークンIDを入力し検索します。
検索結果の鉱山の表示にて鉱山名の右側のアイコンをクリックすると「宝石確定用パラメータ」が取得できます。
※廃棄した山のみ鉱山データベースに登録されます
※宝石の詳細が決定していないタイミングでは一部のデータが決定していないため返りません
次に「鉱山取得データ」を取得します。
「取得リストURL」にアクセスすると、対象の鉱山が属する期間に取得された鉱山一覧がjson形式で得られます。
各データの「jewel_seed_hash」に「宝石確定シード」をSHA-256のハッシュ化したものが入っているので、「宝石確定シード」をSHA-256ハッシュ化してファイル内を検索して、該当する鉱山のデータ(以下、鉱山エビデンス)を取得してください。
以上で得られた情報を元にコントラクトメソッドを実行して検算を行います。
※「鉱山取得データ」の正当性の検証手順は「検算のための補助情報」を参照してください
コントラクトメソッドを呼び出して検算をします。コントラクト呼び出しのためのABIについては「検算のための補助情報」を参照してください。
検算のためのBitcoinのblock hashを取得します。
「鉱山エビデンス」の contract_block_evidence_address がBitcoinのblock hashを保存しているコントラクトのアドレスです。ABIはBlockEvidence.jsonを使用します。
まず、「宝石の概要用のBitcoinのblock hash」を得ます。
getBlockForOverviewAndDetailReference メソッドを呼び出してください。
次に、「宝石の詳細用のBitcoinのblock hash」を得ます。
getBlockForDetailメソッドを以下を指定して呼び出してください。
結果の0番目が「宝石の詳細用のBitcoinのblock hash」です。
宝石の概要を検算します。
「鉱山エビデンス」の contract_jewel_overview_address が概要決定のコントラクトアドレスです。ABIはMountainJewelOverview.jsonを使用します。
confirmOverviewsメソッドを呼び出してください。
結果として返る配列のデータ1つ1つが宝石の概要です。
宝石の概要の結果を元に宝石の詳細を検算します。
「鉱山エビデンス」のcontract_jewel_detail_addressが詳細決定のコントラクトのアドレスです。ABIはMountainJewelDetail.jsonを使用します。
confirmDetailメソッドを呼び出してください。
結果として1つの宝石分の詳細のデータが返ります。
これを概要の検算で返されたすべての宝石に対して行い、結果に含まれているかを確認することで検算可能です。
コントラクトのABI
「鉱山取得データ」の正当性の検証手順
「鉱山エビデンス」のcontract_mountain_evidence_hash_addressが「鉱山取得データ」のファイルのハッシュを保存しているコントラクトのアドレスです。ABIはMountainEvidenceHash.jsonを使用します。
getHashメソッドを呼び出してください。
この結果が「鉱山取得データ」のファイルのSHA-256のハッシュ化したものと同じであることを確認。