我正在尝试构建一个基线锚智能合约,其中我试图构建一个具有以下(精简)布局的结构
#[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
解析器无法根据函数的签名生成指令处理器,但可能会出现一些问题。
-
您可能需要让它返回
anchor_lang::Result
,而不是返回ProgramResult
。 -
尝试包装
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<()> {}