为什么像signer_account_id这样的Env变量会导致错误:ProhibitedInView?

问题描述

对于执行以下操作的简单视图函数,我收到 ProhibitedInView 错误

export function getInfo(): Info {
   const caller = context.sender
   return infos.getSome(caller)
}

并意识到这是因为 context.sender 调用

我的假设/理解是,只要 tx 不改变状态,它们就可以被视为 ViewFunctions。

我在 Potential Gotchas 上发现了一个警告,但为什么以下函数会导致视图函数失败? “从 Nearcore 公开的绑定方法”是什么意思?

  • signer_account_id
  • signer_account_pk
  • predecessor_account_id

解决方法

view 函数的上下文中,没有这样的东西:

  • signer_account_id
  • signer_account_pk
  • predecessor_account_id

运行视图函数不需要对任何消息进行签名,而且是不允许的。这更像是匿名检查合同,不应该为此付出任何代价,并且结果与调用者无关。因此,没有 signer_account_idsigner_account_pk

另一方面,如果您在查看模式下发起此调用,则无法进行跨合约调用。因此,没有 predecessor_account_id 可用,因为 signer_account_id 不可用,并且不可能从另一个合约调用。