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)?;
上面的例子不检查用户在程序中的给定津贴。
- 这是否意味着任何 Solana 程序都可以在未经用户同意的情况下转移任何用户的代币?
- 为什么不能查看限额,为什么会有审批功能?
回答您的问题...
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
我正在尝试将以太坊的津贴功能移植到 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)?;
上面的例子不检查用户在程序中的给定津贴。
- 这是否意味着任何 Solana 程序都可以在未经用户同意的情况下转移任何用户的代币?
- 为什么不能查看限额,为什么会有审批功能?
回答您的问题...
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