Movementというブロックチェーンネットワークを触ってみる
たまたま見つけたMovementというブロックチェーンネットワークに興味を持ったので、ざっとまとめてみます。
Movementとは?
公式サイト
公式ドキュメントMovementはMove言語をベースとするモジュラー型のブロックチェーンネットワークであり、その開発のためのフレームワークを提供している。
2023年12月現在、「M1」「M2」の2つのテストネットが存在する。
M1の特徴
- Avalanche Subnet
- Aptos互換 (将来的にSuiにも対応)
- Move VM
- Fractal対応で、Solidityスマコンもデプロイ可能
- Snowman Consensus
M2の特徴
- Ethereum L2
- Sui互換
- Move VM
- Data Availability(DA)レイヤーにCelestiaを採用
- M1がSuiに対応後、M2は新しい目的に置き換えられる(repurposed)
> Move VMをAvalancheのコンセンサスで高速並列処理できるなんて面白そうですね!
(14万TPS超えらしい)
M2を触ってみる
筆者はEVM系のチェーンしか使ったことがなく、特にSuiには前から興味があったので早速M2から触ってみることに。
(ここからは基本的に公式ドキュメントにのっとり進めますので、詳細はそちらをご確認ください。)
1. Suiウォレットを用意
こちらのChrome拡張をインストールし作成。
M2テストネットのカスタムRPCを設定する。
https://devnet.m2.movementlabs.xyz
2. 資金調達
こちらからテストネットトークンのMOVを入手。
3. 開発環境の準備
VS CodeのDev Containersを使います。
Dockerイメージをぷる。
docker pull mvlbs/m1-cli
コンテナ立ち上げ。
docker run -it -v "$(pwd):/workspace" mvlbs/m1-cli /bin/bash
/workspace内で新規Sui Moveプロジェクト作成。
movement sui move new [任意のプロジェクト名]
4. Moveを書く
プロジェクト内、/sources配下に.moveファイルを作成。
今回はSui公式のサンプルNFTを参考に実装(ほぼコピペ)。
できたものはこちら。
5. M2テストネットにデプロイしてみる
movement sui client publish --gas-budget 20000000
初めてデプロイしようとすると以下のようなメッセージが出てくるので、yで進む。
Config file ["/root/.sui/sui_config/client.yaml"] doesn't exist, do you want to connect to a Sui Full node server [y/N]?
y
次のプロンプトで、ポート番号付きのRPC URLを入力する。
Sui Full node server URL (Defaults to Movement Sui Devnet if not specified) :
https://devnet.m2.movementlabs.xyz:443
エイリアスの設定を求められるので、なんでも良いがここでは"m2"と入れておく。
Environment alias for [https://devnet.m2.movementlabs.xyz:443] :
m2
鍵のアルゴリズムをどれにするか求められるので、自分は"0"(ed25519)を選択。
Select key scheme to generate keypair (0 for ed25519, 1 for secp256k1, 2: for secp256r1):
0
するとウォレットアドレスがシードフレーズと共に生成されるので、Sui Walletに追加してそこにMOVを入れたいところだが、デプロイのコマンドを打っていたのでそのままビルドに進む...
アーー!!
[warn] Client/Server api version mismatch, client api version : 1.15.0-canonical-sui, server api version : 1.14.0
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING m2_test
error[Sui E01001]: invalid object construction
┌─ /root/.move/https___github_com_MystenLabs_sui_git_framework__testnet/crates/sui-framework/packages/sui-framework/sources/random.move:53:20
│
53 │ let self = Random {
│ ╭────────────────────^
54 │ │ id: object::randomness_state(),
│ │ -- -------------------------- Non fresh UID from this position
│ │ │
│ │ The UID must come directly from sui::object::new. Or for tests, it can come from sui::test_scenario::new_object
55 │ │ inner: versioned::create(version, inner, ctx),
56 │ │ };
│ ╰─────────^ Invalid object creation without a newly created UID.
コンパイルエラーが起きました。
クライアントとサーバーAPIのバージョンが異なっているというwarningが出ているのも気になりますね。
使用したのはDockerの環境でインストールされているものなので、一旦Discordにその件を投げてみました。(特に返信は来ず...)
気を取り直して...
というわけでDockerコンテナのMovement CLIではうまくいかなかったので、ローカルにSui CLIをインストールしてやってみます。
1. Sui CLIのインストール
cargo install --locked --git https://github.com/MystenLabs/sui.git --branch testnet sui
2. M2環境を追加
sui client new-env --rpc https://devnet.m2.movementlabs.xyz:443 --alias m2
またアドレスが生成されるので、Sui WalletにインポートしてそこにMOVを入れておく。
追加したM2環境に切り替え
sui client switch --env m2
3. 今度こそデプロイを
sui client publish --gas-budget 20000000
アアアーー!!!
Failed to publish the Move module(s), reason: [warning] Multiple source verification errors found:
- On-chain version of dependency Sui::random was not found.
- On-chain version of dependency Sui::token was not found.
- Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::zklogin_verified_issuer
- Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::object
- Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::zklogin_verified_id
- Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::transfer_policy
This may indicate that the on-chain version(s) of your package's dependencies may behave differently than the source version(s) your package was built against.
Fix this by rebuilding your packages with source versions matching on-chain versions of dependencies, or ignore this warning by re-running with the --skip-dependency-verification flag.
またしてもエラーです。
でも以前はあったコンパイルエラーはなくなり、原因はどうやらパッケージのバージョン違いとのことなので、一旦メッセージに書いてあるとおりフラグを付けて再度試す。
sui client publish --gas-budget 20000000 --skip-dependency-verification
キタ――(゚∀゚)――!!
Transaction Digest: 2hoivUGrzXtZDSCK2bNk2PCFJMTgWsv26WzMnZPY4BCJ
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Data │
├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ Gas Owner: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ Gas Budget: 20000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Version: 37 │
│ │ Digest: DAuLLwerUH7YAov79ZtTziCDFRqCbgnXqhK7TrL1ed9R │
│ └── │
│ │
│ Transaction Kind : Programmable │
│ Inputs: [Pure(SuiPureValue { value_type: Some(Address), value: "0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000" })] │
│ Commands: [ │
│ Publish(<modules>,0x0000000000000000000000000000000000000000000000000000000000000001,0x0000000000000000000000000000000000000000000000000000000000000002), │
│ TransferObjects([Result(0)],Input(0)), │
│ ] │
│ │
│ │
│ Signatures: │
│ 3M600Dz9EBcQZSlDol3m3daK/IJAgVn0sEFKgXZ9BCMLm4SGK0hfTc3HtKEiroeNAQgBgPg9IXV7B5RFtRMrDg== │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Effects │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Digest: 2hoivUGrzXtZDSCK2bNk2PCFJMTgWsv26WzMnZPY4BCJ │
│ Status: Success │
│ Executed Epoch: 27 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3 │
│ │ Owner: Immutable │
│ │ Version: 1 │
│ │ Digest: DtuetTEUthCjgN7YwJomkfJja7NY3yDiDca4CNGeBjL4 │
│ └── │
│ ┌── │
│ │ ID: 0xc2f1ff5ac3ca95390102cfaa9138a355b4892923a0f250b862f4549b4a04a6b0 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 38 │
│ │ Digest: EvASj4LYvgrbqUwbviYT9QsMMbp1XYC8cHtBn1Gy614B │
│ └── │
│ │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 38 │
│ │ Digest: HirqrFKXVWsw2nB3Sv1hbNkybKNhrVUMc5C1aaZjzEFp │
│ └── │
│ │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 38 │
│ │ Digest: HirqrFKXVWsw2nB3Sv1hbNkybKNhrVUMc5C1aaZjzEFp │
│ └── │
│ │
│ Gas Cost Summary: │
│ Storage Cost: 11103600 │
│ Computation Cost: 1000000 │
│ Storage Rebate: 978120 │
│ Non-refundable Storage Fee: 9880 │
│ │
│ Transaction Dependencies: │
│ 34gMyzi9jNSkTa3gctK9tAcDNBjJWpnK4jPmDmUUF3pt │
│ E486NBRLMy4bS7W937TSWKKEHVzibgZ8nE8fPbJDdHUH │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ No transaction block events │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0xc2f1ff5ac3ca95390102cfaa9138a355b4892923a0f250b862f4549b4a04a6b0 │
│ │ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ ObjectType: 0x2::package::UpgradeCap │
│ │ Version: 38 │
│ │ Digest: EvASj4LYvgrbqUwbviYT9QsMMbp1XYC8cHtBn1Gy614B │
│ └── │
│ │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 38 │
│ │ Digest: HirqrFKXVWsw2nB3Sv1hbNkybKNhrVUMc5C1aaZjzEFp │
│ └── │
│ │
│ Published Objects: │
│ ┌── │
│ │ PackageID: 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3 │
│ │ Version: 1 │
│ │ Digest: DtuetTEUthCjgN7YwJomkfJja7NY3yDiDca4CNGeBjL4 │
│ | Modules: devnet_nft │
│ └── │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Balance Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -11125480 │
│ └── │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
いけたっぽいですね。
Sui Explorerでも諸々確認できました。
トランザクション
パッケージ
オブジェクト
4. NFTをMintしてみる
sui client call --package 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3 --module devnet_nft --function mint --gas-budget 10000000 --args "test name" "test desc" "https://www.sui.io"
Transaction Digest: 2S1FEQeD36ugycor2asQ5bQ1A6ofsEMvK8swKAabnJHv
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Data │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ Gas Owner: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ Gas Budget: 10000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Version: 38 │
│ │ Digest: HirqrFKXVWsw2nB3Sv1hbNkybKNhrVUMc5C1aaZjzEFp │
│ └── │
│ │
│ Transaction Kind : Programmable │
│ Inputs: [Pure(SuiPureValue { value_type: Some(Vector(U8)), value: "test name" }), Pure(SuiPureValue { value_type: Some(Vector(U8)), value: "test desc" }), Pure(SuiPureValue { value_type: Some(Vector(U8)), value: "https://www.sui.io" })] │
│ Commands: [ │
│ MoveCall(0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3::devnet_nft::mint(Input(0),Input(1),Input(2))), │
│ ] │
│ │
│ │
│ Signatures: │
│ m5sehgk5pHwzb7Q2AcNFA/H4FPNDwqSYCeU9cKLIpbjLdyXDergT9DHaGhljtSCwRcpl7ffs5q0EKqnzWUNmBA== │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Effects │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Digest: 2S1FEQeD36ugycor2asQ5bQ1A6ofsEMvK8swKAabnJHv │
│ Status: Success │
│ Executed Epoch: 27 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0xc6924c2f7dbc2c93cad897f4deb8d8b5f502250690d70c1d2138f885e04dd99d │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 39 │
│ │ Digest: Cqn28YYhTvRrRw87iCLAEMuLqhj9F79686TmEvEGPoSw │
│ └── │
│ │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 39 │
│ │ Digest: 81GxDmHYq8qgurKB3CUf8P9XDczQc3jhfsqmznrTsxVA │
│ └── │
│ │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ Version: 39 │
│ │ Digest: 81GxDmHYq8qgurKB3CUf8P9XDczQc3jhfsqmznrTsxVA │
│ └── │
│ │
│ Gas Cost Summary: │
│ Storage Cost: 2622000 │
│ Computation Cost: 1000000 │
│ Storage Rebate: 978120 │
│ Non-refundable Storage Fee: 9880 │
│ │
│ Transaction Dependencies: │
│ 2hoivUGrzXtZDSCK2bNk2PCFJMTgWsv26WzMnZPY4BCJ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Block Events │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ EventID: 2S1FEQeD36ugycor2asQ5bQ1A6ofsEMvK8swKAabnJHv:0 │
│ │ PackageID: 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3 │
│ │ Transaction Module: devnet_nft │
│ │ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ │ EventType: 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3::devnet_nft::MintNFTEvent │
│ │ ParsedJSON: │
│ │ ┌───────────┬────────────────────────────────────────────────────────────────────┐ │
│ │ │ creator │ 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │ │
│ │ ├───────────┼────────────────────────────────────────────────────────────────────┤ │
│ │ │ name │ test name │ │
│ │ ├───────────┼────────────────────────────────────────────────────────────────────┤ │
│ │ │ object_id │ 0xc6924c2f7dbc2c93cad897f4deb8d8b5f502250690d70c1d2138f885e04dd99d │ │
│ │ └───────────┴────────────────────────────────────────────────────────────────────┘ │
│ └── │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0xc6924c2f7dbc2c93cad897f4deb8d8b5f502250690d70c1d2138f885e04dd99d │
│ │ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ ObjectType: 0x5c7bfebe05c4756dee16b35ba0b020b7b3b012009ab07ac1392d7aa77dc703e3::devnet_nft::DevNetNFT │
│ │ Version: 39 │
│ │ Digest: Cqn28YYhTvRrRw87iCLAEMuLqhj9F79686TmEvEGPoSw │
│ └── │
│ │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x0dbea68d3ffd1e4d2b5c13bd95e9debf0b81ca665eddc407f82e652e8455a578 │
│ │ Sender: 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 39 │
│ │ Digest: 81GxDmHYq8qgurKB3CUf8P9XDczQc3jhfsqmznrTsxVA │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Balance Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0x9d92e05f49003c433b445dc32b6d7eb8295b06085f762ed27e4ea12a9b4ff000 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -2643880 │
│ └── │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
トランザクション
オブジェクト
M1をEVMのスマコンで触ってみる
M1ではSolidityで書かれたコントラクトもデプロイできるとのことなので、そちらも触ってみます。
1. EVM対応ウォレットにネットワークを追加・接続
ネットワーク名
Move-EVM
RPC URL
https://mevm.devnet.m1.movementlabs.xyz/v1
チェーンID
336
通貨記号
MOV
2. 資金調達
こちらのfaucetでMEVM用のMOVを入手。
3. Remixでコントラクトをデプロイ
RemixでERC721のテンプレートを用いてコントラクトを作成し、コンパイル。
"Injected Provider"を選択してウォレットを接続。
自身のアカウントにMOVの残高があることを確認し、デプロイ。
成功後、M1のExplorerからトランザクションを確認できます。
おわりに
今回はMovementのSui互換性を持つM2テストネットと、SolidityコントラクトをデプロイできるM1テストネットを触ってみました。
まだまだ開発段階でドキュメントも不十分なところが多いですが、非常に高いポテンシャルを持っていると思うので今後の動向にも期待したいですね。
Discussion