lesson-1_コントラクトの基礎を実装しよう
⛩ コントラクトの基盤を作ろう
投票なのになぜ NFT?
今回は投票システムを作るはずですがなぜNFT
なのでしょうか?
それは候補者たちの情報、投票券の情報をどちらもNFTとして管理しようとしているからです。
具体的にいうと、候補者たちの情報はNFTとしてコントラクト内
に保存されることになります。投票権に関しては投票をする人たちがmintして一時的に彼らのものとなり
、投票を行うとコントラクトに回収
されることになります。
このような理由からこのセクションではNFTを作るための基礎の部分をコーディングをしていきます!
NFT のコアとはなにか
NFTを作るにあたって開発者に意識してほしい点があります。
それは、NFTはあくまで識別子(unique identifier)である点です。 NFTには、多くの要素(例えば画像)をつけることができ、ついそちらに目がいきがちになってしまうのですが、あくまでそれは、識別子に紐付けられたデータなのです。
ここを意識しながら、開発をすると、理解度がぜんぜん違うと思うので、ぜひそれを意識しながらこれからのsectionを見ていってください!
ファイルを作成しよう
コーディングに入る前に必要なファイルを作成していきましょう! ファイルを作成する方法は2 つあります。
(1)ファイルを作るディレクトリに移動してターミナルで下のコマンドをターミナルで実行する
touch FILE_NAME
(2)下のようにワークスペース上でファイルを作るディレクトリを右クリックしてファイル名を記入
個人的には(2)の方が楽なのでこちらの方法でやることが多いです。このどちらかの方法を用いてコントラクトのディレクトリ(ここではcontract
)に以下のようなファイル構造を作成してみましょう。
末尾が/
となっているものはディレクトリ、そうでないものはファイルであることを示しています。
contract/
├── Cargo.lock
├── Cargo.toml
├── src/
+ │ ├── vote.rs
+ │ ├── enumeration.rs
+ │ ├── internal.rs
│ ├── lib.rs
+ │ ├── metadata.rs
+ │ ├── mint.rs
+ │ └── nft_core.rs
└── target/
├── CACHEDIR.TAG
└── debug/
これでファイルの作成は完了です!
また、ここからはコントラクトの作成をメインに行うのでターミナルでcd
コマンドを使ってcontract
へ移動しておきましょう
NFT に関する情報を格納するためのコードを記述しよう
NFTを作るためのライブラリはありますが、今回はあえてライブラリを使わずに一から作っていきます。NFTに必要な要素として
-
情報(画像のURL、名前、説明etc)を格納できること
-
mint、transferができること
が挙げられます。
Lesson1では1. の情報の格納を実装していきます!
Cargo.toml ファイルの編集
序盤でも説明しましたが、Cargo.toml
ファイルではこのコントラクトの情報が記述されています。作成者、バージョン、使用するライブラリなどの情報です。
特に最後の使用するライブラリを記述していないとコンパイル時に使用できずエラーが出てしまうので書き漏れのないように下のように書き換えましょう。
[Cargo.toml]
[package]
name = "contract"
version = "0.1.0"
authors = ["YOUR_NAME", "YOUR_MAIL_ADDRESS"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
near-sdk = "4.0.0"
[lib]
crate-type = ["cdylib", "rlib"]
[profile.release]
codegen-units=1
opt-level = "z"
lto = true
debug = false
panic = "abort"
overflow-checks = true
※[dependencies]のnear-sdkは2022/7/23時点でのバージョンなので、動かないようなら作成時の最新バージョンを入れてみてください
では次はlib.rs
に移って、元々記述してあるコードを上書きして、使用するライブラリを下のように宣言してみましょう。
[lib.rs]
use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet};
use near_sdk::json_types::U128;
use near_sdk::serde::{Deserialize, Serialize};
use near_sdk::{env, near_bindgen, AccountId, Balance, CryptoHash, PanicOnDefault, Promise};
mod vote;
mod enumeration;
mod internal;
mod metadata;
mod mint;
mod nft_core;
pub use crate::enumeration::*;
use crate::internal::*;
pub use crate::metadata::*;
pub use crate::mint::*;
pub use crate::nft_core::*;
pub use vote::*;
それぞれのライブラリについては使用する際に細かく説明するのでここでは割愛しますが、大まかに何を記述しているのかを説明します。
最初の部分ではCargo.tomlファイルで追加したnear-sdkの中で今回使う部分を宣言しています。
use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet};
use near_sdk::json_types::U128;
use near_sdk::serde::{Deserialize, Serialize};
use near_sdk::{env, near_bindgen, AccountId, Balance, CryptoHash, PanicOnDefault, Promise};