Brilliantcrypto

ゲームをダウンロード

Download for Windows (lightbox)

Hash(SHA256): edfc4a1a7a2a1757ae28ed00a12e99fa94a1bb12e6e0db3acf951ff9aeb9d6fd

Download for MAC (lightbox)

Hash(SHA256): c7f48e510b5963b4dd951577fffdd00a21f3ed9fa7e73bd77d44d1bc7fb810bb

■ 動作環境(PC版) ■
OS: Windows 10 / 11 (64bit) macOS 11 Big Sur
プロセッサー: Intel Core i5(7世代以降)
メモリー: 8 GB RAM
グラフィック: HD Graphics 630 同等以上
技術仕様

Smart Contract

主に3種のERC20/ERC721のSmart Contractと、4種の報酬決定用のSmart Contractがサービス内で利用されます。

ERC20/ERC721

BRIL

Polygon PoS上にデプロイされるユーティリティトークン(ERC20)です。 ゲームプレイの報酬や、つるはしの回復、つるはしのレベルアップなどに利用されます。 発行上限は10億トークンで、発行元であるBrilliantcrypto社が任意のタイミングで発行をすることができます。
任意の発行タイミングについてはこちらを参照ください。

コントラクト情報

  • チェーン: Polygon PoS
  • コントラクトアドレス: 0x4F800bA0DFF2980C5006C6816F7aA3De63Ce8087

つるはしNFT(Pickaxe)

Polygon PoS上にデプロイされるつるはしのNFT(ERC721)です。
つるはしはゲームプレイする際に必要なアイテムです。
ゲーム内マーケットで購入した場合はBrilliantcryptoのウォレットで保管され、オフチェーン上でユーザー所有の記録がなされます。
ゲーム外への持ち出しの際にユーザーのウォレットアドレスに転送されます。
ゲーム外への持ち出しの際にはゲーム内でのレベルアップした結果などをNFTに反映するためmetadataの更新が行われます。
ゲームに組み込まれているウォレットからBrilliantcryptoのウォレットに転送することで再びゲーム内での利用(ゲームプレイ、レベルアップ、ゲーム内マーケットプレイスでの販売)が可能になります。
外部マーケット用にRoyalty Fee(ERC2981)の設定がなされています。
またOpenSeaが提供するOperator Filter Registryの機能を用いて、特定のマーケットでの取引を制限する機能を有します。

コントラクト情報

  • チェーン: Polygon PoS
  • コントラクトアドレス: 0x4B6C04D043b8bE721F61e91d8a96e888A7435283

宝石NFT(Gem)

Ethereum上にデプロイされる宝石のNFT(ERC721)です。
ゲームプレイの報酬として得た宝石は、プレイヤーの任意のタイミングでNFT化することができます。
その際Brilliantcryptoにより、猶予時間を経てユーザーのウォレットに対して発行が実行されます。
ゲームに組み込まれているウォレットからburnを実行することで再びゲーム内での利用(ゲーム内マーケットプレイスでの販売等)が可能になります。
外部マーケット用にRoyalty Fee(ERC2981)の設定がなされています。
またOpenSeaが提供するOperator Filter Registryの機能を用いて、特定のマーケットでの取引を制限する機能を有します。

コントラクト情報

  • チェーン: Ethereum
  • コントラクトアドレス: 0x94F3Aa177f2B6D6fC90993A007F648115885C487

報酬決定用Smart Contract

鉱山報酬概要決定ロジック

Polygon PoS上にデプロイされる宝石確定シードとBitcoinのblock hashから鉱山の報酬の概要を決定する参照用のコントラクトです。
報酬の概要は宝石の数と大まかな大きさなどを指します。
このコントラクトはゲームにおける地域単位でデプロイされ、地域内の鉱山の報酬概要に必要な確率の情報が埋め込まれ、デプロイされて以降に変更されることはありません。
地域や宝石の追加をする場合は新たにその地域専用のロジックを持つコントラクトがデプロイされます。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。

宝石詳細決定ロジック

Polygon PoS上に宝石確定シードと報酬概要のデータ、Bitcoinのblock hashから鉱山で獲得できる宝石の詳細を決定する参照用のコントラクトです。
詳細というのはクオリティや大きさ、カットなどを指します。
このコントラクトは地域単位でデプロイされ、地域内の鉱山の詳細決定に必要な確率の情報が埋め込まれ、デプロイされて以降に変更されることはありません。
地域や宝石の追加をする場合は新たにその地域/宝石専用のロジックを持つコントラクトがデプロイされます。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。

鉱山の公開/取得データの記録

Polygon PoS上にデプロイされるBrilliantcryptoが公開した鉱山のデータおよびプレイヤーが取得した鉱山のデータを記録するコントラクトです。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。

Bitcoinのblock hashの記録

