在卡尔达诺上使用策略脚本创建 NFT

问题描述 投票:0回答:1

我正在尝试在卡尔达诺上铸造资产/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);
});

有人可以解释一下我该如何解决这个问题吗?

smartcontracts cardano
1个回答
0
投票

我希望这个答案不会来得太晚。

问题是您正在尝试使用旨在验证 utxo 铸造支出的合约。

用于铸造时,您不需要数据。

数据仅用于支出脚本。

这里发生的是节点只向脚本传递 2 个参数。 这意味着该脚本仅“部分应用”;因此它返回一个新函数,而不会抛出错误。 不抛出错误会导致节点认为合约同意交易并继续。

修复很简单。

您只想从合同定义中删除数据。

所以你的合同将如下所示:

export const mintNFT = pfn( [redeemer.type, PScriptContext.type], bool )((message, ctx) => { return pBool(false); });

© www.soinside.com 2019 - 2024. All rights reserved.