Meta(旧Facebook)が開発したスマートコントラクトを記述できるプログラミング言語Moveを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
国内・海外のブロックチェーンエンジニアのおすすめ求人サイトを知りたいあなたはこちらからどうぞ.
目次
プログラミング言語Move
Moveは,Meta(旧Facebook)が開発したスマートコントラクト向けプログラミング言語です.
Moveの特徴は以下になります.
- Meta(旧Facebook)が開発し,仮想通貨Diemでスマートコントラクトを記述するために利用されたこと
- Rust言語で開発され,Rust言語の長所である強力な型システムとリソース管理の仕組みにより,メモリ安全性が保証されること
- イーサリアムのスマートコントラクト向けプログラミング言語Solidityより安全で信頼性が高いこと
- イーサリアムのERC-20のようなFungible Token(FT),ERC-721のようなNon-Fungible Token(NFT)を作成できること(同じではない)
Rust,Solidityを知りたいあなたはこちらからどうぞ.
MoveはGitHubにオープンソースとして公開されています.
ライセンスはApache License 2.0です.
Moveの解説動画はこちらです.
Moveを利用しているブロックチェーン基盤
Moveを利用しているブロックチェーン基盤は以下になります.
MoveでHello Worldを表示
MoveでHello Worldを表示します.
本記事では,Moveの仮想マシン(Docker)を利用するリポジトリを利用します.
また,OSはUbuntu 22.04 LTSです.
Rustとcargoをインストール
Rustとcargoを以下のコマンドでインストールします.
1 |
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
cargoの実行ファイルにパスを通します.
毎回入力するのが面倒な場合は,シェルの設定ファイルに追加しましょう!
1 |
$ source "$HOME/.cargo/env" |
Move CLIをインストール
Move CLIを以下のコマンドでインストールします.
1 |
$ cargo install --git https://github.com/move-language/move move-cli --branch main |
本記事で利用するMoveのバージョンは0.1.0です.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
$ move move-cli 0.1.0 Diem Association <opensource@diem.com> MoveCLI is the CLI that will be executed by the `move-cli` command The `cmd` argument is added here rather than in `Move` to make it easier for other crates to extend `move-cli` USAGE: move [OPTIONS] <SUBCOMMAND> OPTIONS: --abi Generate ABIs for packages --arch <ARCHITECTURE> -d, --dev Compile in 'dev' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used if this flag is set. This flag is useful for development of packages that expose named addresses that are not set to a specific value --doc Generate documentation for packages --fetch-deps-only Only fetch dependency repos to MOVE_HOME --force Force recompilation of all packages -h, --help Print help information --install-dir <INSTALL_DIR> Installation directory for compiled artifacts. Defaults to current directory -p, --path <PACKAGE_PATH> Path to a package which the command should be run with respect to --test Compile in 'test' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used along with any code in the 'tests' directory -v Print additional diagnostics if available -V, --version Print version information SUBCOMMANDS: build Build the package at `path`. If no path is provided defaults to current directory coverage Inspect test coverage for this package. A previous test run with the `--coverage` flag must have previously been run disassemble Disassemble the Move bytecode pointed to docgen Generating javadoc style documentation for packages using the Move Prover errmap Generate error map for the package and its dependencies at `path` for use by the Move explanation tool experimental (Experimental) Run static analyses on Move source or bytecode help Print this message or the help of the given subcommand(s) info Print address information movey-login movey-upload Upload the package metadata to Movey.net new Create a new Move package with name `name` at `path`. If `path` is not provided the package will be created in the directory `name` prove Run the Move Prover on the package at `path`. If no path is provided defaults to current directory. Use `.. prove .. -- <options>` to pass on options to the prover sandbox Execute a sandbox command test Run Move unit tests in this package |
Moveで「Hello World!」を表示するコードを作成
MoveでHello Worldを表示するコードを作成します.
以下の手順で実行しましょう!
step
1helloという名前のmoveパッケージを作成
まずは,以下のコマンドでhelloという名前のmoveパッケージを作成します.
treeコマンドを実行するとMove.tomlファイルとsourcesディレクトリが作成されていることがわかります.
※treeコマンドがインストールされていない場合は「sudo apt-get install tree」でインストールしましょう.
1 2 3 4 5 6 7 8 |
$ move new hello $ cd hello $ tree . |-- Move.toml `-- sources 1 directory, 1 file |
step
2hello.moveファイルを作成
「Hello World!」を表示するhello.moveファイルをsourcesディレクトリに作成します.
1 2 3 4 5 6 7 8 9 10 11 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ script { use std::debug; fun print_hello() { let str = b"Hello World!"; debug::print(&str); } } |
step
3Move.tomlファイルを更新
Move.tomlファイルを更新します.
更新部分は,7行目の「MoveNursery = { git = "https://github.com/move-language/move.git", subdir = "language/move-stdlib/nursery", rev = "main" }」の部分です.
1 2 3 4 5 6 7 8 9 10 |
[package] name = "hello" version = "0.0.0" [dependencies] MoveStdlib = { git = "https://github.com/move-language/move.git", subdir = "language/move-stdlib", rev = "main" } MoveNursery = { git = "https://github.com/move-language/move.git", subdir = "language/move-stdlib/nursery", rev = "main" } [addresses] std = "0x1" |
step
4「Hello World!」を表示
Move 0.1.0では,文字列をサポートしていないのでバイト列で「Hello World!」を表示します.
以下のコマンドを実行しましょう!
1 2 |
$ move sandbox run sources/hello.move [debug] (&) [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33] |
2行目の「debug [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]」の「[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]」が「Hello World!」になります.
※「Hello World!」が正しく表示されているかは,ASCIIコード表をみると確認できます.
参考までに,以下の値になります.
- 72:'H'
- 101:'e'
- 108:'l'
- 111:'o'
- 32:' '
- 87:'W'
- 114:'r'
- 100:'d'
- 33:'!'
まとめ
Meta(旧Facebook)が開発したスマートコントラクトを記述できるプログラミング言語Moveを紹介しました.
MoveはRustの長所を持ち,Solidityより安全で信頼性が高いことがわかりました.
Moveを深く理解したいあなたは,以下の記事を読みましょう!
国内・海外のブロックチェーンエンジニアのおすすめ求人サイトを知りたいあなたはこちらからどうぞ.