Polygon PoS上にデプロイされるシードの一部となるBitcoinのblock hashを記録するコントラクトです。
用途の詳細については「鉱山の報酬、宝石の決定ロジック」で説明します。

鉱山の報酬、宝石の決定ロジック

鉱山の報酬の概要と宝石詳細の決定がどのようになされるのかを説明します。
大まかなフローは以下のとおりです。

  • 公開する鉱山情報をブロックチェーンに記録
  • 任意のタイミング(UTCで1日で最後)で鉱山の報酬概要を決定するためのBitcoinのblock hashが決まる(Polygon PoSに保存)
  • 宝石確定シードと報酬概要用のBitcoinのblock hashにより鉱山の報酬概要が決定
  • プレイヤーによる鉱山が取得可能期間の開始
  • プレイヤーによる鉱山が取得可能期間の終了
  • 鉱山の取得情報をブロックチェーンに記録
  • 任意のタイミング(UTCで1日で最後)で宝石の詳細の参照block hashを決定するためのBitcoinのblock hashが決まる(Polygon PoSに保存)。あわせて宝石の詳細を決定するためのBitcoinのblock hashまでの参照ブロックからの任意のブロック数(40ブロック)を同時にPolygon PoSに保存
  • 参照block hashから任意のブロック数(40ブロック)先の宝石の詳細を決定するためのBitcoinのblock hashが決まる(Polygon PoSに保存)
  • 宝石の詳細の決定

※Bitcoinのblock timeは決定的な値ではないため、参照ブロックからの任意のブロック数先のブロックを詳細の決定に利用します。
※公開する鉱山情報の書き込みが遅れた場合その鉱山の公開はキャンセルされます。また、詳細を決定するためのBitcoinのblock hashの出現までに宝石詳細の参照block hashが書き込めなかった場合は、宝石の詳細決定は次回の宝石決定のタイミングまで延期されます。

タイムラインを図示します。

鉱山の報酬概要の決定

  • Brilliantcryptoが発行する宝石確定シード(鉱山クリア後にてゲーム内にて公開されます)
  • 鉱山の報酬概要シードであるBitcoinで生成されるblock hash※

上記をシードとしてkeccak256を用い、宝石の数、大きさを決定します。
ランダム要素はないため、何度実行しても結果が変わることはありません。
またプレイヤーにより結果が変わることはありません。

※実質的なfinalityである6ブロックを待ってから確定とします
万が一Bitcoinに大規模なreorgが発生した際でもBrilliantcryptoが当時記録したblock hashを変更することはありません。

鉱山の公開情報をブロックチェーンに記録

公開した鉱山について以下のデータをjson化しHash化したものをブロックチェーン上に記録します。

  • 期間ID
  • 地域ID
  • 宝石確定シードをハッシュ化したもの
  • コントラクトアドレス情報

この記録により宝石の概要が定まってないタイミングでのみ鉱山が公開されることを保証します。

鉱山の取得情報をブロックチェーンに記録

期間中にユーザーによって取得された鉱山について以下のデータをjson化しHash化したものをブロックチェーン上に記録します。

  • 期間ID
  • 地域ID
  • 宝石確定シードをハッシュ化したもの
  • 鉱山の取得に使用したつるはしID
  • コントラクトアドレス情報

この記録により宝石の詳細が決まっていないタイミングでのみ鉱山の取得がなされることを保証します。

宝石の詳細の決定

  • 鉱山の報酬概要
  • Brilliantcryptoが発行する宝石確定シード(鉱山クリア後にゲーム内にて公開されます)
  • 宝石の詳細決定用関数のシードとなるBitcoinで生成されるblock hash※

上記をシードとしてkeccak256を用い、宝石のクオリティ、サイズ、カットの種類などを決定します。
ランダム要素はないため、何度実行しても結果が変わることはありません。
またプレイヤーにより結果が変わることはありません。

※実質的なfinalityである6ブロックを待ってから確定とします
万が一Bitcoinに大規模なreorgが発生した際でもBrilliantcryptoが当時記録したblock hashを変更することはありません。

宝石情報の検算手順

「鉱山の報酬、宝石の決定ロジック」で説明した通り様々なデータがブロックチェーンに記録されますが、これらのデータを元に実際に検算することで宝石の情報が改ざんされていないことを証明できます。
検算手順を説明します。

Brilliantcryptoアプリ上で検算に必要なデータを得る

まず、アプリから検算に必要な「宝石確定用パラメータ」を取得します。
鉱山データベースを開き、「採掘された宝石」に検証したい宝石のトークンIDを入力し検索します。
検索結果の鉱山の表示にて鉱山名の右側のアイコンをクリックすると「宝石確定用パラメータ」が取得できます。

  • 宝石確定シード
  • 公開リストURL
  • 取得リストURL
  • 公開リストhashコントラクトキー
  • 取得リストhashコントラクトキー
  • 宝石概要hashコントラクトキー
  • 宝石詳細hashコントラクトキー

