生锈锚-声压级错误来自太多"fallback functions"?



我正在尝试构建一个基线锚智能合约,其中我试图构建一个具有以下(精简)布局的结构

#[program]
pub mod introToAnchor {
use super::*;

pub fn setData(ctx: UpdateData, data: u64) -> ProgramResult {
.
.
.
}
pub fn terminateData(ctx: TerminateData) -> ProgramResult {
.
.
.
}
(Function Format repeated)
}

但是我得到了错误More than one fallback function found?什么是后备功能,我怎么会有太多?

Jon C的回答应该会让你开始,但我可以给你关于错误和回退函数的背景信息

Anchor的一个文档不太好的特性是,如果传入的指令与任何实现的程序方法都不匹配,则将调用回退方法。

Anchor决定一个方法是回退方法的方式相当迟钝。基本上,任何没有具有Context<>参数的方法都被视为回退方法。

您的原始代码有两个方法没有Context<>参数,因此它看到两个回退方法。一个程序在任何时候都只能有一个回退方法。

不幸的是,我能为您提供的关于此功能的唯一参考是此Issue及其相应的PR。https://github.com/project-serum/anchor/issues/409

解析器无法根据函数的签名生成指令处理器,但可能会出现一些问题。

  1. 您可能需要让它返回anchor_lang::Result,而不是返回ProgramResult

  2. 尝试包装Context中所需的数据。

这两者加在一起给出:

use anchor_lang::prelude::*;
#[program]
pub mod introToAnchor {
use super::*;

pub fn setData(ctx: Context<UpdateData>, data: u64) -> Result<()> {
.
.
.
}
pub fn terminateData(ctx: Context<TerminateData>) -> Result<()> {
.
.
.
}
(Function Format repeated)
}

这是从官方教程中删除的:https://project-serum.github.io/anchor/tutorials/tutorial-1.html#defining-a程序

我也遇到了这个问题。不确定为什么这样做,但它确实做到了:

由于传递引用参数而导致的错误pub fn do_something(ctx: &Context<Something>) -> Result<()> {}通过传递值解决pub fn do_something(ctx: Context<Something>) -> Result<()> {}

最新更新