我正在尝试在卡尔达诺上铸造资产/nft 之前运行验证。我已经使用 plu-ts 编写了策略脚本,并使用 mesh sdk 编写了事务。
脚本
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;
问题在于它铸造了 NFT,但不运行验证。虽然在交易中,它显示合约已执行,但即使我从脚本返回 false,它仍然会被铸造。
export const mintNFT = pfn(
[datum.type, redeemer.type, PScriptContext.type],
bool
)((datum, message, ctx) => {
return pBool(false);
});
有人可以解释一下我该如何解决这个问题吗?
我希望这个答案不会来得太晚。
问题是您正在尝试使用旨在验证 utxo 铸造支出的合约。
用于铸造时,您不需要数据。
数据仅用于支出脚本。
这里发生的是节点只向脚本传递 2 个参数。 这意味着该脚本仅“部分应用”;因此它返回一个新函数,而不会抛出错误。 不抛出错误会导致节点认为合约同意交易并继续。
修复很简单。
您只想从合同定义中删除数据。
所以你的合同将如下所示:
export const mintNFT = pfn(
[redeemer.type, PScriptContext.type],
bool
)((message, ctx) => {
return pBool(false);
});