NEAR 上先交押金再登记:storage_deposit 与两条退钱的路 图 1
NEAR 上先交押金再登记:storage_deposit 与两条退钱的路 · 图 1

在 NEAR 上领一枚 NFT、或者第一次往某个合约里存余额,钱包常常弹出一笔不小的附加金额。它不是手续费,而是存储押金:NEAR 采用存储质押机制,合约账户必须有足够余额覆盖随时间不断增长的存储用量,NEP-145 则规定了一套把这部分成本转给使用者的统一接口。

先看两个查询函数

规范定义的读接口是 storage_balance_bounds 和 storage_balance_of。前者返回 {min, max},两者都是无符号 128 位整数的字符串表示,单位是 yoctoNEAR;min 是从零开始使用这个合约所需要的金额,也就是注册门槛。规范写得很具体:如果新用户附上恰好 min 的存款完成 storage_deposit,之后查询该账户的 storage_balance_of 必须显示 total 等于 min、available 为 0。max 可以等于 min,表示合约只收一次注册费、不随用户数据增长调整;而实现了 max 的合约,必须退还任何会把用户存储余额推过这个上限的存款。

规范的示例给了一组直观数字:某合约新增一个用户键需要 0.00235 NEAR,于是它的 bounds 里 min 与 max 都是 2350000000000000000000 yoctoNEAR,多附的钱会被立刻退回。

NEAR 上先交押金再登记:storage_deposit 与两条退钱的路 图 2
NEAR 上先交押金再登记:storage_deposit 与两条退钱的路 · 图 2

storage_deposit 谁都能付,退款有两种

storage_deposit(account_id, registration_only) 是可支付方法,接受为某个账户存入的押金。规范约定:省略 account_id 时押金必须记到直接调用者( predecessor 账户)头上;给了这个参数就必须记给它,地址非法则合约必须 panic。registration_only=true 的语义容易被误读,规范的要求是:账户此前未注册时,退还超过最低额的部分;账户已经注册时,全额退还。

值得留意的是,这个调用可以由别人代付。文档在 FT 场景里同样写明这一点,所以”有人替我交了押金”在协议层完全正常,不代表对方拥有你的资产。

退钱有两条不同的路

第一条是 storage_withdraw(amount),它只取出可用的那部分押金。规范强调这个方法调用起来是安全的,绝对不能移除数据:amount 是 128 位无符号整数字符串,省略时必须退全额可用余额,超过可用余额时必须 panic,调用者未注册时同样必须 panic;并且必须要求恰好附上 1 yoctoNEAR,用来防止受限函数调用型访问密钥被误用——这是 NEAR 生态一条反复出现的安全约定。

第二条是 storage_unregister(force),它注销账户并把存储押金退回。规范的要求包括:调用者此前未注册时,必须在不 panic 的前提下返回 false;force=true 时应当忽略账户余额(把它烧掉)并关闭账户;否则,只要调用者还有已注册的正面余额,合约就必须 panic。这个方法同样要求恰好 1 yoctoNEAR。

退押金前自查
1. storage_balance_of 看 total 与 available,判断可动用部分
2. 只想要零钱:storage_withdraw,附 1 yoctoNEAR
3. 想彻底退出:确认资产余额为零,再 storage_unregister
4. 用 force=true 前想清楚:余额会被烧掉,不可逆

对 NFT 持有人的意义

NEAR 的 NFT 合约工具会把存储管理方法与 NFT 方法一并派生出来,注册、押金与注销因此和领藏品、挂单绑在一起:没登记的账户可能收不到 NFT,退出时若忘记注销,押金就长期躺在合约里。判断”这笔钱是不是白付”,看的不是页面写了什么,而是这两个查询函数与上面两条退款路径的实际结果。

把押金与资产安全放在一起看,NEAR 的结构其实是两笔账:押金是你在合约里为存储预付的钱,理论上可以按上面两条路退回;资产则记在合约的账本里,注销时若还有余额,规范要求必须 panic(除非你显式使用会烧掉余额的强制模式)。这条设计的含义是,合约不允许你“带着藏品悄悄退出”。所以在换钱包、关账户或清理不再使用的系列之前,正确顺序是先把藏品转走、确认余额为零,再谈退押金。

还有一种新手常见困惑来自代付:registration 押金可以由第三方账户替你交,界面上一笔“别人给我付了注册费”在协议层完全正常,它不会因此给对方任何处置你资产的权限。要判断谁有权动你的藏品,看的仍然是账户密钥、访问密钥类型与合约侧的授权记录,而不是谁替你出过这笔钱。反过来说,如果你曾替别人交过押金,那笔钱也在对方的账户名下,不能期待自动退回你手里。

本文为机制说明,不构成任何投资建议。