跳至主要内容

實驗日誌:從零到一,構建可雙向操作的 ETH 抵押穩定幣協議

· 閱讀時間約 9 分鐘
w0x7ce
MySelf

发布于 2025-07-20 23:50:19(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 6000 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

實验日:零到一,横建可雙向操作的ETH抵押穩定協 vex7ce EI V1ajero 2625年7月20日 23:50 广东 本置验旨在磺建亚验罐一個功能完的、基於以太坊(Sepol1a别试编)的抵挥定赔協。 支持用户抵押ETH以造疆定(NSC),允許用户操逼MSC以素回其抵押的ETH,本设計的 核心是引入了遇度抵押(156%)和健康因子計算,作高基碰的凰险管理機制此文檀記了合约编 离到最終集成测试的完整流程。

一、系统蓝图 (System Blueprint)

本協读由雨個核心智能合的模成,共同宽现其核心功能:

1.HyStableCain.sol(MSC):作為协髮行的福定资。

遵循ERC2θ 標军,代號MSC. 。内置mint()(端造)和 burn()(第跌)方法。 。為碰保货带行權的唯一性與安全性,道雨個核心權限將通通Ownable模式,舞家授予端 核心引辈合的 Engine.sal

1.Engine.sol:作為的核心通畅引擎

抵押品管理:负责接收、镇定和解還用户的ETH括押品。 通度抵押制:强制软行159%的抵押率。即用户抵押倡值$156的资產,最多可锦造 假值$109的硬定常。 。资產造贝回:

  • 造(Deposit &Mint):依據用户存人的ETH和Chainlink提供的置時情

格,計算造相感款量的MSC。

  • 回(Redeem&Burn):接收用户际的MSC,轨行销级,亚按實時候格計算、返

退封愿價值的ETH 凤隐监控:提供getHealthFactor 視圆函数,允許外部查询任一盒位的健康状况。 核心交互流程量:

  • 警流程:

用户->送 ETH-> Engine.sol oEngine.sol->前 ChainLink价格 Eng1ne.sol->融馏通度抵押,計算可造数量 Engine.sol->MyStableCoin.mint()-> 爱送 MSC 至用户地址

  • 腹回流程:

o用-> MyStableCoin.approve[) 授槽->Engine.sol 用月-> Engine.sol.redeen() o Engine.sol -> MyStabteCoin.burnFrom() 级用的 MSC oEnginc.sol>叠物 Chainlink俱格,計算愿遣 ETH->豫送ETH 至月乒地址

二、榕资產:MyStableCoin.sol

使用OpenZeppelin ERCz0Burnable 撰展以震现掌化的功能。 源代硼MyStableCoin.sol: // SPDx-License-Identifier: NIT pragna solidity ^0.8.20; inport "(openzeppelin/cantracts/token/ERcza/extensions/ERczoBurnable.5: inport "eopenzeppelin/contracts/access/ownable sol";

  • @title Mystablecoin

  • @dev 一可橘造、可鳞毁的 ERC29 代,由唯一的 Ovner [Engine.sol} 控割

  • /

contract MyStableCoin is ERcza, Ownable, ERczoBurnable { //横造函数,初始化代磨名额、符號和初始Owner constructor() ERC2e(My Stable Coin", “MSc) Ownable(msg.sender) { @dev 播造新案。只能由 Owner 调用。 / functian mint (address to, uint256 amount) public only0wner { _mint(to, onount);

部鲁後得到NyStableCoin合的地址8x7fAa36FD4295569752C192d69eB49F3f:5A45dD

三、榕通:Engine.sol

封装了所有核心繁移逼畅,包括抵押、造、照回和凰险計算。 源代疆 Engine.sol: // SPDX-LIicense-Identifier: NIT pragna solidity ^0.8.28; 1nport "@chainlink/contracts/src/vo.8/interfaces/Aggregatorv3Interface inport "./Nystablecoin.sal"; contract Engine { 就影婴量 /7 Aggregatorv3Interface internal priceFeed; My5tableCoin public mscToken; uint256 publlc constant CoLLATERALIZATIoN_RATI0 - 150; uintz56 private constant FEED_PRECI5I0N = le8; napping(address => uint256) public debtInMSC; 事件 // event CollateralRedeemed(address indexed user, uint256 mscAmount, 造函数 constructor(address _priceFeedAddress, address _mscTokenAddress) { priceFeed = Aggregatorv3Interfacef_priceFeedAddress) : mscToken = MyStableCoin(_mscTokenAddress); function depositAndMint() public payable { require(nsg.value > 0, Hust deposit ETH); uint256 ethPrice = getEthPriceInusd(): uintz56 collateralvalueInUsd = (msg.value * ethPrice) / FED_P ulnt256 anountToMint - (collateralvalueInUsd * 109) / CoLLATER require(anountToMint > 0, Deposit not enough to mint any MSC" collateral [nsg.sender] += msg.value; mscToken.nint (msg sender, amountToMint) : emit CollateralDeposited(nsg.sender, nsg.value); function redeenAndBurn{uint256 _mscAnountToBurn) puhlic { require(_nscAnountToBurn > θ, "Must burn nore than θ HSC); require(debtInMSC[msg sender] >= _mscAnountToBurn, *Cannot bun uint256 ethPrice = getEthPriceInusd(); ulnt256 ethAnountToRedeen - (_mscAnountToBurn * FEED_PRECISION require(collateral[msg-sender] >= ethAnountToRedeem, *Not enou deht InMSC[nsg sender] -= _nscAmountToBurn; collateral[nsg sender] -= ethAmountToRedeen; 4 2 mscTaken burnFrom{msg sender, _mscAnountToBurn) : 13 (bool success, ) = payable(msg.sender) -call{value: ethAnountTol require(success, ETH transfer failed); emit CollateralRedeemed(msg sender, _nscAnountToBurn, ethAmoun 辅助/视盈功能 // functian getEthPrireInusd() public view returns [uint256) { )= priceFccd.latestRoundData[); (, Int price, . ) = priceFeed. LatestRoundData(); return uint(price): function getHealthFactor(address _user) public vlew returns (uint2. uint256 collateralEth = collateral[_user]; uintz56 dcbt = debtInNsC[_user] : 1f (debt == 0) return type(uint256) .nax; uint256 ethPrice = getEthPriceInusd(): uintz56 collateralvalucInUsd = (collateralEth * ethPricc) / FE uint256 debtvalueInUsd - debt; return (collateralValueInUsd + PRECISIoN) / debtvalueInUsd;

部暑後得到Engine合地址Bx735Da4333D1fHef19760F4BA

四、部署、速接與授權(服格按序執行)

此璟颜包含整信熔能购正常工作的開键步器。必须最格按照期序操作和胎罐。

4.1部署 MyStableCoin.sol

1.在 Remix 中,還摄 MyStableCain.sol 合的。

2.贴聚“Deplay”进行部墨。

3.起地址:部署成功後,在“DepLoyed Contracts”区境搜频合的的地址,稍之

為MSC_ADDRESS,

4.2够署 Engine.sol

1,在 Rcmix 中,通捶Enginc.sol 合的。 2,在“DepLoy”按钮无的桶造函数参数输入框中,按顺序填意: _priceFeedAddress 地 ( 0x694AA17693572150E4FAC081bf1f309aDC325306

  • (此為Sepolia 密试耀的ETH/USD價格数螺源)

°_nsCTokenAddrcss (地址):粘胎上一步能操的 MSC_ADDRESS.

1.點整“Deploy”进行邮署。

2.靶藜地址:部署成功後,夜 Engine 合的的地址,属之為 ENGINE_ADDRESS.

4.3罐授:移交所有

  • 原因明:此步骤是整四的命眠。HyStableCain的mint 函微受onlyOuner 保

强。為了 Engine 合的施成功造代带,Engine 合的自身必须成微 My5tableCoin 合的的owncr.

  • 款行操作:

1.回到 Renix 中巴部署的 MyStableCoin 合的宽例。

2.找列 transferDwnership 函数。

3,在旁遗的输入框中,粘贴ENGINE_ADDRES5。

4.脂聚 transferDwnership 按钮,亚在 MetaMask 中殖裂交易。

4.4强制瞻盟:碰留授權成功

  • 目的:在进行下一步测试前,必浪随保權限已正硬設置。

  • 款行操作:

1.等待 transferDanership 交易成功。

2.在MyStableCoin 合约宽例上,贴owner 视面函数技翅。

3.核對结果:返四的地址必渠兴 ENGINE_ADDRESS 完全一致。

4.如果地址不一致,請不要逛行下一步,重新软行4.3步骤。

五、系统集成测腻

在完成业睡所有部署和授壁步履很,需始进行功能测试。 潮用例1:存款與警(Deposit&Hint)

1.定位到已部署的 Engine 合的實例。

2.在Remix左上角的“Vatue*字段输入200,确保单位是Finney。

3.终用depositAndMint 函数兼殖交易。

4.结果睡量:

MSc除翻:在MyStableCoin 合约實例上,期用balanceOf 查陶用户地址,應能看 到非零的 MSC 除。 健康因子:在 Engine 合約實例上,期用getHealthFactor 查旗用户地址,返回值愿 接近 150008008600000000 (1.5)。 o = ev

公奋司 Etvialero 添加查詢自己發行的代

測試用例2:回與銷毁(Redeem&Burn)

1.授權(Approve):

o定位到MyStableCoin合約實例。 o調用approve函數,將spender設置為ENGINE_ADDRESS,amount設置為希望 回的数量(例如50000000000000000000代表50MSC)。 。確交易。

50

1.腹回(Redeem):

o定位到Engine合約實例。 o調用redeemAndBurn函數,將_mscAmountToBurn設置為與上一步approve相 同的数量。 。確韶交易。 eeeeeemm

  • m8 @s

EAXIRON 2000 %.4.8

已經提取出50MSC

1.结果證:

oETH餘额:應截察到包的ETH餘增加。 oMSC餘额:MSC餘额相鹰减少。 0健康因子:健康因子應高於初始值,表明詹位風险降低。 S(1) s601 TRANSACTION ACTION Approve 50 O MSC forTnade on Ox735Da433894049F23 by OxFaef0970.AFe14774d [This is a Sepll Testnet transaction only] 1 Transaction Hash: 0x1fb948f9c53c43487c7773a38c342980 JES916P10 Status: Block (1n d 880 s20z-02-nr) o6e suw From: ef09708060405E1e97eBd596947CBAFe14774d To: Value: 0 ETH

0.000070514291855189 ETH

Transaction Fee: sg

1.501486103 Gwei (0.000000001501486103 ETH)

More Details:

六、结與展望

至此,一個包含核心穩定機制的DeFi協已成功構建完成完整測試。本實驗驗證了合約間的權 限控制、與预言機的交互以及基於通度抵押的資產發行與回遥辑。後續可在此基上,進一步探索 清算引擎、多抵押品支持及去中心化治理等高級功能。

原始排版图

實驗日誌:從零到一,構建可雙向操作的 ETH 抵押穩定幣協議:微信公众号导出原始排版图