ERC-8234:可引用 NFT 的授權標準

ERC-8234:可引用 NFT 的授權標準

Ethereum Magicians·

AI 生成摘要

本 ERC 定義了一個標準介面,用於授權任意 ERC-5521 代幣之間的引用關係,允許 NFT 持有者透過鏈上操作或離線簽名來授予或撤銷特定 NFT 的引用授權。

摘要

此 ERC 定義了一個標準介面,用於授權任意 ERC-5521 代幣之間的推薦關係。它允許被推薦 NFT 的所有者透過鏈上直接操作或離線簽名,授予或撤銷對特定推薦 NFT 的授權。此 ERC 旨在用於跨合約推薦場景,並在不修改代幣合約本身的情況下,將推薦授權功能追溯套用到現有的 ERC-721 集合中。

動機

現有的具備推薦功能的 NFT 設計,並未為跨任意 ERC-5521 合約的推薦關係提供通用的授權層。特別是許多現有的 ERC-721 集合無法透過修改來增加原生推薦邏輯,且現有的方法並未標準化「被推薦 NFT 的所有者」如何明確控制哪些外部 NFT 被允許對其進行推薦。

此 ERC 為此目的定義了一個最小化的授權介面。它實現了:

來自任意 ERC-5521 合約的 NFT 之間的授權;

被推薦 NFT 所有者可控的同意機制;

透過離線簽名實現無 Gas 授權;

可作為獨立註冊表或輔助模組部署。

此 ERC 本身不定義推薦關係,僅定義如何授予、撤銷和查詢此類關係的授權。

規範

本文件中的關鍵詞「必須 (MUST)」、「不得 (MUST NOT)」、「要求 (REQUIRED)」、「應當 (SHALL)」、「不應當 (SHALL NOT)」、「應該 (SHOULD)」、「不應該 (SHOULD NOT)」、「推薦 (RECOMMENDED)」、「可以 (MAY)」和「可選 (OPTIONAL)」應按照 RFC 2119 中的描述進行解釋。

介面

此 ERC 標準化了任意 ERC-5521 代幣之間推薦關係的授權介面。它本身並不創建、存儲或強制執行推薦關係。

就本 ERC 而言:

被推薦 NFT (referred NFT) 是指被指向的 NFT;

推薦 NFT (referring NFT) 是指尋求對被推薦 NFT 進行推薦的 NFT。

符合規範的實現必須公開以下介面:

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.4;

/// @title 具備授權功能的推薦 NFT
interface IAuthorizedReferral is ERC165 {
/// @notice 當推薦授權更新時觸發
event ReferralAuthorizationSet(
address indexed referredContract,
uint256 indexed referredTokenId,
address indexed authorizedContract,
uint256 authorizedTokenId,
bool authorized
);

/// @notice 檢查推薦是否已授權
/// @param referredContract 被推薦 NFT 的合約地址
/// @param referredTokenId 被推薦 NFT 的代幣 ID
/// @param authorizedContract 推薦 NFT 的合約地址
/// @param authorizedTokenId 推薦 NFT 的代幣 ID
function isReferralAuthorized(
address referredContract,
uint256 referredTokenId,
address authorizedContract,
uint256 authorizedTokenId
) external view returns (bool);

/// @notice 直接在鏈上設置推薦授權
/// @dev 僅限被推薦 NFT 的所有者調用
function setReferralAuthorization(
address referredContract,
uint256 referredTokenId,
address authorizedContract,
uint256 authorizedTokenId,
bool authorized
) external;

/// @notice 使用 EIP-191 離線簽名設置推薦授權
/// @dev 任何人都可以攜帶被推薦 NFT 所有者的有效簽名調用此方法
function setReferralAuthorization(
address referredContract,
uint256 referredTokenId,
address authorizedContract,
uint256 authorizedTokenId,
bytes calldata signature,
bool authorized
) external;

function supportsReferenceRoyalties() external view returns (bool);

}

授權語義

如果 isReferralAuthorized(referredContract, referredTokenId, referringContract, referringTokenId) 返回 true,則當前授權狀態表示該被推薦 NFT 允許指定的推薦 NFT 建立或聲明推薦關係,具體取決於使用該數據的應用程序或協議的邏輯。

此 ERC 不強制要求推薦關係如何具現化、顯示、解釋或強制執行。集成此 ERC 的應用程序必須定義如何使用授權狀態。

直接授權

對於直接授權,setReferralAuthorization(...) 的調用者必須是:

被推薦 NFT 的當前所有者;或

根據 ERC-5521 獲准管理該代幣的地址。

成功調用 setReferralAuthorization(...) 必須更新指定(被推薦 NFT,推薦 NFT)對的當前授權狀態,並且必須觸發 ReferralAuthorizationUpdated 事件。

基於簽名的授權

成功調用 setReferralAuthorizationBySig(...) 必須滿足以下所有條件:

