shaneson.eth

Posted on Jun 18, 2022Read on Mirror.xyz

合约工厂模式的若干实现方法

Factory模式应该是合约上非常常用的设计模式,设计到同质化化的“池子”,“交易对”都会用到Factory模式。这里我就用几个项目作为用例,收录一下这些Factory模式的具体实现,如果以后需要用到也可作为”模版“参考。

Uniswap - Eip1014

Uniswap是依赖Eip-1014来实现工厂方法,利用CREATE2 这个的新操作码,不同于 CREATE,它使用新的方式来计算合约地址,让生成的合约地址更具有可控性。通过 CREATE2 可以延伸出很多有意思的玩法,在 CTF 中最常见的就是利用这种可控性,在同一个地址先后部署字节码完全不同的合约。具体可以看我下面的这篇文章

https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/7UVQCrp39UHf07G_pOpANk1vY8DbXIWUeb50Qmxyko8

MISO/Proxy Factory - EIP 1167

Eip 1167是将已部署的合约进行数据clone到另外一个新合约上实现的。注意的是,这个方法是在数据层,通过内嵌solidity代码直接clone数据到新合约上。这个也是Factory工厂模式常用的方式。一般会先把template部署到链上,这方法可以迁移合约数据。

https://blog.logrocket.com/cloning-solidity-smart-contracts-factory-pattern/

Curve Solidity -- New

在Dfx.finance上的Curve Factory上(已通过审计),用的方法是new关键字。缺点:这方法比较耗gas。优点是最简单。

总结

暂时收录3种方法,如果还遇到了新的方法就继续补充。