TON仮想マシン(TVM)とは?完全ガイド(2026)
— By Tony Rabbit in Tutorials

TVMは、すべてのTONスマートコントラクトを実行するエンジンです。このガイドでは、スタックモデル、非同期メッセージパッシング、セルベースのデータレイアウト、ガスメーター、そしてTVMとEVMの比較について説明します。
TVM(TON仮想マシン)は、The Open Network上のすべてのスマートコントラクトを実行するエンジンです。これは、EVM、SVM、その他の主要な仮想マシンとは本質的に異なります。主にTONの設計哲学が非同期であるためです:コントラクトは同期的な関数呼び出しを行うのではなく、メッセージを渡します。TVMを理解することは、TON開発をブラックボックスとして扱うのと、ネットワークの並列性と上手く連携するコントラクトを書くことの違いです。
簡単な答え:TVMは、TONスマートコントラクトを実行するスタックベースの仮想マシンです。すべては小さなチャンク(最大1023ビット)として保存され、他のセルへの参照は最大4つまでです。実行は非同期であり、コントラクトはメッセージを受け取り、完了まで実行し、新しいメッセージを発信することがあります。コントラクト間の同期呼び出しはありません。ガスメーターはコントラクトごとにメッセージごとに行われ、未使用のガスは返金されます。
- スタックベース。操作はレジスタにアドレス指定するのではなく、スタックから値をプッシュおよびポップします。
- セルベースのデータ。ストレージは、最大4つの参照を持つ小さなチャンクであるセルを使用します。
- 非同期実行。コントラクトは、同期呼び出しではなくメッセージを通じて通信します。
- メッセージごとのガスメーター。各メッセージは独自のガス予算を持ちます。
- 言語はTVMバイトコードにコンパイルされます。FunC、Tact、その他すべてが同じ実行レイヤーをターゲットにしています。
TVMとは何か、そしてその存在理由
TVMは、スマートコントラクトコードを実際のオンチェーン操作に変換するランタイムです。ネットワーク上のすべてのノードはTVM仕様に合意しているため、1つのノードで実行されるコントラクトはどこでも同じように実行されます。この決定論が、ネットワークがコントラクトの結果に合意することを可能にします。
カスタムVMの理由
TONの設計者は、ネットワークのシャーディングされた非同期アーキテクチャに適合するカスタムVMを構築しました。EVMを借用することは、EVMの同期呼び出しモデルを受け入れることを意味し、これはTONの並列シャード実行と対立します。TVMは、各メッセージが他のシャードと調整することなく、いつでも任意のシャードで実行できる作業単位であるモデルをTONに提供します。
スタック内の位置
TVMの下にはネットワークのアカウント、ストレージ、コンセンサスがあります。TVMの上にはスマートコントラクト言語(FunC、Tact)があります。TVMは普遍的なインターフェースです:すべての言語はTVMバイトコードにコンパイルされ、すべてのノードがそのバイトコードを実行します。
セルとデータレイアウト
TVMの特徴的な設計選択の1つはセルです。コントラクトの状態からメッセージ本文、NFTメタデータまで、TONに保存されるすべてのものはセルのツリーとしてレイアウトされています。
セルとは何か
セルは最大1023ビットの生データと最大4つの他のセルへの参照を保持します。大きなオブジェクト(長い文字列、大きな配列、複雑なコントラクト状態)はセルのツリーとして表現されます。この構造は、Merkleツリーに似た精神を持っています。
セルが重要な理由
セルレイアウトは、コンテンツアドレッシング(各セルにはハッシュがあります)、効率的な差分処理(変更は影響を受けたセルのみを修正します)、およびストレージレンタル計算(セルの数と時間の両方が重要です)をサポートします。長期間存続するコントラクトは、保持しているセルの数に基づいて小さなレンタル料を支払います。
ストレージレンタル
Ethereumの永久ストレージとは異なり、TONはセルを生かしておくために小さな継続的な料金を請求します。この意図は、無限の膨張を抑制することです。アクティブなコントラクトはほとんど費用がかからず、放棄されたコントラクトは大きな状態を保持している場合はより多く支払い、最終的に残高がゼロになると凍結されます。
非同期実行
TVMはコントラクトAがコントラクトBを同期的に呼び出すことを許可しません。代わりに、コントラクトAはコントラクトBにメッセージを送信し、それは後のステップで処理されます。
1つのメッセージ、1つの実行
各オンチェーンの相互作用はメッセージによってトリガーされます。受信コントラクトはメッセージを読み取り、その状態を更新し、副作用として新しいメッセージを発信することがあります。それらの新しいメッセージは、後のネットワークラウンドで処理されます。
開発者への影響
同期的なEVMスタイルの呼び出しに慣れている開発者は、TONでは異なる考え方をしなければなりません。TONでの「トランザクション」はしばしばメッセージの連鎖です。失敗処理も異なります:バウンスバックするメッセージは送信者に資金を返しますが、送信者がメッセージをバウンス可能として設定している場合のみです。
並列性への影響
非同期モデルは、TONがシャードチェーンを並行して実行することを可能にします。2つのシャードは、調整することなく無関係なメッセージを処理できます。シャード間のメッセージでさえ、キューに入れられ、後のラウンドで解決されます。
TONのガスメーター
すべてのTVM操作にはガスコストがあります。コストシステムはEthereumのガスに似ていますが、いくつかの重要な違いがあります。
メッセージごとのガス
各受信メッセージは独自のガス許可を持ちます。メッセージが処理されると、実行された操作によってガスが消費されます。未使用のガスは、未使用のTON残高と共に送信者に返金されます。
ストレージレンタルと計算ガス
TONはストレージレンタル(長期セルストレージ)と計算ガス(TVMによって行われる作業)を別々に請求します。どちらもTONで支払われます。ほとんどのユーザー向けコントラクトでは、計算ガスがより大きなコストです。
料金が低く保たれる理由
料金は、需要が急増したときにネットワークがシャーディングを通じてスケールできるため、低く保たれます。ほとんどのコントラクト実行は安価で予測可能であり、過大評価された場合は返金されます。
TVMとEVM
2つのエンジンは異なるメカニクスで同じ問題を解決します。
| プロパティ | TVM | EVM |
|---|---|---|
| アーキテクチャ | スタックベース | スタックベース |
| データレイアウト | セル(1023ビット + 4参照) | ワードアドレスストレージ |
| 実行モデル | 非同期メッセージ | 同期呼び出し |
| ガス返金 | はい、未使用は返金されます | はい、一部返金 |
| ストレージコスト | ストレージレンタル | 永久ストレージコスト前払い |
| 言語 | FunC、Tact | Solidity、Vyper、Yul |
開発者にとっての意味
TON上での構築は、EthereumやSolana上での構築とは異なるメンタルモデルを必要とします。
関数呼び出しではなくメッセージで考える
コントラクトA内で「コントラクトBの結果」を求めたくなる場合、通常はモデルと戦っています。フローを再構成して、コントラクトAがBにメッセージを送信し、コールバックを期待するか、待たずに自身の状態変更を完了するようにします。
状態を保存する際はセルで考える
大きなフラット配列はTONでは扱いにくいです。ツリー状のデータ構造はセルレイアウトとより良く連携します。無限に成長する状態は、複数のセルまたはサブコントラクトに分割する必要があります。
よりフレンドリーな構文のためにTactを使用する
FunCはアセンブリに近いです。Tactは、TVMバイトコードにコンパイルされ、読みやすい高レベルの構文を提供します。ほとんどの新しいTONプロジェクトは、細かい制御が必要でない限りTactを使用します。
実践的な学習パス
- Tactチュートリアルから始める。高レベルの構文は、最初にメッセージモデルを把握するのに役立ちます。
- Jetton実装を読む。マスターおよびウォレットコントラクトは、非同期モデルを明確に示しています。
- テストネットで小さなコントラクトを構築する。メッセージを送信し、それらがどのように伝播するかを観察します。
- ガスを最適化する必要があるときはFunCにダウンする。
- 開発中にスタックとメッセージを検査するためにTVM実行トレースツールを使用する。
よくある質問
TVMはEVMと互換性がありますか?
いいえ。実行モデル、データレイアウト、ガスシステムは異なります。いくつかの実験的なEVM互換レイヤーは存在しますが、デフォルトの開発パスではありません。
SolidityでTONコントラクトを書くことはできますか?
ネイティブTON開発はFunCまたはTactを使用します。Solidityに似た構文を許可するアダプタもありますが、ほとんどのプロダクションコードはTONのネイティブ言語を使用します。
なぜTVMはスタックベースなのですか?
スタックベースのVMは、レジスタベースのVMよりも指定および検証が簡単であり、決定論的なガスモデルを設計するのが容易です。EVMも同じ理由でスタックベースです。
TONのセルとは何ですか?
TONの基本的なデータ単位です。セルは最大1023ビットと最大4つの他のセルへの参照を保持します。TONに保存されるすべてのものは、セルのツリーとしてレイアウトされています。
TONにデータを保存するためにレンタル料を支払いますか?
はい。ストレージレンタルは、セルの数と時間に比例した小さな継続的な料金です。アクティブなコントラクトはほとんど気にしませんが、放棄されたコントラクトはゼロにまで減少し、凍結されることがあります。
最終的な要点:TVMはTONの設計で最も特徴的な部分です。セルレイアウト、非同期メッセージモデル、およびメッセージごとのガスシステムを理解すれば、ネットワークの他の特異性(シャーディング、低料金、迅速な最終性)が自然な結果として理解できるようになります。モデルに従って構築し、逆らわないでください。
免責事項:このガイドは教育目的のみであり、投資、金融、法的、または取引のアドバイスを構成するものではありません。