2023.10.10
Oasysブロックチェーンでトークンを発行する
こんにちは。次世代システム研究室のT.M です。
はじめに
ブロックチェーンの活用事例としてブロックチェーンゲームが増えてきました。従来のブロックチェーンでは、処理速度の遅さやユーザが手数料を支払う必要がある、などユーザビリディの観点でゲームに向いていませんでした。これらの問題を解決したOasysと呼ばれるゲームに特化したブロックチェーンが誕生し、ブロックチェーンゲームにおいて利用される事例が増えてきました。本稿では、Oasysでトークンの発行の方法について解説をします。
Oasysとは
処理速度の速さやユーザが手数料を支払う必要がない、などゲームに必要な機能を備えたゲーム特化型のブロックチェーンです。EVM互換のプロトコルであるため、イーサリアムと同様にsolidityでスマートコントラクトの開発をすることができます。ゲームごとにVerseと呼ばれるL2チェーンを容易に構築することで、スケーラビリティやユーザの手数料を不要にする、などを実現しています。
トークンコントラクトデプロイ
テストネットのVerseであるSAND Verseにトークンコントラクトをデプロイします。デプロイするコントラクトはOpenZeppelinのERC20コントラクトをデプロイします。
MetaMaskネットワーク設定
RPC URLをhttps://rpc.sandverse.oasys.games、チェーンIDを20197でMetaMaskのネットワークに追加します。
ネイティブトークン入手
SAND Verseにコントラクトをデプロイするためには、手数料としてSAND Verseのネイティブトークンが必要です。faucetから手に入れることができます。
コントラクト実装
Remix IDEでコントラクトを実装します。以下のようなERC20を実装します。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "github.com/OpenZeppelin/openzeppelin-contracts/blob/audit/2023-07-24/contracts/token/ERC20/ERC20.sol"; import "github.com/OpenZeppelin/openzeppelin-contracts/blob/audit/2023-07-24/contracts/access/Ownable.sol"; contract SampleToken is ERC20, Ownable { constructor() ERC20("SampleToken", "STK") Ownable(msg.sender) {} function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } }
注意
2023年9月時点では、Oasysは0.8.20のコンパイラに対応しておりません。そのため、0.8.19以下のバージョンのコンパイラを利用する必要があります。一方、OpenZeppelinの最新のコードは0.8.20のバージョンになっているため、最新ではなく古いバージョンを指定してインポートする必要があります。
コントラクトデプロイ
MetaMask経由でコントラクトをデプロイします。この時、ガス代は0.000000001Gweiに変更してTXを承認します。
トークン発行
MintのTXを実行して、トークンを発行します。この時、TXが高速で処理がされ、また、ガス代が0Gweiでも処理がされることを確認することができます。
Verse構築
OasysにおけるL2チェーンであるVerseを構築します。Verseはスタンドアロンのノードとなっており、並列化をすることができません。
ウォレット作成
Builder、Sequencer、Proposerと呼ばれるアカウントのウォレットを作成します。BuilderはVerseを構築するアカウント、SequencerはVerseレイヤのデータをHubレイヤにロールアップするSequencerノードと呼ばれるノードで利用されるアカウント、ProposerはVerseレイヤのMerkle TreeをHubレイヤにロールアップするProposerノードと呼ばれるノードで利用されるアカウントです。
git clone https://github.com/oasysgames/verse-layer-optimism.git cd verse-layer-optimism docker-compose run --rm wallet
実行すると、./data/wallet/keys.txt にウォレットが作成されます。
ネイティブトークン入手
Builder、Sequencer、Proposerに対して、L1のfaucetからネイティブトークンのOASを入手する。
ネイティブトークンデポジット
Verseを構築するためには、メインネットでは1,000,000OASを、テストネットでは0.000000001OASをデポジットする必要があります。https://tools-fe.oasys.games/でMetaMaskと接続し、Builderアカウントからデポジットを行います。
Verse構築
https://tools-fe.oasys.games/build-verseでVerseを構築します。ChainIdはユニークなIDであり、Sequencer、Proposerはウォレット作成時に作成されたアカウントを設定します。
Config取得
作成されたVerseのconfigを取得します。addresses.jsonとgenesis.jsonをダウンロードし、./assetsに保存します。
.env作成
.env.sample.testnetから.envを作成し、空欄になっている変数を設定します。
コンテナ実行
data-transport-layer、l2geth、message-relayer、batch-submitterのコンテナを実行します。
docker-compose up -d data-transport-layer docker-compose up -d l2geth docker-compose up -d batch-submitter docker-compose up -d message-relayer
注意
- L1ブロック同期エラー
data-transport-layerを起動するとL1ブロックチェーンの同期が開始します。テストネットのためか、もしくは、私の環境の問題なのか、同期が失敗してリスタートする、というのが繰り返されました。同期が成功するまで、数時間必要でした。時間をかけたくない場合は、docker-compose.yamlでDATA_TRANSPORT_LAYER__SYNC_FROM_L1をfalseにすることで同期をしないようにすることができます。 - listen unix /root/.ethereum/geth.ipc: bind: operation not permitted エラー
Ranchar Desktop を使っている場合、コンテナからホストにマウントしているディレクトリの書き込みが失敗することがあります。以下の内容を~/Library/Application\ Support/rancher-desktop/lima/_config/override.yamlに配置してください。mountType: 9p mounts: - location: "~" 9p: securityModel: mapped-xattr cache: "mmap"
まとめ
ゲーム特化型のブロックチェーンであるOasysでトークンの発行やL2チェーンであるVerseの構築を行いました。EVMプロトコル互換であるため、Ethereumに慣れている開発者ならば容易に開発を行うことができます。今後、ブロックチェーンゲームが盛り上がるに伴いOasysが重要になってくるので、より深く調査・検証を行っていきたいと考えています。
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。
皆さんのご応募をお待ちしています。
参考
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD