tolk について
TolkでのTONスマートコントラクトの実装とレビューを支援するスキルです。コントラクト開発者向けに、メッセージとストレージの構造を明示し、型付き構文を優先して、TONドキュメントに基づく標準確認とテストを促します。
主な機能
- 01コントラクトのインターフェースとメッセージの整理
- 02型付き構造によるストレージ設計
- 03メッセージ解析とディスパッチの構成
- 04送信、Bounce、手数料の動作指定
- 05TONドキュメントに基づく標準確認
- 06プロジェクトのツールでテスト実行
活用シーン
- 01TON標準に準拠するコントラクトの実装
- 02メッセージ処理と状態保存の開発
- 03シリアライズと低レベルのCell操作のレビュー
- 04変更時のテストと完了条件の策定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ton-blockchain/ skills --skill tolkインストール後、Claude Code で/tolkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/development-checklist.mdidiomatic-patterns.md詳細
Tolk
型付けされ、監査可能で、TON のメッセージおよびストレージの規約に準拠した、本番品質の Tolk コントラクトを構築するには、このスキルを使用してください。
運用ルール
- 現在のリポジトリで採用されているフレームワークとコマンドを優先してください。新しいツールを導入する前に、プロジェクトの構成を確認してください。
- バイナリレイアウトを明示してください。フィールドの順序、整数の固定ビット幅、参照、オプションフィールド、メッセージのオペコード、getter の戻り値の形式、送信モード、バウンス時の動作を明確にします。
- 手動での slice/builder 操作より、Tolk の型システムを優先してください。struct、型付きセル、カスタムシリアライザー、union のディスパッチ、遅延読み込み、型付きマップ、
createMessageを活用します。 - 低レベルのセル/dict 操作は、境界が明確な箇所に限定してください。すぐに型付きエイリアス、struct、マップ、またはヘルパーメソッドでラップします。
- 公式 TON Docs を信頼できる情報源として扱ってください。
https://docs.ton.org/llms.txtから始め、https://docs.ton.org/tolk/、TON の基礎、コントラクト開発、標準に関する関連ページのみを読み込みます。 - 作業を終える前に、実装した内容、作業の指針としたドキュメントまたは標準、正確なビルド/テスト結果、あるいは阻害要因を報告してください。
ワークフロー
-
コントラクトの対象範囲を特定します。
- 標準、受信メッセージ、送信メッセージ、getter、ストレージフィールド、管理者ロール、手数料の前提、デプロイ時の動作を列挙します。
- TON 標準を実装する場合は、オペコードや getter 名を決める前に、該当する標準のドキュメントを確認します。
-
振る舞いより先にスキーマを設計します。
- 永続データは
storage.tolkに配置します。 - メッセージ本文、オペコード付き struct、union 型、共有ペイロード型は
messages.tolkに配置します。 - エラー定数または enum は
errors.tolkに配置します。 - エントリーポイントのファイルには、検証、状態遷移、送信、getter に関する処理のみを記述します。
- 永続データは
-
型付きエントリーポイントを実装します。
- バウンスされていない内部メッセージには、
fun onInternalMessage(in: InMessage)を使用します。 - 既知のメッセージを
lazy AllowedMessage.fromSlice(in.body)として解析し、matchでディスパッチします。 - 不明なメッセージに対するポリシーを明示的に選択します。一般的な選択肢は「空のトップアップは無視し、それ以外は
0xFFFFをスローする」です。 - 送信メッセージがバウンスする可能性があり、状態の復元が必要な場合は、
fun onBouncedMessage(in: InMessageBounced)を使用します。 - 外部フローに限り
fun onExternalMessage(inMsg: slice)を使用し、検証後にのみガスを受け入れます。
- バウンスされていない内部メッセージには、
-
ストレージと送信アクションを実装します。
contract.getData()とcontract.setData(...)を囲むヘルパーとして、Storage.load()とStorage.save()を使用します。- getter と読み取りパスでは、
lazy Storage.load()を使用します。 createMessage({ ... })で送信メッセージを組み立て、.send(SEND_MODE_...)で送信します。- コントラクトが別のコントラクトをデプロイする場合は、
StateInitまたはAutoDeployAddressの構築をヘルパーメソッドに切り出します。
-
対象を絞ったテストで検証します。
- デプロイ、受理されるメッセージ、拒否されるメッセージ、getter の値、送信メッセージ、バウンス、手数料の影響を受ける経路、リプレイ防止、マップの反復、大きなペイロードを網羅します。
- リポジトリで既に使用されているテストフレームワークを使用します。複数のフレームワークがある場合は、近接するコントラクトで使われているものを優先します。
必須パターン
- オペコードを含むメッセージ本文には、
struct (0x...) MessageName { ... }を使用します。 - 既知の受信メッセージ群には
type AllowedMessage = A | B | Cとmatchを使用します。 - 型付き参照には
Cell<T>を使用し、セルの内容を意図的に不透明にする場合に限りcellを使用します。 - 真の残余ペイロードには
RemainingBitsAndRefsを使用します。 - シリアライズする struct 内では、固定幅のシリアライズ可能な数値型(
uint32、uint64、int32、coinsなど)を使用します。 map<K, V>とMapLookupResult.isFoundを使用します。マップの検索結果を nullable な値として扱わないでください。- 複数値を返す応答には getter 応答用の struct を使用します。標準で getter 名が定められている場合は、その名前を維持します。
- グローバル名の衝突を避け、データの形に振る舞いを近づけるには、メソッド(
fun Type.method(self))を使用します。 - 計測された制約によって必要とされない限り、アセンブラー関数やマイクロ最適化は避けてください。
参考資料
- コントラクトコードを実装またはレビューする際は、
references/idiomatic-patterns.mdを開いてください。 - コントラクトの変更を確定する前、またはビルド/テストコマンドを選択する前に、
references/development-checklist.mdを開いてください。
参照する主なドキュメント:
https://docs.ton.org/tolk/overviewhttps://docs.ton.org/tolk/idioms-conventionshttps://docs.ton.org/tolk/features/message-handlinghttps://docs.ton.org/tolk/features/auto-serializationhttps://docs.ton.org/tolk/features/message-sendinghttps://docs.ton.org/tolk/features/contract-storagehttps://docs.ton.org/tolk/features/contract-gettershttps://docs.ton.org/tolk/types/mapshttps://docs.ton.org/tolk/examples
完了条件
次の条件が満たされているか、明示的にブロックされていると報告するまでは、タスクを完了としないでください。
- ストレージ、メッセージ、ゲッター、送信アクションが、可能な限り型付きの Tolk 構文でモデル化されています。
- 低レベルのシリアライズ、raw cell、手動参照、手動辞書の使用箇所が限定され、その理由が説明されています。
- 未知のメッセージ、バウンス、手数料、デプロイの動作が明示されています。
- 標準オペコード/ゲッター/戻り値の形式が、該当する場合に関連する TON 標準ドキュメントと照合されています。
- プロジェクトのツールを使用してビルド/テストが実行されているか、実行を妨げている正確な要因が報告されています。
コメント
Markdown 対応