You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NEAR AssemblyScript代币合约approve与allowance函数功能咨询

代币合约approve与allowance函数解释

你贴出的是类ERC20标准代币的核心授权相关接口,两段代码的具体逻辑说明如下:

approve函数

export function approve(spender: string, tokens: u64): boolean {
  logging.log("approve: " + spender + " tokens: " + tokens.toString());
  approves.set(context.sender + ":" + spender, tokens);
  return true;
}
  • 功能:代币持有者(即当前合约调用者)给指定地址spender授予最多tokens数量的代币使用权限,被授权方后续可以通过transferFrom接口在授权额度范围内转走持有者的代币
  • 逻辑说明:
    • 先打印授权操作的日志,记录被授权地址和授权额度
    • 以调用者地址:被授权地址作为唯一键,将授权额度存入approves持久化映射中
    • 固定返回操作成功

approve会将交易与代币总供应量进行校验,确保不会出现代币缺失或超发的情况。类似扑克游戏中要确保没有人额外携带BLU筹码上桌,approve会通过校验桌上BLU总数量为10来允许交易进行。
你参考的上述科普内容是通俗化的简化解释,这个教学示例中的approve实现没有做这类校验,甚至允许用户授予超过自身持有量的额度,实际的余额、总供应量校验逻辑通常在transferFrom接口中实现。

allowance函数

export function allowance(tokenOwner: string, spender: string): u64 {
  const key = tokenOwner + ":" + spender;
  if (!approves.contains(key)) {
    return 0;
  }
  return approves.getSome(key);
}
  • 功能:查询指定代币持有者给某被授权地址的剩余可用授权额度
  • 逻辑说明:
    • 拼接持有者地址:被授权地址作为查询键
    • 如果映射中不存在该键,说明从未做过授权,返回0
    • 否则返回映射中存储的对应授权额度

代币合约补充说明文档

该合约是面向初学者的教学演示类代币合约,补充说明如下:

  • 合约实现的是简化版的类ERC20代币逻辑,仅保留核心的转账、授权功能,未包含生产级安全校验
  • 核心存储approves为链上持久化映射,专门存储所有地址的授权关系数据
  • 函数使用注意:
    • 本实现的approve未做调用者余额校验,授予超过自身持有量的额度属于无效授权,后续transferFrom会因为余额不足执行失败
    • allowance属于只读接口,调用不会修改链上状态,无需消耗Gas
  • 生产环境改造建议:
    • 新增approve调用时的余额校验,避免用户设置无效授权
    • 新增授权变更事件,方便链下服务同步授权状态
    • 修复授权竞态漏洞:修改授权额度时要求用户先将额度设为0,再设置新的额度,避免攻击者利用前后两次授权的时间差发起双花攻击

内容的提问来源于stack exchange,提问作者0xull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:36:04