Factory工厂合约的实现-solidity实现智能合约教程(6)

这篇具有很好参考价值的文章主要介绍了Factory工厂合约的实现-solidity实现智能合约教程(6)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁

Factory工厂合约的实现-solidity实现智能合约教程(6)

1 介绍

何为工厂合约呢?相信有过编程经验的小伙伴都听说过工厂模式,此处的工厂合约其实和他的概念相似,该合约将承担创建其他合约的任务。在基于类的编程中,此模式的主要动机来自单一职责原则(一个类不需要知道如何创建其他类的实例),并且该模式为构造函数提供了一种抽象。

2 主要功能

为什么要用到工厂合约呢?

  1. 我们可以通过部署一个工厂合约来为供用户去创建N个功能相同的智能合约
  2. 可以节约一定的Gas费用,简化部署流程
  3. 提高合约的安全性

3 代码示例

// SPDX-License-Identifier:MIT;

pragma solidity ^0.8;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";


contract TestNFT is ERC721,ERC721Enumerable, ERC721URIStorage {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenId;

    constructor(string memory _contract_name,string memory _contract_symbol) ERC721(_contract_name,_contract_symbol){}

    function mint(address _recipient, string memory _tokenUrl) public returns(uint _mintTokenId){
        require(bytes(_tokenUrl).length > 0,"The _tokenUrl must be have");
        _tokenId.increment();
        uint newTokenId = _tokenId.current();
        _mint(_recipient, newTokenId);
        _setTokenURI(newTokenId, _tokenUrl);
        return newTokenId;
    }


    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

contract Factory{
    // TestNFT[] public addr;
    uint nowNum = 0;
    mapping(address => string) public ERC_project;
    mapping(string => address) public name_addr;
    mapping(uint => address) public addr;

    function createContract(string memory _name,string memory _symbol) public returns(address){
        address t_address;
         TestNFT t= new TestNFT(_name,_symbol);
         t_address = address(t);
         addr[nowNum] = t_address;
         ERC_project[t_address] = _name;
         name_addr[_name] = t_address;
        nowNum++;
        return t_address;
    }

    function getAddress(string memory _name) public view returns(address){
        return name_addr[_name];
    }

}

4 部署测试

4.1 部署Factory工厂合约

首先我们先部署要测试的工厂合约:

Factory工厂合约的实现-solidity实现智能合约教程(6)

4.2 利用工厂合约生成新的合约

利用我们工厂合约定义的createContract方法来创建一个新的ERC721合约:
Factory工厂合约的实现-solidity实现智能合约教程(6)
可以在返回值中查看到我们新创建的合约地址:0xb7b6b4aA81A6b0Dd20500cd19a485a95Fa206687,

其次我们也可以通过新创建的合约的名称来查询到我们新创建的合约的地址,可以看到两次查询到的地址是一致的。
Factory工厂合约的实现-solidity实现智能合约教程(6)

4.3 导入新创建的合约并验证

接下来我们把通过工厂合约创建的ERC721合约通过地址导入到remix中进行进一步的验证:
Factory工厂合约的实现-solidity实现智能合约教程(6)

可以查看其名称和我们定义的是一致的:
Factory工厂合约的实现-solidity实现智能合约教程(6)
到此我们几句实现了一个简单的Factory工厂合约,也实现了通过Factory工厂合约成功创建了一个ERC721合约。
当然你也可以去尝试调用新生成合约中的其他方法来进行验证,文章中就不再一一测试了。文章来源地址https://www.toymoban.com/news/detail-512393.html

到了这里,关于Factory工厂合约的实现-solidity实现智能合约教程(6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Solidity】智能合约案例——①食品溯源合约

    目录 一、合约源码分析: 二、合约整体流程:       1.部署合约       2.管理角色       3.食品信息管理       4.食品溯源管理         Producer.sol:生产者角色的管理合约,功能为:添加新的生产者地址、移除生产者地址、判断角色地址是否被授权         Di

    2024年02月08日
    浏览(51)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(47)
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码

    专栏:区块链技术开发 Truffle Box是一个开发工具,为Truffle生态系统中的开发人员提供了预构建

    2023年04月16日
    浏览(66)
  • 【Solidity】智能合约案例——③版权保护合约

    目录 一、合约源码分析: 二、合约整体流程:         1.部署合约:         2.添加实体:          3.查询实体         4.审核版权:         5.版权转让         Copyright.sol:主合约,定义了版权局的实体,功能为:审核版权         Opus.sol:定义两个实体:作者和作

    2024年02月04日
    浏览(47)
  • 智能合约 Solidity – 构造函数

    构造函数是任何面向对象的编程语言中的一种特殊方法,每当初始化类的对象时都会调用它。Solidity 则完全不同,Solidity 在智能合约内部提供了一个构造函数声明,它只在合约部署时调用一次,用于初始化合约状态。如果没有明确定义的构造函数,则编译器会创建默认构造函

    2024年02月11日
    浏览(40)
  • Solidity 智能合约入门

    将一个数据放置在链上 我们对代码进行逐行分析,首先第一行 第一行表明此段代码是被GPL-3.0所授权。默认情况下,在发布源代码时加入机器可读许可证说明是很重要的。 GPL(GNU General Public License Versions) GPL协议一般还可以分为GPL2.0和GPL3.0两种,而GPL3.0是更新一代的开源标准

    2024年02月02日
    浏览(44)
  • solidity:智能合约结构介绍

    合约结构介绍 1.SPDX 版权声明 bytecode metadata 介绍 2.pragma solidity 版本限制 3.contract 4.import 导入声明 5.interface: 接口 6.library:库合约 第 1 行 // SPDX-License-Identifier: MIT 就是合约的版权声明。其中 SPDX-License-Identifier (SPDX 许可标示) 是标注当前的智能合约采用什么样的对外开放标

    2023年04月08日
    浏览(44)
  • solidity开发智能合约

    起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity文档:区块链技术-智能合约Solidity编程语言 solidity官方文档: https://solidity-cn.readthedocs.io/

    2023年04月08日
    浏览(81)
  • 【Solidity】智能合约案例——②供应链金融合约

    目录 一、合约源码分析: 二、合约整体流程:         1.部署合约:         2.添加实体         3.发送交易存证            ①.银行向公司交易(公司向银行提供交易存证)            ②.公司向银行交易(银行向公司提供交易存证)            ③.公司向公司交易

    2024年02月06日
    浏览(38)
  • Solidity contract智能合约概览

    Contracts in Solidity are similar to classes in object-oriented languages. They contain persistent data in state variables, and functions that can modify these variables. Calling a function on a different contract (instance) will perform an EVM function call and thus switch the context such that state variables in the calling contract are inaccessible. A con

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包