Solana Anchor:程序如何检查用户提供的已批准代币配额?

Solana Anchor: how can a program check approved token allowance given by an user?

我正在尝试将以太坊的津贴功能移植到 Solana 程序中,

token.allowance(msg.sender, address(this))

好像在Solana SPL,或者Anchor SPL中没有这样的allowance函数……有吗?

Solana SPL:https://spl.solana.com/token#authority-delegation ... 引用“权限委托# 账户所有者可以使用批准指令委托对其部分或全部代币余额的授权。授权机构可以转移或销毁他们被授权的金额。帐户所有者可以通过撤销指令撤销授权委托。” ... 这个功能怎么用没说清楚

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)?;

上面的例子不检查用户在程序中的给定津贴。

回答您的问题...

Does that mean any Solana program can transfer any user's tokens without their consent?

那将是一个相当大的安全漏洞!这个概念是,当你 transfer 令牌时,一些帐户必须签名以验证转移。该帐户可能是所有者,或某个预先批准的委托人。在您显示的示例中,authority 给出为 ctx.accounts.owner.clone(),这意味着所有者可能已经签署了交易。如果所有者批准了一些金额给受托人,然后与该受托人签署,令牌程序会认为受托人已签署,并允许转账。

Why does the approve function exist if we cannot check the allowance?

要检查津贴,您必须将帐户反序列化为令牌 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