ERC-721 - 如何避免可更新的 tokenURI 成為令牌信任的漏洞?
我知道可以使用 tokenURI 欄位為返回給定令牌的元數據的端點添加地址。假設我們創建了一個獨特的資產
tokenId = "1" tokenURI = "https://api.endpoint.com/1"
假設 tokenId “1” 指的是有價值的資產 $ 500. However, there is also a asset with tokenId “2” which is valued $ 2000. 假設有一個加密市場,允許資產所有者交易他們的加密收藏品並使用 tokenURI 接收元數據。
我知道 tokenURI 可以更新。
什麼會阻礙 tokenId “1” 的持有者將他的 tokenURI 更新為
tokenId = "1" tokenURI = "https://api.endpoint.com/2"
是什麼阻礙了市場展示更有價值的相關加密收藏品?為什麼讓令牌的所有者可以更新 tokenURI 是有意義的?
因為合約不允許持有者更新他們的代幣 URI。
0xcert 框架(ERC-721 的一種實現)分離了創建 NFT 和更改其 URI 的權限。
我能想到的第一個解決方案是在變數後面加上
tokenURI
關鍵字constant
orimmutable
。這將確保在部署合約後永遠不會更改資產的 URL。但是,這引發了一個擔憂,即一旦部署合約,您將無法更改 URI,即使在真實情況下,例如您將資產轉移到不同的 URL 地址並希望更新
tokenURI
指向新地址的 URI。如果你的合約不是託管的(合約的所有權沒有放棄)並且實際上有一個受信任的合約所有者,這個問題就可以解決。因此,如果您的合約有一個受信任的合約所有者,您可以引入一個新的函式修飾符,例如, 用於以下列方式
onlyOwner
更改的函式:tokenURI
address public owner; constructor() { owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner); _; } function changeAssetURI(string memory newURI) private onlyOwner { tokenURI = newURI; }
如果上述所有要點都對您的特定案例沒有幫助,那麼我能想到的唯一可行的解決方案是使用受信任的 Oracle(例如 ChainLink)從公共 API查詢
tokenURI
給定的。tokenID
這將要求您首先創建一個返回tokenURI
指定的公共 APItokenId
。由於 API 是公開的,它將阻止不法分子在拍賣中欺騙客戶。希望能幫助到你。謝謝你。