高新手机网站建设公司,微信公众号和网站建设方案,湛江手机网站建设,有创意的婚纱网站模板下载文章目录 1、非同质化货币#xff08;NFT#xff09;- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币#xff08;NFT#xff09;- 维基百科 非同质化代币#xff08;英语#xff1a;Non-F… 文章目录 1、非同质化货币NFT- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币NFT- 维基百科 非同质化代币英语Non-Fungible Token简称NFT是一种众筹扶持项目方的方式也是区块链数位账本上的一种数据单位每个代币可以代表一个独特的数字资料作为虚拟商品所有权的电子认证或证书。由于其不能互换的特性非同质化代币可以代表数字资产如画作、艺术品、声音、影片、游戏中的项目或其他形式的创意作品。虽然作品本身是可以无限复制的但这些代表它们的代币在其底层区块链上能被完整追踪故能为买家提供所有权证明。诸如以太币、比特币等加密货币都有自己的代币标准以定义对NFT的使用。 2、IERC165 ERC165 是一个非常简单的以太坊标准,主要用于检测该合约是否支持查询的接口。调用者只需要传入想要检测的接口的ID(如ERC-165的ID是0x01ffc9a7),该函数以布尔值的方式(true支持false不支持)告诉调用者该合约是否实现了这个接口。 IERC165 是 ERC165 标准的接口合约规定了ERC165要实现的基本函数 supportsInterface // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;interface IERC165 {// ERC165 代币标准就是检查一个智能合约是不是支持了例如 ERC721 ERC1155 的接口。 // 如果支持返回truefunction supportsInterface(bytes4 interfaceId) external view returns (bool);
}3、IERC721 IERC721 是 ERC721 标准的接口规范,它定义和规范了一个标准 ERC721 代币合约应该实现的功能。这里让 ERC721 合约直接继承自 IERC721() 接口。 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import ./IERC165.sol;// ERC721标准接口.
interface IERC721 is IERC165 {// 转账时触发event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);// 授权时触发 event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);// 在批量授权时触发 event ApprovalForAll(address indexed owner, address indexed operator, bool approved);// 返回某地址的NFT持有量balancefunction balanceOf(address owner) external view returns (uint256 balance);// 返回某 tokenId 的主人 ownerfunction ownerOf(uint256 tokenId) external view returns (address owner);// 实现了 ERC721Receiver 接口的安全转账和重载函数 function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;function safeTransferFrom(address from,address to,uint256 tokenId) external;// 普通转账参数为转出地址from接收地址to和tokenId。function transferFrom(address from,address to,uint256 tokenId) external;// 授权NFT给另外一个地址 tofunction approve(address to, uint256 tokenId) external;// 持有的该系列NFT批量授权给某个地址operatorfunction setApprovalForAll(address operator, bool _approved) external;// 查询tokenId被批准给了哪个地址。function getApproved(uint256 tokenId) external view returns (address operator);// 查询某地址的NFT是否批量授权给了另一个operator地址function isApprovedForAll(address owner, address operator) external view returns (bool);
}4、IERC721Receiver 为了防止 NFT 转入黑洞合约ERC721 实现了 safeTransferFrom() 安全转账函数目标合约必须实现了 IERC721Receiver 接口才能接收ERC721代币不然会 revert 。 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;interface IERC721Receiver {function onERC721Received(address operator,address from,uint tokenId,bytes calldata data) external returns (bytes4);
}5、IERC721Metadata IERC721Metadata 是 ERC721 的拓展接口它定义了合约的元数据信息包括合约名字、标志以及每个代币的 tokenURI。 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;interface IERC721Metadata {// 代币名称function name() external view returns (string memory);// 代币符号 function symbol() external view returns (string memory);// 通过 tokenId 查询 metadata 的链接urlfunction tokenURI(uint256 tokenId) external view returns (string memory);
} 6、ERC721 ERC-721 - 非同质化代币标准,主要用于发行独一无二的代币化资产如加密收藏品、游戏装备等。 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import ./IERC165.sol;
import ./IERC721.sol;
import ./IERC721Receiver.sol;
import ./IERC721Metadata.sol;
import ./Address.sol;
import ./Strings.sol;contract ERC721 is IERC721, IERC721Metadata {using Address for address; // 使用Address库用isContract来判断地址是否为合约using Strings for uint256; // 使用String库// Token名称 string public override name;// Token代号 string public override symbol;// tokenId 到 owner address 的持有人映射mapping(uint address) private _owners;// address 到持仓数量的持仓量映射mapping(address uint) private _balances;// tokenID 到授权地址的授权映射mapping(uint address) private _tokenApprovals;// owner地址。到operator地址的批量授权映射mapping(address mapping(address bool)) private _operatorApprovals;// 构造函数初始化name 和symbol .constructor(string memory name_, string memory symbol_) {name name_;symbol symbol_;}// 实现IERC165接口 supportsInterfacefunction supportsInterface(bytes4 interfaceId) external pure override returns (bool) {return interfaceId type(IERC721).interfaceId ||interfaceId type(IERC165).interfaceId ||interfaceId type(IERC721Metadata).interfaceId;}// 实现IERC721的balanceOf利用_balances变量查询owner地址的balance。function balanceOf(address owner) external view override returns (uint) {require(owner ! address(0), owner zero address);return _balances[owner];}// 实现IERC721的ownerOf利用_owners变量查询tokenId的owner。function ownerOf(uint tokenId) public view override returns (address owner) {owner _owners[tokenId];require(owner ! address(0), token doesnt exist);} // 实现IERC721的isApprovedForAll利用_operatorApprovals变量查询owner地址是否将所持NFT批量授权给了operator地址。function isApprovedForAll(address owner, address operator) external view override returns (bool) {return _operatorApprovals[owner][operator];}// 实现IERC721的setApprovalForAll将持有代币全部授权给operator地址。function setApprovalForAll(address operator, bool approved) external override {_operatorApprovals[msg.sender][operator] approved;emit ApprovalForAll(msg.sender, operator, approved);}// 实现IERC721的getApproved利用_tokenApprovals变量查询tokenId的授权地址。function getApproved(uint tokenId) external view override returns (address) {require(_owners[tokenId] ! address(0), token doesnt exist);return _tokenApprovals[tokenId];}// 授权函数。通过调整_tokenApprovals来授权 to 地址操作 tokenId同时释放Approval事件。function _approve(address owner, address to, uint tokenId) private {_tokenApprovals[tokenId] to;emit Approval(owner, to, tokenId);}// 实现IERC721的approve将tokenId授权给 to 地址。function approve(address to, uint tokenId) external override {address owner _owners[tokenId];require(msg.sender owner || _operatorApprovals[owner][msg.sender],not owner nor approved for all);_approve(owner, to, tokenId);}// 查询 spender地址是否可以使用tokenId他是owner或被授权地址。function _isApprovedOrOwner(address owner, address spender, uint tokenId) private view returns (bool) {return (spender owner ||_tokenApprovals[tokenId] spender ||_operatorApprovals[owner][spender]);}// 转账函数function _transfer( address owner, address from, address to, uint tokenId) private {require(from owner, not owner);require(to ! address(0), transfer to the zero address);_approve(owner, address(0), tokenId); // 清空token的授权 _balances[from] - 1;_balances[to] 1;_owners[tokenId] to;emit Transfer(from, to, tokenId);}// 实现IERC721的transferFrom非安全转账不建议使用。调用_transfer函数function transferFrom(address from, address to, uint tokenId) external override {address owner ownerOf(tokenId);require(_isApprovedOrOwner(owner, msg.sender, tokenId),not owner nor approved);_transfer(owner, from, to, tokenId);}// 安全转账安全地将 tokenId 代币从 from 转移到 tofunction _safeTransfer( address owner, address from, address to, uint tokenId, bytes memory _data ) private {_transfer(owner, from, to, tokenId);require(_checkOnERC721Received(from, to, tokenId, _data), not ERC721Receiver);}// 实现IERC721的safeTransferFrom安全转账调用了_safeTransfer函数。function safeTransferFrom(address from, address to, uint tokenId, bytes memory _data) public override {address owner ownerOf(tokenId);require(_isApprovedOrOwner(owner, msg.sender, tokenId), not owner nor approved);_safeTransfer(owner, from, to, tokenId, _data);}// safeTransferFrom重载函数function safeTransferFrom( address from, address to, uint tokenId) external override {safeTransferFrom(from, to, tokenId, );}// 铸造函数。通过调整_balances和_owners变量来铸造tokenId并转账给 to同时释放Transfer事件。。function _mint(address to, uint tokenId) internal virtual {require(to ! address(0), mint to zero address);require(_owners[tokenId] address(0), token already minted);_balances[to] 1;_owners[tokenId] to;emit Transfer(address(0), to, tokenId);}// 销毁函数通过调整_balances和_owners变量来销毁tokenId同时释放Transfer事件。function _burn(uint tokenId) internal virtual {address owner ownerOf(tokenId);require(msg.sender owner, not owner of token);_approve(owner, address(0), tokenId);_balances[owner] - 1;delete _owners[tokenId];emit Transfer(owner, address(0), tokenId);}// 调用IERC721Receiver-onERC721Received, 以防 tokenId 被不小心转入黑洞。function _checkOnERC721Received(address from, address to, uint tokenId, bytes memory _data) private returns (bool) {if (to.isContract()) {// 是否实现了 IERC721Receiver接口return IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) IERC721Receiver.onERC721Received.selector;} else {return true;}}// 实现IERC721Metadata的tokenURI函数查询metadata。function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {require(_owners[tokenId] ! address(0), Token Not Exist);string memory baseURI _baseURI();return bytes(baseURI).length 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ;}// 计算{tokenURI}的BaseURItokenURI就是把baseURI和tokenId拼接在一起需要开发重写。function _baseURI() internal view virtual returns (string memory) {return ;}
}7、ERC721 NFT 的实现 再写一个合约继承 ERC721 并写好 MAX_APES 状态变量、构造函数、baseURI 函数以及锻造 mint 函数。 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import ./ERC721.sol;contract NFTSang is ERC721 {uint public MAX_APES 10000; // 总量// 构造函数constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_){}// ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariAR3jxcaWtq/function _baseURI() internal pure override returns (string memory) {return ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariAR3jxcaWtq/;}// 铸造函数function mint(address to, uint tokenId) external {require(tokenId 0 tokenId MAX_APES, tokenId out of range);_mint(to, tokenId);}
}8、编译部署
redmix 可以直接编译运行。 免费锻造代币正式使用需要开发者继续完善比如规定哪些人有锻造此代币的权限。 文章转载自: http://www.morning.pndw.cn.gov.cn.pndw.cn http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn http://www.morning.tfpqd.cn.gov.cn.tfpqd.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.dpsyr.cn.gov.cn.dpsyr.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.rbzd.cn.gov.cn.rbzd.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.dfygx.cn.gov.cn.dfygx.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn http://www.morning.rdnkx.cn.gov.cn.rdnkx.cn http://www.morning.hslgq.cn.gov.cn.hslgq.cn http://www.morning.rshijie.com.gov.cn.rshijie.com http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.ftlgy.cn.gov.cn.ftlgy.cn http://www.morning.fjmfq.cn.gov.cn.fjmfq.cn http://www.morning.fmgwx.cn.gov.cn.fmgwx.cn http://www.morning.gjws.cn.gov.cn.gjws.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.nfks.cn.gov.cn.nfks.cn http://www.morning.qfdyt.cn.gov.cn.qfdyt.cn http://www.morning.yqqgp.cn.gov.cn.yqqgp.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.wjlnz.cn.gov.cn.wjlnz.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.lbqt.cn.gov.cn.lbqt.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.bqwnp.cn.gov.cn.bqwnp.cn http://www.morning.ypnxq.cn.gov.cn.ypnxq.cn http://www.morning.sgcdr.com.gov.cn.sgcdr.com http://www.morning.nhzxd.cn.gov.cn.nhzxd.cn http://www.morning.ykmg.cn.gov.cn.ykmg.cn http://www.morning.gqfbl.cn.gov.cn.gqfbl.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.sypby.cn.gov.cn.sypby.cn http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn http://www.morning.tqrbl.cn.gov.cn.tqrbl.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.qzglh.cn.gov.cn.qzglh.cn http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.nchsz.cn.gov.cn.nchsz.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.ktrdc.cn.gov.cn.ktrdc.cn http://www.morning.wwwghs.com.gov.cn.wwwghs.com http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn http://www.morning.qdlr.cn.gov.cn.qdlr.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.prls.cn.gov.cn.prls.cn http://www.morning.807yy.cn.gov.cn.807yy.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.kcsx.cn.gov.cn.kcsx.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.ksjnl.cn.gov.cn.ksjnl.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.cbqqz.cn.gov.cn.cbqqz.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn http://www.morning.mzcsp.cn.gov.cn.mzcsp.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.pjbhk.cn.gov.cn.pjbhk.cn http://www.morning.hffpy.cn.gov.cn.hffpy.cn http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn