在 mainnet-beta 上,signMetadata() returns 一个程序错误,而它在 devnet 上有效

On mainnet-beta, signMetadata() returns a program error, whereas it works on devnet

奇怪的是,交易看起来都非常成功。只是signMetadata在使用mainnet-beta时抛出异常

用于比较的两个 txns,使用相同的代码:

主网测试版:https://solscan.io/tx/4zJ9qHRr3kDbhm7vMw4KmBmM4EZ8onx9ozbgKxrfw5wrvMTzaLfC1iDiYY1sQKbYKmYqVnDn4kntAwkwkG8US5Yy 开发网:https://solscan.io/tx/3SZpHSEw3xhLKcBNiy6iPgkJvVnJNCCUjMfGHnmfvh7KWxd6zgnuDoQo1fbTCB4Uc6DqrsWfmDKAbyNR8g5wSCeK?cluster=devnet

创建这些 txns 的代码的一般形状:

const ret = await actions
    .mintNFT({
      connection,
      wallet,
      uri: `${apiHost}/metadata/${uuid}.json`,
      maxSupply: 0,
    })
    .then((res) => res);

  await sleep(20000);

  // Sign the txn
  const signTx = await actions.signMetadata({
    connection,
    wallet,
    editionMint: ret.mint,
    signer: undefined,
  });

在延迟 20 秒后调用 mintNFT 然后 signMetadata,我在某个示例文档或其他文档中看到过。

具体异常:Error: failed to send transaction: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x39

甚至当我查看相关的 NFT mint 时,一切似乎都是正确的。它们出现在我的钱包中,并且在 Solscan 上看起来很合适。

主网测试版:https://solscan.io/token/KzFd3E5M1uZrYknzUmMnw7Z2xL11opQ24zmCBY9mPgD#txs 开发网:https://solscan.io/token/7v3kbyjQeEyP4Ubw73kmfHcvwK5Jo63S4fqiHSFCS3Lt?cluster=devnet#txs

Package.json

{
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@solana/web3.js": "^1.4",
    "bignumber.js": "^9",
    "@metaplex-foundation/mpl-core": "^0.0.4",
    "@metaplex-foundation/mpl-token-metadata": "^1.2.4",
    "@metaplex/js": "^4.11.2",
    "@pinata/sdk": "^1.1.23",
    "@types/node": "^17.0.12",
    "@types/react": "18.0.1",
    "@types/sharp": "^0.30.2",
    "@types/uuid": "^8.3.4",
    "dotenv": "^11.0.0",
    "isomorphic-fetch": "^3.0.0",
    "next": "12.1.4",
    "react": "18.0.0",
    "react-dom": "18.0.0",
    "sharp": "^0.29.3",
    "uuid": "^8.3.2"
  },
  "devDependencies": {
    "eslint": "8.12.0",
    "eslint-config-next": "12.1.4",
    "ts-node": "^10.4.0",
    "typescript": "^4.5.4"
  }
}

您的连接的预检确认级别可能设置为 finalized,这意味着交易是针对最近的最终区块模拟的,即 32 个时隙前。

如果集群运行缓慢,mainnet-beta 最近就是这样,与 devnet 中的 390ms 时隙相比,732ms 时隙,那么生成 32 个块将需要更长的时间。

这样,当你在 20 秒后尝试模拟第二笔交易时,你的第一笔交易还没有落入最终区块,因此集群会拒绝它。

要解决此问题,您可以在 connection 上使用承诺级别 confirmed,方法是:

const connection = new Connection('https://api.mainnet-beta.solana.com', 'confirmed');

有关确认级别的更多信息:https://docs.solana.com/developing/clients/jsonrpc-api#configuring-state-commitment