首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ERC-721 -如何避免可更新的tokenURI成为令牌信任的漏洞?

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

Ethereum用户
提问于 2019-11-12 21:12:40
回答 2查看 626关注 0票数 0

据我所知,可以使用tokenURI字段为返回给定令牌的元数据的端点添加地址。让我们想象一下,我们创建了一个独特的资产

代码语言:javascript
复制
tokenId = "1"
tokenURI = "https://api.endpoint.com/1" 

假设tokenId "1“指的是价值500美元的资产。然而,还有一项tokenId "2“的资产,价值为2000美元。让我们假设有一个密码市场,让资产所有者交易他们的密码收藏品,并使用tokenURI接收元数据。

我知道tokenURI可以更新。

什么会阻碍tokenId "1“的持有者将他的tokenURI更新为

代码语言:javascript
复制
tokenId = "1"
tokenURI = "https://api.endpoint.com/2" 

是什么阻碍了市场展示更有价值的相关密码收藏呢?为什么让令牌的所有者有可能更新tokenURI是有意义的呢?

EN

回答 2

Ethereum用户

发布于 2021-06-04 01:55:26

我能想到的第一个解决方案是在变量tokenURI后面加上关键字constantimmutable。这将确保一旦部署了契约,资产的URL就不会被更改。

然而,这引起了一种担忧,即一旦部署契约,您将无法更改URI,即使是在真正的情况下,比如您将资产转移到不同的tokenURI地址,并希望更新指向新地址的URI。

如果您的合同不是托管的(合同的所有权不被放弃),并且实际上有一个可信的合同所有者,那么这个问题就可以解决。因此,如果您的合同有可信的合同所有者,您可以为一个以下列方式更改tokenURI的函数引入一个新的函数修饰符,如onlyOwner

代码语言:javascript
复制
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中查询给定tokenIDtokenURI。这将要求您首先创建一个为指定的tokenURI返回tokenId的公共API。由于空气污染指数是公开的,它可以防止不法分子在拍卖中欺骗顾客。

希望能帮上忙。谢谢。

票数 1
EN

Ethereum用户

发布于 2019-11-13 22:07:00

因为合同不允许持有者更新他们的令牌URI。

0xcert框架(ERC-721的一个实现)分离了创建NFT和更改URI的权限。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/77429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档