如何建设一个好的网站,WordPress主题设置数据库,专业 网站设计公司,受欢迎的大连网站建设文章目录 Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作#xff1f;场景举例#xff1a;回滚交易和抛出异常如何选择#xff1f; Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作#xff1f;
IERC721 nft IERC721(nftAddress)… 文章目录 Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作场景举例回滚交易和抛出异常如何选择 Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作
IERC721 nft IERC721(nftAddress); // 声明IERC721接口合约变量
if (nft.getApproved(tokenId) ! address(this)) {revert NotApprovedForMarketplace();
}IERC721 _nft IERC721(_nftAddr); // 声明IERC721接口合约变量
require(_nft.getApproved(_tokenId) address(this), Need Approval); // 合约得到授权require 语句
简洁明了require 语句提供了一种简单直观的方式来检查条件并在条件不满足时自动触发回滚同时提供清晰的错误信息。自动回滚当条件不满足时require 语句会自动触发交易回滚避免进一步执行并浪费 gas。错误信息require 语句允许你提供自定义的错误信息使得代码更易于理解和调试。
条件语句结合手动触发 revert 操作:
灵活性手动触发 revert 操作可以让你更灵活地处理异常情况例如可以调用自定义的错误处理函数或者执行其他特定的操作。自定义错误处理你可以根据项目需求自行定义错误处理逻辑例如记录日志、触发事件等。
总结 希望代码简洁明了并且希望在条件不满足时自动触发回滚并且提供清晰的错误信息那么使用 require 语句是一个不错的选择。但如果你需要更灵活地处理异常情况并且希望自定义错误处理逻辑那么使用条件语句结合手动触发 revert 操作可能更适合你。
场景举例回滚交易和抛出异常如何选择
NFT交易所中判断购买价格是否大于挂单价格。
if (msg.value listedItem.price) {revert PriceNotMet(nftAddress, tokenId, listedItem.price);}买家发送的以太币是否足够支付 NFT 的价格并且如果不足以支付价格则会回滚交易
require(msg.value _order.price, Increase price); // 购买价格大于标价检查买家发送的以太币是否足够支付 NFT 的价格并且如果不足以支付价格则会抛出一个异常。
在 Solidity 中回滚交易和抛出异常是两种处理错误的方式 回滚交易 (revert) revert 语句会立即终止当前的函数执行并回滚所有的状态更改。它会将所有的 gas 消耗掉但是不会产生额外的 gas 费用。回滚交易是一种常见的处理错误的方式因为它可以确保在错误发生时状态不会被更改。 抛出异常 (require) require 语句会在条件不满足时抛出异常导致当前的函数执行终止。它会消耗少量的 gas但是会在以太坊区块链上留下记录因此在某些情况下可能会略微增加 gas 费用。
在你的场景中如果买家支付的价格不足以购买 NFT你想要的是立即停止交易确保买家不会支付不正确的价格并且不会产生任何额外的费用。这种情况下使用 revert 是更合适的选择因为它会立即终止当前的函数执行并回滚所有的状态更改确保买家不会支付不正确的价格。
在你的 buyItem 函数中你可以使用 revert 来处理价格不足的情况。例如
function buyItem(uint256 itemId) public payable {uint256 itemPrice getItemPrice(itemId);require(msg.value itemPrice, Insufficient funds);// 执行购买逻辑// 如果执行购买逻辑失败回滚交易if (购买逻辑失败) {revert(Failed to buy item);}
}这样如果买家支付的金额不足以购买 NFT会立即停止交易并且回滚所有状态更改确保买家不会支付不正确的价格。