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 的正确方法

使用 Anchor 时系统程序账号需要传入啥?

Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?

最终用户如何选择 Dock、Anchor、Location、

如何在 Serum Anchor 中签署代币交易