ts-sdk-address について
ts-sdk-addressは、@aptos-labs/ts-sdkでアカウントアドレスを扱う開発者向けスキルです。AIP-40形式の解析・出力、検証、比較、SDKによるアドレス導出を説明します。
主な機能
- 01柔軟形式・厳格形式のアドレス解析
- 02AIP-40形式でのアドレス出力
- 03アドレスの検証と比較
- 04オブジェクト・リソース・トークンアドレスの導出
- 05AccountAddress定数とバイト入力の利用
活用シーン
- 01SDKアプリでのアドレス解析
- 02厳格なAIP-40形式の適用
- 03Aptosのオブジェクトやリソースアドレスの導出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aptos-labs/ aptos-agent-skills --skill ts-sdk-addressインストール後、Claude Code で/ts-sdk-addressを入力して読み込まれたか確認します。
詳細
TypeScript SDK:AccountAddress
目的
@aptos-labs/ts-sdk でアカウントアドレスを正しく作成、解析、フォーマットするためのガイドです。アドレスは32バイトの値であり、文字列形式は AIP-40 に従います。
必ず行うこと
- 柔軟な入力には
AccountAddress.from()を使用する – 文字列(0xの有無を問わない)、Uint8Array、既存のAccountAddressを受け付けます。 - API ではアドレスを
AccountAddressまたは文字列として使用する – SDK のほとんどの API はAccountAddressInput(文字列またはAccountAddress)を受け付けます。 - AIP-40 の厳密な形式が必要な場合は
AccountAddress.fromStringStrict()/AccountAddress.fromStrict()を使用する:LONG(0x と 64 桁の16進数)または、特殊アドレスに限る SHORT(0x0~0xf)です。 - オブジェクト/リソース/トークンのアドレスには SDK の派生アドレスヘルパーを使用する – ハッシュを独自に実装しないでください。
絶対に行わないこと
- 比較に生の文字列を使わない –
addr.equals(other)を使うか、AccountAddress.from()で正規化します。 - 特殊アドレス以外に SHORT 形式を使わない – 厳密モードでは、特殊アドレス以外は LONG(64 桁の16進数)でなければなりません。
- アカウントアドレスに
Hexクラスを使わない – (SDK のドキュメントに従い)AccountAddressのみを使用します。
アドレス形式(AIP-40)
- 長さ: 32バイト(LONG 形式では64桁の16進数)。
- 文字列:
0xで始まる必要があります。LONG =0x+ 64 桁の16進数、SHORT = 最短形式(例:0x1、0xf)。 - 特殊アドレス:
0x0~0xf(最後のバイトが < 16 で、残りはゼロ)。SHORT 形式(0x1、0xa)で記述できます。 - 参照: AIP-40。
AccountAddress の作成
文字列から作成(推奨:緩やかな形式)
import { AccountAddress } from "@aptos-labs/ts-sdk";
// Relaxed: accepts with or without 0x, SHORT or LONG
const addr1 = AccountAddress.from("0x1");
const addr2 = AccountAddress.from("0xaa86fe99004361f747f91342ca13c426ca0cccb0c1217677180c9493bad6ef0c");
const addr3 = AccountAddress.from("1"); // no 0x ok
文字列から作成(厳密な AIP-40 形式)
// Strict: LONG (0x + 64 chars) or SHORT only for special (0x0–0xf)
const addrStrict = AccountAddress.fromStringStrict(
"0x0000000000000000000000000000000000000000000000000000000000000001"
);
// Or use fromStrict for any AccountAddressInput
const a = AccountAddress.fromStrict("0x1"); // ok: special address in SHORT form
バイト列から作成
const bytes = new Uint8Array(32);
bytes[31] = 1;
const addr = new AccountAddress(bytes);
// or
const addrFrom = AccountAddress.from(bytes);
組み込み定数
AccountAddress.ZERO; // 0x0
AccountAddress.ONE; // 0x1
AccountAddress.TWO; // 0x2
AccountAddress.THREE; // 0x3
AccountAddress.FOUR; // 0x4
AccountAddress.A; // 0xa
文字列出力
| メソッド | 用途 |
|---|---|
addr.toString() | AIP-40 のデフォルト:特殊アドレスには SHORT、それ以外には LONG |
addr.toStringLong() | 常に 0x + 64 桁の16進数 |
addr.toStringShort() | 最短形式(先頭のゼロなし) |
addr.toStringLongWithoutPrefix() | 64 桁の16進数、0x なし |
const addr = AccountAddress.from("0x1");
addr.toString(); // "0x1"
addr.toStringLong(); // "0x0000...0001" (64 chars after 0x)
検証
const result = AccountAddress.isValid({
input: "0x1",
strict: false
});
if (result.valid) {
// use address
} else {
console.log(result.invalidReason, result.invalidReasonMessage);
}
派生アドレス(オブジェクト/リソース/トークン/ユーザー派生)
@aptos-labs/ts-sdk からインポートします(core 経由):
import {
AccountAddress,
createObjectAddress,
createResourceAddress,
createTokenAddress,
createUserDerivedObjectAddress
} from "@aptos-labs/ts-sdk";
オブジェクトアドレス(例:名前付きオブジェクト)
const creator = AccountAddress.from("0x120e79e45d21ef439963580c77a023e2729db799e96e61f878fac98fde5b9cc9");
const seed = "migration::migration_contract"; // or Uint8Array
const objectAddr = createObjectAddress(creator, seed);
// objectAddr.toString() => deterministic 0x... address
リソースアカウントアドレス
const creator = AccountAddress.from("0x41e724e1d4fce6472ffcb5c9886770893eb49489e3f531d0aa97bf951e66d70c");
const seed = "create_resource::create_resource";
const resourceAddr = createResourceAddress(creator, seed);
トークン(NFT)オブジェクトアドレス
const creator = AccountAddress.from("0x9d518b9b84f327eafc5f6632200ea224a818a935ffd6be5d78ada250bbc44a6");
const collectionName = "SuperV Villains";
const tokenName = "Nami #5962";
const tokenAddr = createTokenAddress(creator, collectionName, tokenName);
// Internally: seed = `${collectionName}::${tokenName}` -> createObjectAddress(creator, seed)
ユーザー派生オブジェクトアドレス
const sourceAddress = AccountAddress.from("0x653a60dab27fe8f3859414973d218e1b7551c778a8650a7055a85c0f8041b2a4");
const deriveFromAddress = AccountAddress.from("0xa");
const userDerivedAddr = createUserDerivedObjectAddress(sourceAddress, deriveFromAddress);
等価性とシリアライズ
const a = AccountAddress.from("0x1");
const b = AccountAddress.from("0x0000000000000000000000000000000000000000000000000000000000000001");
a.equals(b); // true
// BCS: use serializer or SDK entry/script helpers in transaction building
よくある間違い
| 間違い | 正しい方法 |
|---|---|
アカウントアドレスに Hex を使用する | AccountAddress のみを使用する |
文字列を === で比較する | addr1.equals(addr2) を使用するか、AccountAddress.from() の後に比較する |
| 厳密モードで特殊アドレス以外に SHORT を使用する | LONG(0x + 64 桁の16進数)または AccountAddress.from()(緩やかな形式)を使用する |
| オブジェクトアドレスのハッシュを独自に実装する | createObjectAddress / createTokenAddress / createResourceAddress / createUserDerivedObjectAddress を使用する |
参考資料
- SDK:
src/core/accountAddress.ts、src/core/account/utils/address.ts - AIP-40:https://github.com/aptos-foundation/AIPs/blob/main/aips/aip-40.md
- パターン:TYPESCRIPT_SDK.md
コメント
Markdown 対応