メインコンテンツまでスキップ

コイン入門

このチュートリアルでは、MoonCoinという名前の自作のコインをコンパイル、デプロイ、ミントする方法を紹介します。

ステップ 1 : SDK を選ぶ

以下のリストからお好みの SDK をインストールします。


ステップ 2 : CLIをインストールする

Aptos CLI 用のプリコンパイルされたバイナリをインストールします.


ステップ 3 : サンプルを実行する

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.

ステップ 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 の例では、aptos move build-publish-payloadコマンドを使用してモジュールをコンパイルおよびビルドします。このコマンドは、package-metadata.bcsmoon_coin.mvモジュールのバイトコードを含むbuildフォルダーを構築します。このコマンドはまた、パブリケーション トランザクション ペイロードを構築し、それを JSON 出力ファイルに保存します。後でこのファイルを読み取って metadataBytesbyteCodeを取得し、以下の手順でチェーンへコントラクトを公開することができます。

パッケージをコンパイル。

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 });

ステップ 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へのコインの入金と引き出し。
ヒント

新しいコインを作成するエンティティは、ミンティング、バーン、凍結の機能を獲得します。


ステップ 4.3.1 : コインの初期化

コイン タイプが Aptos ブロックチェーンに公開されると、そのコインタイプを公開したエンティティは初期化できます。

public fun initialize<CoinType>(
account: &signer,
name: string::String,
symbol: string::String,
decimals: u8,
monitor_supply: bool,
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
let account_addr = signer::address_of(account);

assert!(
coin_address<CoinType>() == account_addr,
error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH),
);

assert!(
!exists<CoinInfo<CoinType>>(account_addr),
error::already_exists(ECOIN_INFO_ALREADY_PUBLISHED),
);

let coin_info = CoinInfo<CoinType> {
name,
symbol,
decimals,
supply: if (monitor_supply) { option::some(optional_aggregator::new(MAX_U128, false)) } else { option::none() },
};
move_to(account, coin_info);

(BurnCapability<CoinType>{ }, FreezeCapability<CoinType>{ }, MintCapability<CoinType>{ })
}

これにより、このコイン タイプが以前に初期化されていないことが保証されます。注意:10 行目と 15 行目をチェックして、呼び出し元が行ったinitializeが、このモジュールを実際に公開したものと同じであること、およびそのアカウントにCoinInfoが何も保存されていないことを確認します。これらの両方の条件がチェックされると、 CoinInfoが保存され、呼び出し元はバーン、凍結、ミントの機能を取得します。

ヒント

MoonCoinはパッケージの公開とほぼ同時にこのinitialize関数を自動的に呼び出します。


ステップ 4.3.2 : コイン登録する

コインを使用するには、エンティティはCoinStoreをアカウントへ登録する必要があります。

public entry fun registerCoinType(account: &signer) {

MoonCoin は、エントリー関数ラッパー managed_coin::registerを提供するManagedCoinを使用します。登録用のスクリプトの例を次に示します。

script {
fun register(account: &signer) {
aptos_framework::managed_coin::register<MoonCoin::moon_coin::MoonCoin>(account)
}
}

ステップ 4.3.3 : コインをミントする

コインのミントには、初期化中に生成されたミント機能が必要です。関数mintmint(以下を参照) はその機能と金額を受け取り、コインの金額を含むCoin<T>構造体を返します。コイントラックが供給されると更新されます。

public fun mint<CoinType>(
amount: u64,
_cap: &MintCapability<CoinType>,
): Coin<CoinType> acquires CoinInfo {
if (amount == 0) {
return zero<CoinType>()
};

let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(coin_address<CoinType>()).supply;
if (option::is_some(maybe_supply)) {
let supply = option::borrow_mut(maybe_supply);
optional_aggregator::add(supply, (amount as u128));
};

Coin<CoinType> { value: amount }
}

ManagedCoinmanaged_coin::mint入力機能を提供することでミントを簡単にします。


ステップ 4.3.4 : コインを送金する

Aptos は、コイン送金をサポートするためのいくつかの構成要素を提供します。

  • coin::deposit<CoinType>: すでにcoin::register<CoinType>が呼び出されたアカウントへ、コインを入金することをあらゆるエンティティに許可します。
  • coin::withdraw<CoinType>: あらゆるエンティティが彼らのアカウントからコイン金額を引き出せるようにします。
  • aptos_account::transfer_coins<CoinType>: 特定の CoinType のコインを受信者に送金します。
重要

単一の送金イベントではなく、出金イベント・入金イベント=2つ別々のイベントがあります。

サポート資料