Web3入门—去中心化交易所的部署
一、ERC20代币合约部署
本次代币合约部署过程参考https://www.wtf.academy/en/course/solidity103/ERC20
ERC20是什么
ERC20是以太坊上的一种代币标准,由Vitalik Buterin于2025年11月提出。它实现了代币转移的基本逻辑:
- 账户余额
- 转移
- 批准转账
- 代币总供应量
- 令牌信息(optional):名称、符号、小数
基于此衍生的IERC20规定了代币需要实现的功能和事件,一种接口合约。定义接口的原因在于ERC20代币拥有通用的函数名和输入输出函数;在接口函数中只需要定义函数名和输出输出参数,无需关心函数内部的具体实现方式;因此函数分为内部实现和外部接口两部分,重点在于接口之间共享数据的实现和约定。这就是为什么在合约的实际部署过程之中通常需要ERC20.sol和IERC20.sol来实现一个合约。
Solidity 作为当前社区中一种用于编写以太坊虚拟机 (EVM) 智能合约的主流编程语言,能够帮助我们快速完成本次部署;不过在本次正式开始编写之前,我们还需了解一下OpenZeppelin—覆盖从代币实现到安全工具的Solidity开发标准工具库,其模块化设计有助于我们快速实现安全、标准化的智能合约,同时减少开发和审计的成本。通过合理使用OpenZepplin的模块,可以显著提高合约的安全性。
编写2个ERC20代币合约
本文中构建的两款具备差异化安全特性的ERC20标准代币MacdonaldA与KFCB,核心目标在于遵循ERC20代币基础规范的同时,针对区块链交易中常见的安全风险引入针对性防护机制。合约开发严格遵守Solidity0.8.20版本语法规范,利用语言内置的溢检查特性替代传统SafeMath库,在精简代码体量的同时保障基础运算的安全准确。
两款代币均通过状态变量完成对核心数据的存储与管理:基础层面,继承自ERC20标准库的内置状态变量(如_balances映射、_totalSupply总量)实现账户余额与代币总供给的记录,_allowance映射则支持代币授权转账功能;在扩展层面MacdonaldA通过_blacklisted映射维护合规黑名单,以MAX_TRANSFER_AMOUNT常量限制单笔转账上限,KFCB通过_timelocks映射为指定账户设置转账时间锁,两类扩展状态变量均与核心交易逻辑深度耦合,形成场景化安全防护。合约构造函数作为初始化入口完成对代币核心信息的定义并初始攻击分配:通过调用ERC20父类构造函数传入代币名称与符号,明确代币身份标识;同时调用_mint函数向合约部署者地址铸造100万枚代币(含18位小数,符合区块链代币通用精度标准)并自动触发ERC20标准的Transfer事件,确保初始分配过程可追溯。
整体交易处理逻辑在继承ERC20标准的_update函数基础上进行安全增强:MacdonaldA重写该函数加入黑名单校验、暂停状态检查及大额转账限制,形成“三重防护”;KFCB通过时间锁校验机制限制处于锁定期的账户发起转账,同时集成ReentrancyGuard库的nonReentrant修饰符,抵御重入攻击。所有安全相关操作均依靠Ownable库实现权限控制,仅合约所有者可执行,确保管理操作的合规性与安全性,具体代码文件已附于附件1,2 。
应用Remix编译合约
Remix IDE(Remix Ethereum IDE)——以太坊基金会官方维护的开源在线集成开发环境,专为智能合约开发、测试与部署设计,无需本地配置开发环境即可完成从 Solidity 代码编写到区块链部署的全流程操作。考虑到本次实践中的任务规模及便捷程度,使用Remix可以帮助我们节省环境配置时间,其内置的SOlidity编译器也能一站式完成对于我们编写的代币合约的编译、部署与功能测试,因此我们本文中后续有关Solidtiy开发的工作都将在其中进行。
在IDE中完成两份代币合约的编写后,Ctrl+S保存并选择编译器左侧”SOlidity Compiler”中进行编译配置,在”Compiler“下拉菜单中选择0.8.20 版本(Remix将自动加载从Github中加载OpenZepplin合约),完成后分别对两个文件点击 “Solidity Compiler”,出现绿色对勾标志即表示成功编译。
代币合约部署
在以太坊及兼容EVM的区块链中,部署智能合约的本质是向区块两网络中提交一笔【特殊交易】,而钱包是完成这笔交易的核心身份凭证与操作载体。钱包(以MetaMask为例)的核心作用是安全管理私钥——它不会直接暴露私钥,而是通过加密存储、授权签名等方式向区块链节点确认交易确实由地址所有者发起。
部署合约的流程可视为:编译合约—生成字节码—Remix向Metamask发起部署请求—Metamask通过私钥对请求进行签名并广播至区块链网络—节点验证签名合法后执行合约部署逻辑—生成合约地址。
而在合约的部署过程中,考虑到节点的计算、存储、带宽资源等成本,需要消耗对应的Gas(以ETH为单位),通过支付ETH作为Gas费,向提供计算资源的节点支付报酬,确保合约部署能被全网确认。
在Chorme扩展中安装”Metamask”插件,登录后显示界面,此时钱包内ETH数为0,需要通过复制以太坊钱包地址字符串,进行交易或获取;
随后我们在网络中检索faucet发放网站,发现利用谷歌云[https://cloud.google.com/application/web3/faucet/ethereum/sepolia]可以通过登录账号,填写钱包地址领取0.05 ETH/d;
返回钱包绑定sepolia后,发现此时ETH已经补充,鉴于合约部署通常gas开销较低,因此基于本次实践的项目体量,可以基于此直接先开展部署。
返回Remix编译器中,点击 “Deploy & run transactions”,环境选择”Injected Provider - MetaMask”,账户填写为对应的以太坊钱包地址,合约选择后点击”Deploy&Verify“开始部署,待Metamask确认完成后,Remix控制台会开始生成交易哈希并等待区块确认,此时**务必记录下每个合约的地址(contact address)**;(图中仅以一个部署为例)
[!CAUTION]
注意在钱包选择环节记得切换网络,因为它会自动默认连到主网上,需要手动切换到Sepolia testnet,部署成功后务必在命令行中点击
view on Etherscan不然之后那个官网会不认你,只能重新部署劳财伤神
待合约部署成功后,可在Metamask中查看gas消耗详情,并通过合约地址导入代币
利用Etherscan分别对两个代币合约进行查询:
二、去中心化交易所合约(DEX)
DEX是基于区块链智能合约实现代币点对点交易的金融协议,其核心优势在于无需第三方托管资产、交易透明可追溯,但原生存在前置交易、价格操纵、流动性过度消耗等风险,需通过机制设计弥补链上公开交易与延迟带来的安全漏洞。
1) 因为链上交易的公开可查,套利者便可通过高Gas费插队(MEV),在用户交易前后插入同向/反向交易(三明治攻击),从而利用价格波动获利,其攻击背后本质是”交易信息提前泄露与区块链打包顺序可控“。因此,在基础dex合约上,通过引入”Commit-Reveal”机制隔离交易信息,哈希函数抗碰撞性确保承诺不可伪造,延迟期打破套利者信息优势。具体实现为(完整代码见附件3):
承诺阶段:
用户提交哈希
commithash=keccak256(abi.encodePacked(secret,toeknIn,amountIn,minAmountOut,deadline))(唯一性),将交易细节隐藏;揭示阶段:
1min延迟后,用户提交secret验证承诺,执行交易;核心约束在于
block.timestamp≥commitTime+1min(延迟执行)。
2) 也因链上交易存在延迟,因此瞬时大额交易可操纵池内价格,导致用户实际收益低于预期(滑点),这其中的本质在于”CPMM模型下储备金瞬间失衡”,因此通过滑点保护限制最小收益,TWAP通过时间加权平滑价格抵御瞬时操纵;核心公式基于CPMM与加权平均算法,具体实现方式为
滑点保护:
交易时检验amountOut≥minAmountOut,amountOut由CPMM公式计算得到:
$$
amountOut=(amountIn×(1-fee)×reverseOut)/(reverseIn+amountIn×(1-fee))(fee为交易费率,reverseIn/reverseOut为池内储备金)
$$
- TWAP检验:
存储10条历史价格,计算平均加权,权重与时间正相关。约束为|currentPrice-TWAP|/TWAP≤5%。
[!NOTE]
CPMM(恒定乘积做市商模型):是DEX中自动做市商(AMM)的核心定价机制,公式为x × y = k,其中x和y是流动性池中两种代币的数量,k是定值。现为主流DEX的基础定价模型;
价格由储备金比例决定,即
$$
price_{\frac{A}{B}}=\frac{y}{x}\space \space
$$$$
amount_{out}=\frac{(amount_{in}×y)}{(x+amount_{in})}(交易计算)
$$TWAP(时间加权平均价格),加权平均算法在时间维度上的应用。
3)短期的高频套利交易反复消耗池内流动性,导致储备金失衡,交易滑点扩大,其本质是”套利者低成本占用流动性资源“。通过差异化费率提高高频套利成本,经济激励引导长期交易,核心是”行为-费率“联动机制。其约束为fee≤2%;
- 费率公式:
$$
fee=BASE_{FEE}+penalty(BASE_{FEE}=30/10000=0.3%)
$$
- 惩罚规则:24小时交易≥3次,fee提升至1%;两次交易间隔<5min,penalty额外加0.2%。
4)LP代币计算:
首次添加:L = √(amountA × amountB)(初始流动性);
非首次:L = min(amountA × totalSupply/reverseA,amountB × totalSupply/reverseB) (按比例分配,避免失衡。
基于以上,我们部署一个面向区块链生态的安全增强型去中心化交易所(DEX)智能合约,基于Uniswap V2架构开发,针对当前DEX生态中以上列出的风险集成多重安全机制,实现交易安全性与市场效率的平衡。合约以Solidity 0.8.20为开发语言,依托OpenZeppelin安全组件构建权限控制,防重入等安全层,为去中心化交易提供可验证的安全保障。在部署阶段输入前文中部署的两个代币合约地址,之后顺利生成。
利用DEX进行代币交换
[!TIP]
进行此步操作前需确保之前的操作都顺利完成,
- Metamask成功连接到DEX合约所在网络
- 测试所需ETH足够
- 代币合约在初始部署时需拥有至少10个代币A和一定数量的代币B,以用于添加流动性。
授权DEX
在Etherscan中搜索代币A的合约地址,进入代币A的合约界面,点击
contact→write contact→连接钱包; 成功连接后,点击
approve函数,输入参数:spender填入DEX合约地址,amount填入10个代币A对应的数值,完成后点击write即钱包确认交易上链,对代币B重复此操作。
在Remix部署界面找到preComputerCommitmentHash,得到commitmentHash,
根据deadline(就是时间戳,可从在线网站查看,但由于合约机制需要加预先时间)和commitimenthash,找到CommitSwap函数入口,将得到的结果输入后,可transact,完成初步的Cmmit端,需要保留得到的结果值以备后患;
解锁交易,DEX扣取tokenA,发放给tokenB,完成交换。在revealSwap函数端,输入先前的secret…(与步骤1保持一致),成功上链后,在Etherscan上查看,交易成功。
三、前端DAPP接入
当我们全部完成之后,最后选择已部署合约Balance右侧小按钮可快速部署一个个人网站,按照要求输入DEX合约地址,用户名,在compiler页面找到合约的abi,之后选择自己的域名,添加邮箱和密码就成功部署好了!(https://kerzyaha.surge.sh/)
四、回顾
在这次实践过程中我多次出现了资源错配以及权限调整,同时对于DEX合约在Etherscan中无法写入的麻烦,在教导下才发现可以在Remix中调用调整,同时通过这次实践是我对区块链入门了解的生动实践,先完成,再完美,脚踏实地,毛躁的性格是做不好事情的反而会把事情拖得效率低下,产出一般;在以后的学习生活中也要积极向组内同学学习,认真高效才是最省力的聪明办法!
















