首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Solidity:从Marketplace合同中调用NFT合同的函数,并且只有Marketplace有权调用它

Solidity:从Marketplace合同中调用NFT合同的函数,并且只有Marketplace有权调用它
EN

Stack Overflow用户
提问于 2022-06-13 11:17:03
回答 2查看 182关注 0票数 1

我在做NFT市场,而且每次NFT被出售时,我都要实现图像洗牌。市场有购买NFT的功能,所以我们有参考NFT智能契约。当调用函数buy()时,它将调用NFT智能契约中的transfer()和Su显()。但是我只想让市场调用Su显(),所以我决定添加一个要求,检查正在调用的地址是否等于marketplace地址。问题是,对于部署市场,我需要NFT地址,对于部署NFT契约,我也需要市场地址。我怎么才能解决这个问题?是智能契约的逻辑问题,还是用这种方式解决的方法?谢谢你!!

智能契约逻辑图

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-13 11:45:13

部署后,可以使用setter函数设置依赖地址。

示例:

代码语言:javascript
运行
复制
contract NFT {
    address marketplace;

    function setMarketplace(address _marketplace) public onlyOwner {
        marketplace = _marketplace;
    }
}
代码语言:javascript
运行
复制
contract Marketplace {
    address nft;

    function setNft(address _nft) public onlyOwner {
        nft = _nft;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-06-13 12:01:36

我写了一个简单的框架,应该对你有帮助。:)

代码语言:javascript
运行
复制
 //SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.12;


contract NFT {

    //Ensure that only the owner can call important functions
    address owner; 
    

    constructor() public {
        owner = msg.sender;
    }

    mapping (address => bool) public _onlyIfMarketplace;

    function mint() public {
        require(owner == msg.sender);
    }

    function transfer() public {

    }


    function shuffle() public {
        require(_onlyIfMarketplace[msg.sender] == true);
    }

    //You can always add an address that can call this function, 
    //and you can also write another one to remove the address which can call this function
    function setMarketplaceContract(address MarketplaceContract) public {
        require(owner == msg.sender);
        _onlyIfMarketplace[MarketplaceContract] = true;
    }
}


contract Marketplace {

    //Call NFT contract
    NFT nftContract; 

     //Ensure that only the owner can call important functions
    address owner; 
   

    constructor(address nftAddress) public {
        owner = msg.sender;
        nftContract = NFT(nftAddress);
    }

    // You can change the NFT contract you want to call at any time
    function changeNFTAddress(address newNFTAddress) public {
        require(owner == msg.sender);
        nftContract = NFT(newNFTAddress);
    }

    //Call the function of NFT contract
    function buy() public {
        nftContract.transfer();
        nftContract.shuffle();
    }

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

https://stackoverflow.com/questions/72601947

复制
相关文章

相似问题

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