Go-Ethereum

ERC-721 - 如何避免可更新的 tokenURI 成為令牌信任的漏洞?

  • March 6, 2022

我知道可以使用 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關鍵字constantor immutable。這將確保在部署合約後永遠不會更改資產的 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指定的公共 API tokenId。由於 API 是公開的,它將阻止不法分子在拍賣中欺騙客戶。

希望能幫助到你。謝謝你。

引用自:https://ethereum.stackexchange.com/questions/77429