主页 > imtoken中国版 > Solidity智能合约工厂模式--如何用智能合约部署智能合约

Solidity智能合约工厂模式--如何用智能合约部署智能合约

imtoken中国版 2023-03-31 06:35:10

我个人使用的是以太坊平台,solidity写的智能合约,solidity版本号是0.4.17

部署智能合约暴露的问题

项目在部署智能合约时,会暴露智能合约的API和Bytecode,通过API可以获取项目的核心功能代码,存在一定的安全风险。

怎么解决

如果将核心功能所在的智能合约封装成另一个智能合约,这个智能合约只有核心智能合约的构造函数,没有核心功能,这个问题就可以顺利解决。 这个思路也是工厂模式。

工厂模式

以太坊智能合约代码_以太坊智能合约语言_以太坊智能合约部署

工厂模式(Factory Pattern)是Java中最常用的设计模式之一。 这种类型的设计模式是一种创建模式,它提供了一种创建对象的最佳方式。

在工厂模式下,我们在创建对象时不向客户端暴露创建逻辑以太坊智能合约部署,而是通过一个通用的接口指向新创建的对象

代码思路

将核心智能合约的构造函数封装到工厂工厂中,我们只需要调用工厂的deploy()函数,并传递相应的参数以太坊智能合约部署,调用核心智能合约的构造函数,并将其存入map; 声明getAddr()获取到智能合约当前部署的地址

//使用智能合约部署智能合约
contract FundingFactory{//工厂

以太坊智能合约部署_以太坊智能合约代码_以太坊智能合约语言

//存储已经部署的智能合约的地址 uint public numFundings = 0; mapping(uint => address) addrfundings; function deploy(string _projectName, uint _supporMoney, uint _goalMoney)public{ addrfundings[numFundings] = new Funding(_projectName, _supporMoney, _goalMoney, msg.sender); numFundings++;

以太坊智能合约部署_以太坊智能合约语言_以太坊智能合约代码

} function getAddr()public view returns(address){//拿到本次部署的智能合约地址 return addrfundings[numFundings - 1]; } }

以太坊智能合约代码_以太坊智能合约语言_以太坊智能合约部署

contract Funding{//核心智能合约 //Funding智能合约构造函数 function Funding(string _projectName, uint _supporMoney, uint _goalMoney, address _address) public{ manager = _address; projectName = _projectName; supportMoney = _supporMoney;

以太坊智能合约部署_以太坊智能合约语言_以太坊智能合约代码

goalMoney = _goalMoney; endTime = now + 4 weeks; } }

我使用Node JS的web3.js与以太坊交互,预先部署一个工厂智能合约,通过方法调用工厂中的deploy()和getAddr()函数,在编译器上完成智能合约的部署