九层天塔模式DAPP开发系统搭建技术
2023.04.24 09:09浏览量:124简介:说了NFT的独特,那我们再来谈谈它是怎么被铸造的,基于什么逻辑实现它的独一无二。
文心大模型4.5及X1 正式发布
百度智能云千帆全面支持文心大模型4.5 API调用,文心大模型X1即将上线
说了NFT的独特,那我们再来谈谈它是怎么被铸造的,基于什么逻辑实现它的独一无二。
以下非同质化代币的铸造分析,原始代码参考以太坊ERC721提案。
首先非同质化代币的铸造会执行
_safeMint函数,该函数存在两个参数,他们分别的作用是:
to:新铸的代币接受地址
tokenId:九层天塔dapp系统13z开4z77发z558,新铸代币的id序列
function _safeMint(address to,uint256 tokenId)internal virtual{
_safeMint(to,tokenId,””);//接收以上两个参数加上空字符凑齐3个参数传入同名_safeMint函数(重载)
}
可以看到接下来调用三参数同名_safeMint函数,
function _safeMint(address to,uint256 tokenId,bytes memory _data)internal virtual{//接收_safeMint函数传参
_mint(to,tokenId);//将传参to和tokenId传入_mint函数
require(_checkOnERC721Received(address(0),to,tokenId,_data),”ERC721:transfer to non ERC721Receiver implementer”);//调用_checkOnERC721Received函数来检测函数接口合法性
}
最后调用_mint函数进行铸币:
function _mint(address to,uint256 tokenId)internal virtual{//接收来自_safeMint函数的传参
require(to!=address(0),”ERC721:mint to the zero address”);//校验传参地址是否为空(为假继续后续操作,为真终止操作)
require(!_exists(tokenId),”ERC721:token already minted”);//接着校验tokenId是否已经存在(为假继续后续操作,为真终止操作)
_beforeTokenTransfer(address(0),to,tokenId);//初始化;
_balances[to]+=1;//在传参地址to上生成一个token
_owners[tokenId]=to;//将传参地址to与引索tokenId进行绑定
emit Transfer(address(0),to,tokenId);//触发token生成事件
}
就这样一个独一无二的NFT被铸造出来了。总体过程如下:
合约中使用_safeMint函数调用铸币函数并检查函数的ERC721函数接口合法性,该函数在ERC721中有所体现,代码如下:
function _checkOnERC721Received(address from,address to,uint256 tokenId,bytes memory _data)
private returns(bool)
{
if(to.isContract()){
try IERC721Receiver(to).onERC721Received(_msgSender(),from,tokenId,_data)returns(bytes4 retval){
return retval==IERC721Receiver(to).onERC721Received.selector;
}catch(bytes memory reason){
if(reason.length==0){
revert(“ERC721:transfer to non ERC721Receiver implementer”);
}else{
//solhint-disable-next-line no-inline-assembly
assembly{
revert(add(32,reason),mload(reason))
}
}
}
}else{
return true;
}
}
在_mint函数中首先检查了地址是否是0地址,还有tokenId是否已存在。该tokenId在ERC721标准中生成规则是一个不可互换的通证。检测通过后为to地址铸币(相应的tokenId),同时记录余额与该NFT艺术品的归属者
发表评论
登录后可评论,请前往 登录 或 注册