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

j00*_*0yn 4 smartcontracts nearprotocol

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

export function getInfo(): Info {
   const caller = context.sender
   return infos.getSome(caller)
}
Run Code Online (Sandbox Code Playgroud)

并意识到这是因为电话context.sender

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

我在Potential Gotchas上发现了针对此问题的警告,但为什么以下函数会导致视图函数失败?“从近核心暴露的绑定方法”是什么意思?

  • 签名者帐户 ID
  • 签名者帐户PK
  • 前任帐户 ID

小智 6

在函数的上下文中view,不存在这样的东西:

  • signer_account_id
  • signer_account_pk
  • predecessor_account_id

运行视图函数不需要签署任何消息,而且这是不允许的。它更像是匿名检查合同,不需要为此支付任何费用,并且结果与调用者无关。因此,不存在signer_account_idsigner_account_pk

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