Solana Anchor:程序如何检查用户提供的已批准令牌配额?
Posted
技术标签:
【中文标题】Solana Anchor:程序如何检查用户提供的已批准令牌配额?【英文标题】:Solana Anchor: how can a program check approved token allowance given by an user? 【发布时间】:2022-01-16 17:14:23 【问题描述】:我正在尝试将以太坊的津贴功能移植到 Solana 程序中,
token.allowance(msg.sender, address(this))
在 Solana SPL 或 Anchor SPL 中似乎没有这样的津贴功能......有吗?
索拉纳声压级:https://spl.solana.com/token#authority-delegation ... 引用“授权委托# 账户所有者可以使用 Approve 指令授权其部分或全部代币余额。授权机构可以转移或销毁他们被授权的金额。账户所有者可以通过撤销指令撤销授权委托。” ... 这个没有说清楚怎么用这样的功能
https://github.com/solana-labs/solana-program-library/blob/master/token/program/src/instruction.rs#L919 ... 里面的approve函数是Rust,但是不好用
锚声压级 https://docs.rs/anchor-spl/0.18.2/anchor_spl/token/struct.Approve.html 我看到 Anchor 使调用 Solana 的批准功能更容易。但我找不到津贴功能。
https://docs.rs/anchor-spl/0.19.0/anchor_spl/token/index.html 这用于检查特定帐户的代币金额。不是津贴。
似乎在 Solana 中,我们不需要检查用户给另一个地址的津贴......因为我在 Anchor 的收银员支票测试示例中发现了这一点:
// Transfer funds to the check.
let cpi_accounts = Transfer
from: ctx.accounts.from.to_account_info().clone(),
to: ctx.accounts.vault.to_account_info().clone(),
authority: ctx.accounts.owner.clone(),
;
let cpi_program = ctx.accounts.token_program.clone();
let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts);
token::transfer(cpi_ctx, amount)?;
上面的例子没有检查用户对程序的给定津贴。
这是否意味着任何 Solana 程序都可以在未经用户同意的情况下转移任何用户的代币? 如果我们不能检查配额,为什么还有批准功能?【问题讨论】:
【参考方案1】:回答您的问题...
这是否意味着任何 Solana 程序都可以在未经用户同意的情况下转移任何用户的代币?
这将是一个相当大的安全漏洞!其概念是,当您transfer
代币时,必须有某个帐户签名以验证转移。该帐户可能是所有者,也可能是某个预先批准的代表。在您显示的示例中,authority
被指定为ctx.accounts.owner.clone()
,这意味着所有者可能已经签署了交易。如果所有者向受托人批准了一些金额,然后与该受托人签署,则令牌程序会确定受托人已签署并允许转移。
如果我们无法检查配额,为什么会有批准功能?
要检查限额,您必须将帐户反序列化为令牌 Account
https://docs.rs/anchor-spl/0.19.0/anchor_spl/token/struct.TokenAccount.html。您可以使用其中一个帮助器,例如 try_deserialize
,它为您提供了一个包装 spl_token::state::Account
的类型。
使用您的spl_token::state::Account
,您可以检查delegated_amount
字段以查看用户批准了多少:https://github.com/solana-labs/solana-program-library/blob/8eb2c3ce60bfe943e277eb172ba8e9ce9b6bdae6/token/program/src/state.rs#L103
【讨论】:
哇。非常感谢乔恩! 我看到在 Solana 中,如果代币所有者或用户签署交易,Solana 代币程序将验证...所以这个概念与以太坊非常不同,因为它是代币将验证权限的合同。谢谢!以上是关于Solana Anchor:程序如何检查用户提供的已批准令牌配额?的主要内容,如果未能解决你的问题,请参考以下文章
Solana中利用Anchor自动解析TokenAccount
在 Solana Anchor 框架中初始化 PDA 的正确方法
Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?