Cardano中Plu-ts编写的NFT铸币脚本验证不生效问题求助
Cardano铸币脚本验证逻辑不生效问题排查与解决
问题描述
在Cardano上铸造NFT时,使用Plu-ts编写铸币策略脚本,通过Mesh SDK构建交易。NFT可成功铸造,但验证逻辑完全不生效——即使将脚本返回值改为pBool(false),交易仍能成功上链。
现有脚本
export const mintNFT = pfn( [datum.type, redeemer.type, PScriptContext.type], bool )((datum, message, ctx) => { return pBool(true); });
交易代码
const script: PlutusScript = { code: nftScriptCbor, version: "V2", }; const recipient = await wallet.getChangeAddress(); const redeemer: Partial<Action> = { tag: "MINT", }; const tx = new Transaction({ initiator: wallet }); const metadata: AssetMetadata = { name: "Test Token", description: "This is a test nft", image: "ipfs://", mediaType: "image/jpg", }; const asset: Mint = { assetName: "MeshToken", assetQuantity: "1", metadata, label: "721", recipient, }; const myUTxOs = await wallet.getUtxos(); tx.setCollateral(myUTxOs); tx.mintAsset(script, asset, redeemer); const unsignedTx = await tx.build(); const signedTx = await wallet.signTx(unsignedTx); const txHash = await wallet.submitTx(signedTx); return txHash;
解决方案
1. 修正脚本参数签名(核心问题)
Cardano的Plutus V2铸币脚本(政策脚本)不需要datum参数,仅接收redeemer和ScriptContext两个参数。错误的参数签名会导致脚本无法被节点正确执行,直接绕过验证逻辑。修改脚本:
export const mintNFT = pfn( [redeemer.type, PScriptContext.type], // 移除datum.type参数 bool )((message, ctx) => { return pBool(false); });
2. 确保资产与脚本政策ID绑定
交易中铸造的资产必须关联脚本生成的政策ID,否则会使用默认的自由铸币政策(无验证)。添加政策ID关联:
import { hashScript } from '@meshsdk/core'; // 计算脚本对应的政策ID const policyId = hashScript(script); // 在asset对象中明确指定政策ID const asset: Mint = { policyId: policyId, // 新增这一行 assetName: "MeshToken", assetQuantity: "1", metadata, label: "721", recipient, };
3. 验证脚本编译与CBOR有效性
确保Plu-ts脚本已正确编译为CBOR格式:
import { compile } from '@plu-ts/core'; // 重新编译脚本生成有效CBOR const nftScriptCbor = compile(mintNFT).toString();
4. 检查交易结构
构建交易后,可通过Cardano区块浏览器查看交易详情,确认:
- 交易包含了你编写的脚本
- 铸币动作的政策ID与脚本哈希一致
内容的提问来源于stack exchange,提问作者Saad Raja
相关产品推荐
相关产品推荐

