手册

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 和紧急权力权衡。

Bare Crypto Solidity marketplace protocol diagram

从预设到超越:谁铸造,谁停止

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

您自己的系统清单

  1. DEFAULT_ADMIN、MINTER和PAUSER是在同一个钱包还是分开的?
  2. 暂停期间可以通过哪个交易进行公开列表/拍卖?
  3. 当tokenURI组合更改为baseURI时,旧令牌是否会被破坏?
  4. 如果尝试两次创建相同的 tokenId,UI 会如何表现?
  5. 谁可以像setMintingCurrency那样调用halffaces?

本节中需要记住的事情

  1. BareNFT 通过角色门控铸币 (to,id,uri) 将目录权限带到链上。
  2. Pausable 是托管市场中的一个全局终止开关——必须清楚地写出权衡。
  3. 每个令牌 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。

继续阅读

继续阅读

系列中的下一个

系列中的下一个

同系列

Paylaş