---
title: Move 为什么不需要 Approve
date: '2022-10-20 09:56:53'
draft: false
summary: 用通俗语言解释 Move 交互模型和授权模式的差异。
slug: move-without-approve
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/4826978240168597
- platform: X / Twitter
  url: https://x.com/jolestar/status/1583034513122156544
tags:
- move
- security
- smart-contract
topics:
- move
type: post
---

最近关于 Move 智能合约为什么“不需要 approve” 的讨论很多。这个问题表面看是在讨论授权模型，实际上背后是两种完全不同的资产和合约组织方式。

在 EVM 里，每个合约都像一个独立的小世界。用户进入某个合约世界时，只能直接操作那个世界里的状态。比如你要在 swap 合约里使用 USDT，但 USDT 的余额其实记录在 USDT 合约那个世界里，所以只能先执行 `approve`，告诉 USDT 合约：某个 swap 合约可以代你动用这部分资产。然后你再去 swap 合约里完成交易。

这套机制的问题在于：`approve` 和真正的交易往往是分开的。为了节省 gas，很多用户授权后并不会及时 revoke。一旦被授权的合约出现漏洞，资产就可能在用户不知情的情况下被盗走。

Move 的设计思路不一样。它更像是所有合约都运行在同一个更大的数字世界里，用户的数字分身可以带着自己的资产，在不同合约之间自由移动。用户的资产默认保存在自己的存储空间中，因此从 swap 入口进入、提取资产、完成交换、再把结果写回去，可以在同一笔交易里原子化完成。

![](./1583034548119801858-0-FfgPbuhXoAAI_wz.jpg)

这就是为什么 Move 不需要 `approve`：它不是在每个合约之间做“代理授权”，而是直接把用户和资产带进同一个统一执行环境里。

当然，这不是说 Move 天生就没有安全挑战。相反，它把问题换了一个地方：既然用户可以在一个大世界里跨合约移动，那钱包和浏览器就必须更清楚地告诉用户，这笔交易到底动了哪些资产，会产生什么状态变化。

我觉得 Move 在这里至少有两个优势：

1. 可以在预执行阶段把状态变化更完整地展示给用户。
2. Move 没有 EVM 那种任意地址的动态调用，合约逻辑在部署时更确定，因此更容易做静态分析和风险提示。

所以 Move 不需要 `approve`，不是因为它少了一步，而是因为它背后的执行模型和资产模型本来就不同。这种差异真正值得看的，不只是“更方便”，而是它后面可能带来的组合方式和安全模型变化。

<!-- WEIBO_MEDIA_START -->
## 原微博中的媒体

![](./weibo-4826978240168597-1.jpg)
<!-- WEIBO_MEDIA_END -->
