没什么大的区别,action就是把instruction的函数名给大写了。 识别不同的action,就是通过解析tx里面的instruction的函数调用,不同的函数对应不同的action,解析合约的函数调用,就是通过合约的idl描述文件,这个和evm上的abi文件基本上差不多,只是具体细节上差异很大。
在tx里面,Instruction Details里面 一条Instruction Instruction Data Raw ,前面8个字节仍然是函数签名。 不是anchor生成的解析方法得看合约的源码。
你这个例子中的,raydium就是一个没有使用anchor的特例,参考源码 https://github.com/raydium-io/raydium-amm/blob/master/program/src/instruction.rs 这个不是使用的函数签名 这里第一个字节 09表示 swapBaseIn。
impl AmmInstruction {
/// Unpacks a byte buffer into a [AmmInstruction](enum.AmmInstruction.html).
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (&tag, rest) = input
.split_first()
.ok_or(ProgramError::InvalidInstructionData)?;
Ok(match tag {
9 => {
let (amount_in, rest) = Self::unpack_u64(rest)?;
let (minimum_amount_out, _rest) = Self::unpack_u64(rest)?;
Self::SwapBaseIn(SwapInstructionBaseIn {
amount_in,
minimum_amount_out,
})
}
有解析不了的,联系我,开不开源,无所谓。 补充一个,Jupiter v6 的tx识别 tx如下: https://solana.fm/tx/5YTgCGQpXjkwXLnEMgVt4A4XvXxJzBpGzni5wMQQQcWR9AL28VrH1FJeNM2g9yeb12C6rXT1yRvTSV7wh4CytjEM?cluster=mainnet-alpha 函数原始Instruction Data Raw 是一个标准的anchor接口的api 贴一个算法: 由idl中的定义到,Instruction Data Raw 中的函数签名: