如何在 Serum Anchor 中签署代币交易
Posted
技术标签:
【中文标题】如何在 Serum Anchor 中签署代币交易【英文标题】:How to sign token transaction in Serum Anchor 【发布时间】:2021-10-20 18:26:20 【问题描述】:我有一个使用 Serum Anchor(在 Solana 上)的简单合约,将代币从一方转移到另一方。它目前失败了:
Error: failed to send transaction: Transaction simulation failed: Error processing Instruction 0: Cross-program invocation with unauthorized signer or writable account
来自以下 sn-ps 的完整代码:https://gist.github.com/h4rkl/700400f515ab0736fd6d9318d44b2dca
我正在为交易设置 4 个帐户:
let mint = null; // key for token mint
let god = null; // main program account to pay from and sign
let creatorAcc = anchor.web3.Keypair.generate(); // account to pay to
let creatorTokenAcc = null; // token account for payment
我将它们设置如下:
const [_mint, _god] = await serumCmn.createMintAndVault(
program.provider,
new anchor.BN(MINT_TOKENS),
undefined,
MINT_DECIMALS
);
mint = _mint;
god = _god;
creatorTokenAcc =await serumCmn.createTokenAccount(
program.provider,
mint,
creatorAcc.publicKey
);
然后我通过以下方式付款:
const INTERACTION_FEE = 200000000000000;
await program.rpc.interaction(new anchor.BN(INTERACTION_FEE),
accounts:
from: god,
to: creatorTokenAcc,
owner: program.provider.wallet.publicKey,
tokenProgram: TOKEN_PROGRAM_ID,
,
);
在合约中方法触发我的交互过程如下:
pub fn interaction(ctx: Context<Interaction>, interaction_fee: u64) -> ProgramResult
let cpi_accounts = Transfer
from: ctx.accounts.from.to_account_info().clone(),
to: ctx.accounts.to.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, interaction_fee)?;
Ok(())
我已经使用以下参数设置了交互pub struct
:
#[derive(Accounts)]
pub struct Interaction<'info>
#[account(mut, has_one = owner)]
from: CpiAccount<'info, TokenAccount>,
#[account("from.mint == to.mint")]
to: CpiAccount<'info, TokenAccount>,
#[account(signer)]
owner: AccountInfo<'info>,
token_program: AccountInfo<'info>,
据我所知,参数是正确的,god
帐户拥有钱包作为付款人并且是签名人。为什么会失败,我错过了什么?我完全没有想法。
【问题讨论】:
嗨,您能更新您的代码吗?我想显示该 ccodes 的新版本。 工作版本在这里。 gist.github.com/awcchungster/f865afefcda74d1985c066fa26775a7c 【参考方案1】:由传奇的 Armani Ferrante 回答 here:
您的
to
帐户未标记为可变。
【讨论】:
它必须是可变的吗?以上是关于如何在 Serum Anchor 中签署代币交易的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中签署 AAR Artifacts?