آنچه در این مقاله میخوانید [پنهانسازی]
ایجاد ساخت صرافی غیرمتمرکز با سالیدیتی میتواند به شما کمک کند تا با اصول اساسی قراردادهای هوشمند و تعاملات بلاکچین آشنا شوید. در اینجا مراحل اصلی و کد نمونه برای نوشتن یک DEX ساده آورده شده است:
سرفصل های مقاله
مراحل طراحی DEX
- تعریف استاندارد توکن: معمولاً از توکنهای استاندارد ERC20 در بلاکچین اتریوم استفاده میشود.
- ایجاد قرارداد DEX: این قرارداد برای انجام مبادلات بین توکنها استفاده میشود.
- عملکردهای اصلی: قرار دادن توکن در بازار، خرید و فروش توکنها و بررسی موجودیها.
- یادداشتهای امنیتی: بررسی و مدیریت امنیت قرارداد.
کد نمونه
در زیر یک نمونه ساده از یک قرارداد DEX نوشته شده به زبان سالیدیتی آورده شده است:
// SPDX-License-Identifier: MIT
pragma solidity ^.8.;
// ERC20 Interface
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract SimpleDEX {
// Struct to hold token exchange data
struct Order {
address token;
uint256 amount;
uint256 price; // Price in wei
}
// Mapping of user orders
mapping(uint256 => Order) public orders;
uint256 public orderCount;
// Event declaration for logging
event OrderPlaced(uint256 orderId, address token, uint256 amount, uint256 price);
// Place an order to sell tokens
function placeOrder(address _token, uint256 _amount, uint256 _price) external returns (uint256) {
IERC20(_token).transferFrom(msg.sender, address(this), _amount); // Transfer tokens to DEX
orderCount++;
orders[orderCount] = Order(_token, _amount, _price);
emit OrderPlaced(orderCount, _token, _amount, _price);
return orderCount;
}
// Buy tokens from DEX
function buyToken(uint256 _orderId) external payable {
Order storage order = orders[_orderId];
require(msg.value >= order.price, "Not enough ETH sent");
require(order.amount > , "Order does not exist");
// Transfer tokens to buyer
IERC20(order.token).transfer(msg.sender, order.amount);
// Send ETH to seller
payable(address(this)).transfer(msg.value);
// Update order
order.amount = ; // Order completed
}
// Retrieve balance of a specific token for a user
function getTokenBalance(address _token) external view returns (uint256) {
return IERC20(_token).balanceOf(msg.sender);
}
}
توضیح کد
- تعریف Interface: اولین بخش کد، رابط توکن ERC20 را تعریف میکند تا بتوانیم با توکنهای مختلف تعامل کنیم.
- ساختار Order: اعلام ساختاری به نام Order برای نگهداری اطلاعات سفارشات.
- تابع placeOrder: این تابع برای ایجاد یک سفارش جدید استفاده میشود. توکنهایی که کاربر میخواهد بفروشد به قرارداد منتقل میشوند.
- تابع buyToken: این تابع برای خرید توکنها از DEX به کار میرود. اطمینان حاصل میکند که مقدار کافی اتریوم (ETH) به قرارداد ارسال شده است و سپس توکنها را به خریدار منتقل میکند.
- تابع getTokenBalance: این تابع برای مشاهده موجودی توکن کاربر ارسال شده است.
نکات امنیتی
- بررسیهای امنیتی: پیش از فراخوانی توابع، حتماً مقادیر ورودی را اعتبارسنجی کنید.
- تست کامل: قرارداد را در محیطهای تست مانند Remix یا Truffle تست کنید.
نتیجه گیری
با استفاده از کد و توضیحات فوق، میتوانید یک ساخت صرافی غیرمتمرکز با سالیدیتی را انجام دهید. این قرارداد تنها ابتداییترین ویژگیها را پیادهسازی میکند و شما میتوانید آن را بر اساس نیازها و ویژگیهای مورد نظر خود گسترش دهید. برای یادگیری عمیقتر و توسعهی قابلیتها، پیشنهاد میکنم دورههای آموزشی مرتبط را دنبال کنید.