最近在看智能合约的工厂模式,工厂模式明白,但部署后的合约总是工厂中的方法,久久不明白是怎么回事,今天在学习课程时终于解决了这个问题。

首先来看一个工厂模式的例子,最近总是去做核酸,因此写一个防疫站点工厂吧。

1、一个防疫站点合约,里面记录站点信息与方法

2、一个防疫站点工厂合约,用于创建防疫站点或注销防疫站点方法(例子中暂时只有创建没有注销)

以下只是简单示例,没有过多校验与逻辑: 

备注:编写、编译、部署合约都是在Remix中完成。

// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;

//站点
contract Station {
    //站点名称
    string private name;
    //站点位置
    string addr;
    //站点人员数量
    uint16 count;

    //构造函数
    constructor(string memory _name, string memory _addr, uint16 _count) {
        name = _name;
        addr = _addr;
        count = _count;
    }

    function getStationInfo() public view returns (string memory, string memory, uint16) {
        return (name, addr, count);
    }
}

//站点工厂
contract StationFactory {
    //状态变量 - 存储所有已创建的站点
    address[] stations;

    // 创建站点工厂
    function createStation(string memory _name, string memory _addr, uint16 _count) external {
        Station station = new Station(_name, _addr, _count);
        stations.push(address(station));
    }

    //获取所有站点工厂
    function getStationAll() external view returns (address[] memory) {
        return stations;
    }
}

部署合约 - 选择StationFactory合约部署:

部署完成后,调用方法“createStation”增加一个防疫站点,然后调用方法“getStationAll”查看新增防疫站点的合约地址:

拷贝新增防疫站点的合约地址到At Address中查看合约:

我的问题来了,查看新合约地址内容,发现还是工厂中的方法,而没有出现防疫站点中的方法,久久思考这是为什么,一直没想明白,后来在老师的教程中发现需要选择防疫站点合约(因为默认是工厂合约,所以一直显示工厂合约中的方法)。

选择合约“Station”, 再点击“At Address”,终于出来梦寐已久的防疫站点合约了,查看下在工厂合约中增加的防疫站点,没错,就是它了。

当然我们可以通过工厂合约添加更多的防疫站点,每个防疫站点都有自己的合约地址,可以通过合约地址进行维护自己的防疫站点(当然也需要在防疫站点中增加一些方法进行维护,比较检测时间,检测结果等等)。 

完结。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