IOTA 学习笔记(十二):IOTA EVM 与 MoveVM 怎么理解?
前几期我们已经陆续学习了 IOTA 的对象模型、Move 基础、CLI、Localnet、Counter 合约、PTB 和共享对象。到这里其实我们已经站在了 IOTA 原生开发的入口上对象模型负责组织链上状态Move 负责定义对象和操作逻辑PTB 负责把多个操作组合成一笔交易。但是学习 IOTA 时还会遇到另一个重要概念IOTA EVM。这就容易让初学者产生疑问IOTA 不是已经有 MoveVM 了吗为什么还需要 EVMMoveVM 和 IOTA EVM 是什么关系开发者应该学 Solidity还是学 Move这一期就专门梳理 IOTA EVM 与 MoveVM 的关系。1. 先说结论它们不是同一个东西IOTA EVM 和 MoveVM 不是同一个东西。可以先用一句话区分MoveVM 更偏 IOTA 当前原生 Layer 1 开发IOTA EVM 更偏 EVM/Solidity 生态兼容。也就是说MoveVM 和 IOTA EVM 解决的问题不完全一样。MoveVM 面向的是 IOTA 原生对象模型。开发者使用 Move 语言定义对象、创建对象、修改对象、转移对象并通过 IOTA 原生交易系统执行这些逻辑。IOTA EVM 面向的是以太坊生态兼容。开发者可以使用 Solidity、Remix、Hardhat、MetaMask 等熟悉的 EVM 工具和合约标准将已有 EVM 生态经验迁移到 IOTA。可以简单理解为MoveVM IOTA 原生开发路径 对象模型 Move 语言 L1 智能合约能力 IOTA EVM EVM 兼容开发路径 账户模型 Solidity 语言 L2 智能合约能力所以它们不是简单的替代关系而是面向不同开发需求的两套路径。2. MoveVM 是什么MoveVM 是执行 Move 合约的虚拟机。在 IOTA 中MoveVM 与对象模型结合得非常紧密。开发者用 Move 语言编写 package定义 struct、function、ability 和对象操作逻辑。发布到链上后package 成为链上的 Package 对象用户可以通过交易调用其中的函数。可以把 MoveVM 理解为MoveVM 执行 IOTA Move 合约的运行环境它负责根据 Move 代码执行链上逻辑并产生对象状态变化。例如我们前面写过的 Counter 合约public struct Counter has key { id: UID, value: u64, } public entry fun increment(counter: mut Counter) { counter.value counter.value 1; }当用户调用increment时MoveVM 会执行这个函数并把 Counter 对象的 value 加 1。所以MoveVM 的核心不是“运行任意代码”而是按照 Move 的类型系统、资源约束和对象规则安全地执行链上状态变更。可以用一句话概括MoveVM 是 IOTA 原生对象模型的执行引擎。3. IOTA EVM 是什么IOTA EVM 是面向 EVM 生态的智能合约环境。EVM 是 Ethereum Virtual Machine也就是以太坊虚拟机。以太坊生态中大量智能合约、工具、钱包和开发框架都围绕 EVM 展开。Solidity、ERC-20、ERC-721、Remix、Hardhat、Foundry、MetaMask 等都是 EVM 生态中非常常见的工具或标准。IOTA EVM 的意义在于让开发者能够用 EVM 生态熟悉的方式在 IOTA 上构建应用。如果一个开发者已经会 Solidity并且有一个现成的 ERC-20、ERC-721 或 DeFi 合约那么他不一定要马上重写成 Move。通过 IOTA EVM他可以更容易把已有 EVM 合约和工具迁移过来。可以这样理解IOTA EVM IOTA 面向 Solidity / EVM 生态提供的兼容执行环境它的价值主要在于生态兼容而不是替代 MoveVM。4. 为什么 IOTA 需要两套体系IOTA 同时支持 MoveVM 和 EVM背后其实是两个目标。第一个目标是原生创新。IOTA 通过 MoveVM 和对象模型提供一套新的原生开发方式。它更强调对象、资产、权限、资源安全和链上状态管理。第二个目标是生态兼容。EVM 是当前区块链世界中最成熟、使用最广泛的智能合约生态之一。如果 IOTA 完全不兼容 EVM那么很多现有 Solidity 开发者、工具和应用迁移过来会比较困难。所以IOTA 需要同时考虑如何发挥自身原生架构优势 如何吸引已有 EVM 开发者和应用MoveVM 回答第一个问题。IOTA EVM 回答第二个问题。可以这样总结MoveVM 面向 IOTA 的原生能力IOTA EVM 面向外部生态的兼容能力。这也是很多公链都会面对的问题一方面要有自己的技术特色另一方面也要尽可能降低开发者迁移成本。5. MoveVM 和 EVM 的编程模型差异MoveVM 和 EVM 最大的差异之一是编程模型不同。EVM 主要采用账户模型。合约有合约地址状态变量存储在合约地址下。用户调用合约函数函数修改合约内部状态。可以简单理解为EVM / Solidity 合约地址 └── 合约存储 ├── 状态变量 A ├── 状态变量 B └── mappingMoveVM 更强调对象模型。Package 定义逻辑对象保存状态。函数通过参数接收对象并根据对象所有权和类型规则操作对象。可以简单理解为MoveVM / Move Package 定义逻辑 Object 保存状态 Function 操作对象两者思维方式不太一样。在 Solidity 中开发者经常问这个合约有哪些状态变量 这个函数会修改哪些 storage msg.sender 是谁 mapping 里保存了什么在 Move 中开发者更应该问这个 package 定义了哪些对象 这个函数接收哪些对象 对象是 owned 还是 shared 对象是否被可变引用 对象执行后转移给了谁所以学习 MoveVM 不能完全照搬 Solidity 的思维方式。Move 更强调对象、所有权、资源安全和状态转移。6. 账户模型和对象模型的区别EVM 账户模型更像“账户或合约拥有一片状态存储”。例如一个 ERC-20 合约通常会有一个 balances 映射mapping(address uint256) balances;每个用户的余额保存在合约内部。用户转账时合约修改两个地址对应的余额。而在对象模型中资产可以被表示为对象。一个用户可能拥有多个 Coin 对象每个对象都有自己的 ID、版本和所有者。可以简单对比EVM 账户模型 用户余额存放在合约 storage 中 Move 对象模型 用户拥有一个或多个 Coin Object这两种模型没有绝对优劣而是抽象方式不同。账户模型对很多开发者来说更熟悉尤其适合迁移已有 Solidity 应用。对象模型则更适合表达独立资产、对象所有权、权限凭证、可组合对象和资源安全。7. Solidity 和 Move 的语言差异Solidity 和 Move 都可以写智能合约但设计重点不同。Solidity 更像一种面向 EVM 的合约语言。开发者定义 contract里面有状态变量、函数、事件、modifier 等。例如contract Counter { uint256 public value; function increment() public { value 1; } }这里的 value 存在 Counter 合约的 storage 中。Move 则更强调资源和对象。例如public struct Counter has key { id: UID, value: u64, } public entry fun increment(counter: mut Counter) { counter.value counter.value 1; }这里的 Counter 是链上对象函数通过可变引用修改这个对象。可以看到两者的思维方式不同Solidity 合约内部保存状态 函数修改合约 storage Move 对象保存状态 函数接收并操作对象因此Solidity 开发者学习 Move 时最重要的是转换思维不要只想“合约变量”要多想“对象、所有权和转移”。8. IOTA EVM 适合哪些开发者IOTA EVM 更适合以下几类开发者。第一已经熟悉 Solidity 的开发者。如果你已经会写 Solidity 合约熟悉 Remix、Hardhat、Foundry、MetaMask那么 IOTA EVM 的学习成本更低。第二已有 EVM 合约需要迁移的项目。例如已有 ERC-20、ERC-721、DeFi、DAO、NFT 市场等合约如果希望部署到 IOTA 生态中IOTA EVM 会更方便。第三依赖 EVM 工具链的团队。如果项目已经围绕 EVM 工具、审计流程、前端库和钱包集成建立了工程体系那么继续使用 EVM 路线更现实。第四希望快速接入 EVM 用户和流动性的项目。EVM 生态用户基础大、工具成熟、合约标准丰富因此适合快速迁移和试验。可以简单总结会 Solidity → 优先看 IOTA EVM 已有 EVM 合约 → 优先看 IOTA EVM 依赖 EVM 工具链 → 优先看 IOTA EVM9. MoveVM 适合哪些开发者MoveVM 更适合以下几类开发者。第一想学习 IOTA 原生架构的开发者。如果你的目标是深入理解 Rebased 后的 IOTA那么 MoveVM 是绕不开的。第二想使用对象模型开发应用的开发者。如果你希望围绕对象、所有权、权限凭证、共享对象、PTB 等能力设计应用那么 MoveVM 更适合。第三关注资产安全和资源约束的开发者。Move 的 ability、UID、对象所有权等机制有助于更严格地表达资产和状态变化。第四从零开始开发新应用的团队。如果没有历史 EVM 包袱可以直接基于 IOTA 原生对象模型设计合约避免为了兼容旧模型而受限。可以简单总结想学 IOTA 原生能力 → 优先看 MoveVM 想用对象模型 → 优先看 MoveVM 从零设计新合约 → 优先看 MoveVM 关注资源安全 → 优先看 MoveVM10. 两套体系之间怎么选择可以用一个简单判断方式。如果你的目标是快速迁移已有 Solidity 应用那么选择 IOTA EVM。如果你的目标是学习当前 IOTA 的原生架构那么选择 MoveVM。如果你的目标是做 EVM 生态兼容例如 ERC-20、ERC-721、DeFi 合约迁移那么选择 IOTA EVM。如果你的目标是理解 Object、Package、PTB、Shared Object、Capability那么选择 MoveVM。可以整理成表格场景 更适合 已有 Solidity 合约迁移 IOTA EVM 使用 Remix / Hardhat IOTA EVM ERC-20 / ERC-721 应用 IOTA EVM 学习 IOTA 原生对象模型 MoveVM 编写 IOTA Move 合约 MoveVM 使用 PTB 组合对象操作 MoveVM 设计共享对象应用 MoveVM 从零构建 IOTA 原生应用 MoveVM当然这不是绝对的。一个完整项目也可以同时使用两套体系。例如某些资产或应用逻辑在 EVM 侧运行另一些原生对象能力在 Move 侧使用。但对初学者来说最好先选一条主线学清楚。11. 学习顺序建议如果你是 IOTA 初学者我建议先按这个顺序学习。第一先理解 IOTA 历史和架构。知道 Tangle、Rebased、MoveVM、EVM 分别处于什么位置。第二学习对象模型。理解 Object、Owner、Package、Coin、Shared Object。第三学习 Move 基础。理解 module、struct、function、ability、UID、TxContext。第四学习 CLI 和 Localnet。能够在本地启动网络发布 package调用函数查询对象。第五学习 PTB。理解如何在一笔交易中组合多个对象操作。第六再学习 IOTA EVM。如果你有 Solidity 基础可以反过来从 EVM 路线切入再补 Move。也就是说如果目标是“系统理解 IOTA 本身”最好以 MoveVM 为主线。如果目标是“快速部署已有 EVM 合约”可以以 IOTA EVM 为主线。12. 为什么本系列先讲 MoveVM再讲 IOTA EVM本系列前面一直围绕对象模型、Move、Localnet 和 PTB 展开而没有一开始就讲 IOTA EVM。原因很简单这个系列的目标是学习 IOTA 本身而不仅是学习如何在 IOTA 上运行 Solidity 合约。IOTA EVM 对开发者很重要但它更多解决的是生态兼容问题。它让以太坊生态中的合约、工具和开发经验可以进入 IOTA。而 MoveVM 更能体现当前 IOTA 的原生架构。对象模型、Package、Coin、Shared Object、PTB 这些概念都是理解 IOTA 当前技术形态的关键。所以如果目标是理解 IOTA 的底层设计和开发模型应该优先学习 MoveVM。可以这样说学习 IOTA EVM可以快速复用已有 EVM 生态经验。 学习 MoveVM才能真正理解当前 IOTA 的原生开发方式。这也是本系列的安排逻辑。13. EVM 和 MoveVM 是否会互相替代从定位上看EVM 和 MoveVM不是简单的替代关系。EVM 的优势在于成熟生态。Solidity 开发者多工具链成熟标准丰富已有应用众多。MoveVM 的优势在于原生对象模型。它更贴近 IOTA Rebased 后的状态组织方式适合表达对象、资产、权限和状态转移。所以更合理的理解是EVM连接外部成熟生态 MoveVM支撑 IOTA 原生能力两者面向不同开发者群体也服务不同应用需求。对 IOTA 来说同时支持 EVM 和 MoveVM有助于在“生态兼容”和“原生创新”之间取得平衡。14. 初学者容易混淆的几个问题第一个问题IOTA EVM 和 MoveVM 是不是同一个虚拟机不是。MoveVM 执行 Move 合约IOTA EVM 执行 EVM/Solidity 合约。它们的语言、编程模型和开发工具都不同。第二个问题会 Solidity 还需要学 Move 吗如果只是迁移 EVM 合约可以先不深入 Move。但如果想理解 IOTA 原生对象模型和 Rebased 后的 L1 能力就需要学习 Move。第三个问题Move 合约是不是和 Solidity 合约一样不一样。Solidity 通常围绕合约 storage 组织状态Move 更强调对象、资源和所有权。第四个问题IOTA EVM 是不是比 MoveVM 更重要不能这样比较。IOTA EVM 重要在生态兼容MoveVM 重要在原生架构。它们服务的目标不同。第五个问题初学应该先学哪一个如果你想系统学习 IOTA 本身先学 MoveVM。如果你已有 Solidity 基础只想快速部署合约可以先学 IOTA EVM。15. 小结这一期主要讲了 IOTA EVM 和 MoveVM 的关系。MoveVM 是 IOTA 原生对象模型的重要执行环境开发者使用 Move 编写 package定义对象和对象操作逻辑。它更适合理解当前 IOTA 的原生架构。IOTA EVM 则面向 EVM/Solidity 生态兼容让开发者能够使用已有 Solidity 合约、EVM 工具链和以太坊生态经验在 IOTA 上构建应用。它更适合已有 EVM 项目的迁移和快速接入。可以用一句话总结MoveVM 代表 IOTA 原生开发路径IOTA EVM 代表 EVM 生态兼容路径前者帮助理解 IOTA 本身后者帮助连接已有区块链开发生态。