手册
BareNFT:角色、可暂停和令牌 URI (Barenft Uri)
BareNFT 提供具有 ERC721 Enumerable/Burnable/Pausable 和 AccessControl 的角色门控铸币(to,id,uri)。每个令牌 URI 和暂停权衡。
裸加密货币 Solidity 市场协议
部分 2 的 5
不带 Hardhat/Foundry 的 BareNFT,带有 Remix IDE 和 OpenZeppelin v4.1 GitHub 导入、储备、英国拍卖和 NFT 门控 BareToken 发行架构; ADR、弱 RNG 和紧急权力权衡。
从预设到超越:谁铸造,谁停止
BareNFT 源自 OpenZeppelin ERC721PresetMinterPauserAutoId 框架,但提供 mint(to, tokenId, tokenURI) 以及外部提供的 tokenId 而不是 AutoId。 MINTER_ROLE和PAUSER_ROLE通过AccessControlEnumerable分开;每个令牌的自定义 URI 与 baseURI 相结合,提供元数据灵活性 - 以及由铸币局单独塑造集合的信任模型。```text Deployer ├─ DEFAULT_ADMIN_ROLE ├─ MINTER_ROLE ──> mint(to, id, uri) └─ PAUSER_ROLE ──> pause / unpause | v ERC721Enumerable + Burnable + Pausable | v tokenURI = baseURI + per-token path
## 第一次提到的概念```text
📦 AccessControl
Rol bazli izin modeli; Ownable'dan daha ince taneli mint/pause ayrimi.
📦 ERC721Pausable
Transferleri durduran acil fren; listing ve auction escrow'unu da kilitler.
📦 Per-token URI
Her tokenId icin ayri metadata yolu; baseURI ile birlestirilir.
📦 Role-gated mint
Yalniz MINTER_ROLE sahibinin mint(to, id, uri) cagirabilmesi.
```角色分离提高安全性;但如果 DEFAULT_ADMIN_ROLE 只在一只手上,则 MINTER/PAUSER 的区别仍然是表面性的,而不是可操作的。
## ADR:打开 tokenId 而不是 AutoId
决策:让 mint 签名为 mint(address to, uint256 tokenId, string tokenURI);选择操作员 ID 而不是计数器。原因:藏品目录编号、储备列表和拍卖历史记录通过 tokenId 进行索引。成本:在冲突的 ID 上恢复 _mint;链下铸币协调成为强制性的。这是“运营商目录权威”ADR,而不是“链上自动增量”。
## 角色、暂停和转移钩子
暂停()请求PAUSER_ROLE; _beforeTokenTransfer 调用 Enumerable + Pausable 链。当暂停打开时,BareNFTReserve 或 BareNFTAuction 上的 safeTransferFrom 也会停止 - 紧急制动同时锁定所有托管输出。这是一个强大的事件工具,也意味着操作员可以冻结整个市场。```text
PAUSER_ROLE
pause()
|
v
_beforeTokenTransfer
|
+-- marketplace escrow transfer BLOCKED
+-- peer-to-peer transfer BLOCKED
```## 失败:未经授权的 mint 表面和 URI 偏移量
setMintingCurrency 似乎是可公开调用的; mintingPrice 从未设定——定价面不完整。性能场景:Enumerable + _beforeTokenTransfer 每次转账都会增加繁忙的二级市场中的 Gas 成本。在URI方面,当IPFS网关发生变化时,baseURI + path组合破坏了整个集合;每个令牌的灵活性取决于 baseURI 操作规则。 MINTER_ROLE 渗透通过伪造的 ID 铸币毒害了保留列表历史记录。
## 本期最令人困惑的对决```text
❌ AccessControl = Ownable'in sadesi
✓ AccessControl mint ve pause'u ayirir; Ownable tek sahip ile her seyi birlestirir
❌ Pause sadece transferleri durdurur, marketplace etkilenmez
✓ Escrow safeTransferFrom de pause altinda revert eder; tum pazar kilitlenir
❌ Per-token URI merkeziyetsiz metadata demektir
✓ URI hala minter ve baseURI operatorune guvenir; pin ve gateway politikasi ayridir
您自己的系统清单
- DEFAULT_ADMIN、MINTER和PAUSER是在同一个钱包还是分开的?
- 暂停期间可以通过哪个交易进行公开列表/拍卖?
- 当tokenURI组合更改为baseURI时,旧令牌是否会被破坏?
- 如果尝试两次创建相同的 tokenId,UI 会如何表现?
- 谁可以像setMintingCurrency那样调用halffaces?
本节中需要记住的事情
- BareNFT 通过角色门控铸币 (to,id,uri) 将目录权限带到链上。
- Pausable 是托管市场中的一个全局终止开关——必须清楚地写出权衡。
- 每个令牌 URI 的灵活性取决于 baseURI 操作债务。
角色分离是锁方案;如果admin在一只手上,那么它只是一个标签。
FAQ
Frequently asked questions
什么是访问控制?
基于角色的权限模型;比 Ownable 更细粒度的薄荷/暂停分离。
什么是ERC721Pausable?
停止传输的紧急制动;它还锁定上市和拍卖托管。
“AccessControl = Ownable simple”正确吗?
AccessControl将mint和pause分开; Owable 将一切都集中在一个所有者身上
本节修复了什么?
本部分修复了 BareNFT 角色限制、每个代币 URI 决策以及暂停的市场副作用。 BareNFT 源自 OpenZeppelin ERC721PresetMinterPauserAutoId 框架,但提供 mint(to, tokenId, tokenURI) 以及外部提供的 tokenId 而不是 AutoId。 MINTER_ROLE和PAUSER_ROLE通过AccessControlEnumerable分开;每个令牌的自定义 URI 与 baseURI 相结合,提供元数据灵活性 - 以及由铸币局单独塑造集合的信任模型。
学到的工程原理
- 必须选择 Mint 签名(自动 ID 与开放 ID)以及目录和市场索引模型。
- 暂停应被设计为托管协议中的全局暂停并进行传达。
- 元数据 ADR 必须包括 baseURI、每个令牌路径和网关 pin。
继续阅读
继续阅读
系列中的下一个
BareNFTReserve:托管、RandomBuy 和弱 RNG
仅限所有者 createNewListing、buy 和 randomBuy — keccak256(revealNonce, block.difficulty, msg.sender) % 3. 所有者运营的市场 ADR 和紧急转移。
系列中的下一个
Remix + OpenZeppelin:无需安全帽即可交付
在没有 Hardhat/Foundry 的情况下,如何使用 Remix IDE 和 OpenZeppelin v4.1 GitHub 导入来编译和部署 Bare Crypto 协议? ADR 和权衡。
同系列
BareNFTAuction:索赔、退款和紧急权力
英国拍卖:投标、索赔、取消、保留下返回和所有者紧急转移Nft/transferFunds权衡。