恢復出的簽名者在執行時是被推薦 NFT 的當前所有者;

nonce 與被推薦 NFT 的當前 nonce 匹配;

當前區塊時間戳小於或等於截止日期 (deadline);

簽名對於提供的授權參數有效。

符合規範的實現必須在每次成功處理基於簽名的授權時,消耗或增加與該被推薦 NFT 關聯的 nonce。

成功調用 setReferralAuthorizationBySig(...) 必須更新指定(被推薦 NFT,推薦 NFT)對的當前授權狀態,並且必須觸發 ReferralAuthorizationUpdated 事件。

簽名訊息

離線授權簽名必須由 referredContract:referredTokenId 的當前所有者針對以下欄位產生:

referredContract (被推薦合約)

referredTokenId (被推薦代幣 ID)

referringContract (推薦合約)

referringTokenId (推薦代幣 ID)

authorized (是否授權)

nonce (隨機數)

deadline (截止日期)

chainId (鏈 ID)

verifyingContract (驗證合約)

一種相容 EIP-191 的訊息構造方式為:

keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
referredContract,
referredTokenId,
referringContract,
referringTokenId,
authorized,
nonce,
deadline,
chainId,
verifyingContract
)
)
)
);

nonce 用於防止重放,且每個被推薦 NFT 必須唯一;

deadline 限制簽名的有效期;

chainId 防止跨鏈重放;

verifyingContract 將簽名綁定到特定的實現合約。

所有權變更語義

此 ERC 下的授權代表被推薦 NFT 當前所有者的同意。

如果在提交基於簽名的授權之前,被推薦 NFT 的所有權發生變更,則該簽名必須被視為無效。

實現必須定義先前存儲的鏈上授權是否在轉移後繼續存在。為了互操作性,此 ERC 推薦被推薦 NFT 的轉移應使與該代幣關聯的先前授權失效,除非新所有者明確重新授權。

原理

此 ERC 刻意限制在授權功能。它不定義推薦關係的規範數據模型。這保持了介面的精簡,並允許此 ERC 在任意 ERC-5521 合約中使用,包括那些設計時未考慮推薦功能的現有集合。

獨立的授權介面很有用,因為它:

允許被推薦 NFT 的所有者端同意;

支持跨合約推薦場景;

可以作為獨立註冊表或輔助模組部署。

為直接授權和基於簽名的授權定義了分開的入口點。這使得介面比過載方法設計更容易實現、審計和集成。

referredContractreferringContract 都是明確的參數,以便可以在任意 ERC-5521 合約之間表達授權。

此 ERC 指定了相容 EIP-191 的簽名格式,以實現簡單性和廣泛的相容性。實現可以額外支持相容 EIP-712 的簽名,但必須清楚地記錄用於互操作性的規範摘要 (digest)。

回溯相容性

此 ERC 不需要對現有的 ERC-721 代幣合約進行任何修改。它可以作為獨立註冊表、中間件合約或輔助模組來實現。

此 ERC 不會取代 ERC-5521。相反,它標準化了一個外部授權層,可供實現推薦功能 NFT 的系統(包括無法修改的舊版 ERC-721 集合)使用。此類系統可以在接受或具現化推薦聲明之前諮詢此 ERC。

參考實現

參考實現可以將授權狀態維護為一個映射,其鍵值由以下組成:

被推薦合約地址;

被推薦代幣 ID;

推薦合約地址;

推薦代幣 ID。

參考實現可以為每個被推薦 NFT 維護一個 nonce,用於基於簽名的授權。

安全考量

必須通過針對每個被推薦 NFT 的 nonce 來強制執行簽名重放保護。

基於簽名的授權必須驗證恢復出的簽名者在執行時是被推薦 NFT 的當前所有者。

過期的簽名必須被拒絕。

如果在提交簽名授權之前被推薦 NFT 的所有權發生變更,則該簽名必須被視為無效。

由於任何地址都可以轉發有效的簽名,應用程序必須假設簽名提交可能會被搶先交易 (front-run)。

授權更新和撤銷可能會在內存池 (mempool) 中產生競爭。依賴授權狀態的應用程序應該依賴最終的鏈上狀態,而非僅僅依賴離線意圖。

如果存在多個實現此 ERC 的註冊表,應用程序必須定義它們信任哪一個,因為不同註冊表的授權狀態可能不同。

實現應考慮由無限制的授權記錄引起的存儲增長風險。

實現應使用安全的簽名恢復程序,並拒絕格式錯誤或模糊的簽名。

版權

透過 CC0 放棄版權及相關權利。

        1 則貼文 - 1 位參與者

        [閱讀完整主題](https://ethereum-magicians.org/t/erc-8234-referable-nfts-authorization/28258)

Ethereum Magicians

相關文章

其他收藏 · 0

收藏夾