在 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
奇怪的是,交易看起来都非常成功。只是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