※廃棄した山のみ鉱山データベースに登録されます
※宝石の詳細が決定していないタイミングでは一部のデータが決定していないため返りません

検算用の「鉱山取得データ」を得る

次に「鉱山取得データ」を取得します。
「取得リストURL」にアクセスすると、対象の鉱山が属する期間に取得された鉱山一覧がjson形式で得られます。
各データの「jewel_seed_hash」に「宝石確定シード」をSHA-256のハッシュ化したものが入っているので、「宝石確定シード」をSHA-256ハッシュ化してファイル内を検索して、該当する鉱山のデータ(以下、鉱山エビデンス)を取得してください。
以上で得られた情報を元にコントラクトメソッドを実行して検算を行います。
※「鉱山取得データ」の正当性の検証手順は「検算のための補助情報」を参照してください

コントラクトによる検算

コントラクトメソッドを呼び出して検算をします。コントラクト呼び出しのためのABIについては「検算のための補助情報」を参照してください。

Bitcoinのblock hashの取得

検算のためのBitcoinのblock hashを取得します。
「鉱山エビデンス」の contract_block_evidence_address がBitcoinのblock hashを保存しているコントラクトのアドレスです。ABIはBlockEvidence.jsonを使用します。
まず、「宝石の概要用のBitcoinのblock hash」を得ます。
getBlockForOverviewAndDetailReference メソッドを呼び出してください。

  • _key … 「宝石確定用パラメータ」の「宝石概要hashコントラクトキー」
結果の0番目が「宝石の概要用のBitcoinのblock hash」です。

次に、「宝石の詳細用のBitcoinのblock hash」を得ます。
getBlockForDetailメソッドを以下を指定して呼び出してください。

  • _key … 「宝石確定用パラメータ」の「宝石詳細hashコントラクトキー」

結果の0番目が「宝石の詳細用のBitcoinのblock hash」です。

宝石の概要の検算

宝石の概要を検算します。
「鉱山エビデンス」の contract_jewel_overview_address が概要決定のコントラクトアドレスです。ABIはMountainJewelOverview.jsonを使用します。
confirmOverviewsメソッドを呼び出してください。

  • _islandId … 「鉱山エビデンス」のisland_id
  • _mountainSeed … 「宝石確定用パラメータ」の「宝石確定シード」
  • _bitcoinHash … 「宝石の概要用のBitcoinのblock hash」

結果として返る配列のデータ1つ1つが宝石の概要です。

  • 0番目 … 鉱山内の宝石のindex
  • 1番目 … 7段階の大まかな大きさ。アプリ上では4段階になります(1: Tiny, 2: Small, 3: Moderate, 4~7: Medium)

宝石の詳細の検算

宝石の概要の結果を元に宝石の詳細を検算します。
「鉱山エビデンス」のcontract_jewel_detail_addressが詳細決定のコントラクトのアドレスです。ABIはMountainJewelDetail.jsonを使用します。
confirmDetailメソッドを呼び出してください。

  • _islandId … 「鉱山エビデンス」のisland_id
  • _mountainSeed … 「宝石確定用パラメータ」の「宝石確定シード」
  • jewelIndex … 概要の結果から得られるindex
  • jewelSizeType … 概要の結果から得られる大まかな大きさ
  • _bitcoinHash … 「宝石の詳細用のBitcoinのblock hash」

結果として1つの宝石分の詳細のデータが返ります。

  • 0番目 … 鉱山内の宝石のindex
  • 1番目 … 7段階の大まかな大きさ
  • 2番目 … 宝石の種類(1: Diamond, 2: Aquamarine, 3: RedSpinel)
  • 3番目 … クオリティ(1: Accesory, 2: Jewelry, 3: Gem)
  • 4番目 … クオリティスケールの左上から0始まりのindex
  • 5番目 … 宝石のカット(1: Oval, 2: Round Brilliant, 3: Emerald, 4: Marquise, 5: PearShape, 6: Princess, 7: Heart-Shape, 8: Radiant)
  • 6番目 … カラット。100倍にした値が入っています(例: 0.1ctなら10)。

これを概要の検算で返されたすべての宝石に対して行い、結果に含まれているかを確認することで検算可能です。

検算のための補助情報

コントラクトのABI

「鉱山取得データ」の正当性の検証手順
「鉱山エビデンス」のcontract_mountain_evidence_hash_addressが「鉱山取得データ」のファイルのハッシュを保存しているコントラクトのアドレスです。ABIはMountainEvidenceHash.jsonを使用します。
getHashメソッドを呼び出してください。

  • _key … 「公開リストhashコントラクトキー」

この結果が「鉱山取得データ」のファイルのSHA-256のハッシュ化したものと同じであることを確認。