newsence
歡迎

你的個人知識庫

從開放網路上發現值得讀的內容,收藏真正重要的。AI 為你摘要、串連、整理你所知道的一切。

可引用 NFT 授權標準分析

可引用 NFT 授權標準分析

Ethereum Magicians·大約 6 小時前

本 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

referringContract

referringTokenId

authorized

nonce

deadline

chainId

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。

參考實現

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

被推薦合約地址;

被推薦代幣 ID;

推薦合約地址;

推薦代幣 ID。

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

安全考量

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

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

過期的簽名必須被拒絕。

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

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

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

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

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

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

版權

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

        1 則貼文 - 1 位參與者

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