コイン入門
このチュートリアルでは、MoonCoinという名前の自作のコインをコンパイル、デプロイ、ミントする方法を紹介します。
ステップ 1 : SDK を選ぶ
以下のリストからお好みの SDK をインストールします。
ステップ 2 : CLIをインストールする
Aptos CLI 用のプリコンパイルされたバイナリをインストールします.
ステップ 3 : サンプルを実行する
- Typescript
- Python
aptos-ts-sdk
リポジトリのクローンを作成します。
git clone https://github.com/aptos-labs/aptos-ts-sdk.git
cd aptos-ts-sdk
pnpm install
pnpm build
TypeScript SDK ディレクトリに移動します。
cd examples/typescript/
依存関係をインストールします。
pnpm install
TypeScript のyour_coin
サンプルを実行します。
pnpm run your_coin
アプリケーションが完了し、次のように出力されます。
Bob's initial MoonCoin balance: 0.
Alice mints herself 100 MoonCoin.
Alice transfers 100 MoonCoin to Bob.
Bob's updated MoonCoin balance: 100.
aptos-core
リポジトリのクローンを作成します。
git clone https://github.com/aptos-labs/aptos-core
Python SDK ディレクトリに移動します。
cd aptos-core/ecosystem/python/sdk
依存関係をインストールします。
curl -sSL https://install.python-poetry.org | python3
poetry install
Python のyour_coin
サンプルを実行します。
poetry run python -m examples.your_coin ~/aptos-core/aptos-move/move-examples/moon_coin
ステップ 3.1 : パッケージを構築する
サンプルの実行は次の出力で一時停止します。
=== Addresses ===
Alice: 0x5e603a89cf690d7134cf2f24fdb16ba90c4f5686333721c12e835fb6c76bc7ba
Bob: 0xc8421fa4a99153f955e50f1de2a6acff2f3fd0bb33aa17ba1f5b32b699f6c825
Update the package with Alice's address, compile, and press enter.
別のターミナルを開き、MoonCoin パッケージのディレクトリに移動します。
cd ~/aptos-core/aptos-move/move-examples/moon_coin
CLI を使用してパッケージを構築します。
aptos move compile --named-addresses MoonCoin=0x5e603a89cf690d7134cf2f24fdb16ba90c4f5686333721c12e835fb6c76bc7ba --save-metadata
--named-addresses
は、パッケージをコンパイルしてアリスのアカウントに保存するために変換する必要があるアドレス マッピングのリストです。上記へ出力されたアリスのアドレスへMoonCoin
がどの様 に設定されているか注目してください。--save-metadata
も、パッケージを公開するために必要です。
ステップ 3.2 : サンプルの完了
前のプロンプトに戻り、パッケージを公開する準備ができたので Enter キーを押します。
アプリケーションが完了し、次のように出力されます。
The application will complete, printing:
Publishing MoonCoin package.
Bob registers the newly created coin so he can receive it from Alice.
Bob's initial MoonCoin balance: 0.
Alice mints Bob some of the new coin.
Bob's updated MoonCoin balance: 100.
ステップ 4 : MoonCoin の詳細
ステップ 4.1 : MoonCoinパッケージの構築と公開
事実上、Move コントラクトは Move モジュールのセットであり、パッケージとして知られています。新しいパッケージをデプロイまたはアップグレードする時は、--save-metadata
でコンパイラを呼び出してパッケージを公開する必要があります。MoonCoin の場合、次の出力ファイルが重要です。
build/Examples/package-metadata.bcs
: パッケージに関連付けられたメタデータが含まれます。build/Examples/bytecode_modules/moon_coin.mv
:moon_coin.move
モジュールのバイトコードが含まれます。
これらはサンプルによって読み取られ、Aptos ブロックチェーンに公開されます。
- Typescript
- Python
- Rust
TypeScript の例では、aptos move build-publish-payload
コマンドを使用してモジュールをコンパイルおよびビルドします。このコマンドは、package-metadata.bcs
とmoon_coin.mv
モジュールのバイトコードを含むbuild
フォルダーを構築します。このコマンドはまた、パブリケーション トランザクション ペイロードを構築し、それを JSON 出力ファイルに保存します。後でこのファイルを読み取って
metadataBytes
とbyteCode
を取得し、以下の手順でチェーンへコントラクトを公開することができます。
パッケージをコンパイル。
export function compilePackage(
packageDir: string,
outputFile: string,
namedAddresses: Array<{ name: string; address: AccountAddress }>,
) {
const addressArg = namedAddresses
.map(({ name, address }) => `${name}=${address}`)
.join(" ");
// Assume-yes automatically overwrites the previous compiled version, only do this if you are sure you want to overwrite the previous version.
const compileCommand = `aptos move build-publish-payload --json-output-file ${outputFile} --package-dir ${packageDir} --named-addresses ${addressArg} --assume-yes`;
execSync(compileCommand);
}
compilePackage("move/moonCoin", "move/moonCoin/moonCoin.json", [
{ name: "MoonCoin", address: alice.accountAddress },
]);
パッケージをチェーンに公開。
export function getPackageBytesToPublish(filePath: string) {
// current working directory - the root folder of this repo
const cwd = process.cwd();
// target directory - current working directory + filePath (filePath JSON file is generated with the previous, compilePackage, CLI command)
const modulePath = path.join(cwd, filePath);
const jsonData = JSON.parse(fs.readFileSync(modulePath, "utf8"));
const metadataBytes = jsonData.args[0].value;
const byteCode = jsonData.args[1].value;
return { metadataBytes, byteCode };
}
const { metadataBytes, byteCode } = getPackageBytesToPublish(
"move/moonCoin/moonCoin.json",
);
// Publish MoonCoin package to chain
const transaction = await aptos.publishPackageTransaction({
account: alice.accountAddress,
metadataBytes,
moduleBytecode: byteCode,
});
const pendingTransaction = await aptos.signAndSubmitTransaction({
signer: alice,
transaction,
});
await aptos.waitForTransaction({ transactionHash: pendingTransaction.hash });
module_path = os.path.join(
moon_coin_path, "build", "Examples", "bytecode_modules", "moon_coin.mv"
)
with open(module_path, "rb") as f:
module = f.read()
metadata_path = os.path.join(
moon_coin_path, "build", "Examples", "package-metadata.bcs"
)
with open(metadata_path, "rb") as f:
metadata = f.read()
print("\nPublishing MoonCoin package.")
package_publisher = PackagePublisher(rest_client)
txn_hash = await package_publisher.publish_package(alice, metadata, [module])
await rest_client.wait_for_transaction(txn_hash)
Coming soon.
ステップ 4.2 : MoonCoinモジュールとは
MoonCoinモジュールは、MoonCoin
構造体、もしくはコインタイプの個別のタイプを定義します。さらに、 init_module
という関数が含まれています。このinit_module
関数は、モジュールが公開されるときに呼び出されます。この場合、MoonCoin はMoonCoin
コイン タイプを ManagedCoin
として初期化し、これはアカウントの所有者によって維持されます。
ManagedCoin
はユーザーがコインを直接管理するためのシンプルなコイン管理フレームワークです。mint
及びburn
の便利なラッパーを提供します。
module MoonCoin::moon_coin {
struct MoonCoin {}
fun init_module(sender: &signer) {
aptos_framework::managed_coin::initialize<MoonCoin>(
sender,
b"Moon Coin",
b"MOON",
6,
false,
);
}
}
ステップ 4.3:コインを理解する
コインにはいくつかのプリミティブがあります。
- Minting: 新しいコインを作成すること。
- Burning: コインを削除します。
- Freezing: アカウントがコインを
CoinStore
へ保存できないようにします。 - Registering: コインを保管するための
CoinStore
リソースをアカウントに作成します。 - Transferring:
CoinStore
へのコインの入金と引き出し。
新しいコインを作成するエンティティは、ミンティング、バーン、凍結の機能を獲得します。