Price Oracle ๊ฐ์ด๋ โ
FlutterDev ๋ธ๋ก์ฒด์ธ์ Price Oracle ์์คํ ์ ๋ํ ๊ฐ์ด๋์ ๋๋ค.
Oracle์ด๋? โ
๋ธ๋ก์ฒด์ธ์ ์ธ๋ถ ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. Oracle์ ์ธ๋ถ ์ธ๊ณ์ ๋ฐ์ดํฐ(๊ฐ๊ฒฉ, ๋ ์จ, ์คํฌ์ธ ๊ฒฐ๊ณผ ๋ฑ)๋ฅผ ๋ธ๋ก์ฒด์ธ์ ์ ๋ฌํ๋ ์ค๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ ์ธ๋ถ ์ธ๊ณ โ โ Oracle โ โ ๋ธ๋ก์ฒด์ธ โ
โ (๊ฐ๊ฒฉ API ๋ฑ) โโโโโโโถโ (์ค๊ฐ์) โโโโโโโถโ (์ค๋งํธ ์ปจํธ๋ํธ)โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ์ํคํ ์ฒ โ
FlutterDev Oracle ์์คํ ์ 3๊ฐ์ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Oracle Architecture โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Oracle Server โ โโโ Off-chain (Node.js) โ
โ โ (Port 3004) โ โข ๊ฐ๊ฒฉ ์์ง/๋ณ๋ ์๋ฎฌ๋ ์ด์
โ
โ โ โ โข 1๋ถ๋ง๋ค ์จ์ฒด์ธ ์
๋ฐ์ดํธ โ
โ โโโโโโโโโโฌโโโโโโโโโ โข REST API ์ ๊ณต โ
โ โ โ
โ โ updatePrices() โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ PriceOracle โ โโโ On-chain (Solidity) โ
โ โ Contract โ โข ํ ํฐ๋ณ ๊ฐ๊ฒฉ ์ ์ฅ โ
โ โ โ โข Staleness ์ฒดํฌ (1์๊ฐ) โ
โ โโโโโโโโโโฌโโโโโโโโโ โข ๊ฐ๊ฒฉ ์กฐํ ํจ์ โ
โ โ โ
โ โ getPrice() โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ LendingPoolV2 โ โโโ On-chain (Solidity) โ
โ โ Contract โ โข USD ๊ธฐ์ค ๋ด๋ณด ๊ฐ์น ๊ณ์ฐ โ
โ โ โ โข Health Factor ๊ณ์ฐ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ์ค๋งํธ ์ปจํธ๋ํธ โ
PriceOracle.sol โ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์ฃผ์ | 0x4beeEFF741f6CF8D14C3bF1420f0D8C59e86E29D |
| ์์ ์ | Deployer |
| ๊ฐ๊ฒฉ ๋จ์ | USD (18 decimals) |
| Stale ๊ธฐ์ค | 1์๊ฐ |
์ฃผ์ ํจ์ โ
// ๋จ์ผ ํ ํฐ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ (Owner๋ง)
function updatePrice(address token, uint256 price) external onlyOwner;
// ๋ค์ค ํ ํฐ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ (Owner๋ง)
function updatePrices(address[] tokens, uint256[] prices) external onlyOwner;
// ๊ฐ๊ฒฉ ์กฐํ (Stale ์ฒดํฌ ํฌํจ)
function getPrice(address token) external view returns (uint256);
// ๊ฐ๊ฒฉ ์ ๋ณด ์กฐํ (Stale ์ฒดํฌ ์์, UI์ฉ)
function getPriceInfo(address token) external view returns (
uint256 price,
uint256 timestamp,
bool isStale
);๊ฐ๊ฒฉ ํ์ โ
๊ฐ๊ฒฉ์ 18 decimals ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค:
| ํ ํฐ | ์ค์ ๊ฐ๊ฒฉ | ์ ์ฅ ๊ฐ |
|---|---|---|
| ETH | $2,000 | 2000 * 10^18 |
| FDT | $1 | 1 * 10^18 |
| USDC | $1 | 1 * 10^18 |
Oracle Server โ
์คํ ๋ฐฉ๋ฒ โ
cd /home/blockchain/lending/oracle-server
npm install
node index.js์ค์ โ
const config = {
rpcUrl: 'http://127.0.0.1:32768',
oracleAddress: '0x4beeEFF741f6CF8D14C3bF1420f0D8C59e86E29D',
updateInterval: 60000, // 1๋ถ
port: 3004
};API ์๋ํฌ์ธํธ โ
| ๋ฉ์๋ | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
| GET | /prices | ์ ์ฒด ํ ํฐ ๊ฐ๊ฒฉ ์กฐํ |
| GET | /price/:symbol | ๊ฐ๋ณ ํ ํฐ ๊ฐ๊ฒฉ ์กฐํ |
| POST | /update | ์๋ ๊ฐ๊ฒฉ ์ ๋ฐ์ดํธ ํธ๋ฆฌ๊ฑฐ |
| POST | /set-price | ํน์ ํ ํฐ ๊ฐ๊ฒฉ ์ค์ (ํ ์คํธ์ฉ) |
| GET | /health | ์๋ฒ ์ํ ํ์ธ |
API ์ฌ์ฉ ์์ โ
์ ์ฒด ๊ฐ๊ฒฉ ์กฐํ โ
curl http://localhost:3004/prices์๋ต:
{
"success": true,
"prices": {
"ETH": {
"address": "0xEeee...",
"price": "2000.0",
"lastUpdated": 1733123456,
"lastUpdatedDate": "2025-12-02T..."
},
"FDT": {
"address": "0xfD87...",
"price": "1.0",
...
}
}
}๊ฐ๋ณ ๊ฐ๊ฒฉ ์กฐํ โ
curl http://localhost:3004/price/ETH์๋ต:
{
"success": true,
"symbol": "ETH",
"address": "0xEeee...",
"price": "2000.0",
"priceUSD": 2000,
"lastUpdated": 1733123456
}๊ฐ๊ฒฉ ์๋ ์ค์ (ํ ์คํธ์ฉ) โ
curl -X POST http://localhost:3004/set-price \
-H "Content-Type: application/json" \
-d '{"symbol": "ETH", "price": 2500}'๊ฐ๊ฒฉ ๋ณ๋ ์๋ฎฌ๋ ์ด์ โ
Oracle Server๋ ์ค์ ๊ฐ๊ฒฉ ํผ๋๊ฐ ์์ด ์๋ฎฌ๋ ์ด์ ๋ ๊ฐ๊ฒฉ์ ์ฌ์ฉํฉ๋๋ค:
| ํ ํฐ | ๊ธฐ์ค ๊ฐ๊ฒฉ | ๋ณ๋ํญ | ์ค๋ช |
|---|---|---|---|
| ETH | $2,000 | ยฑ2% | 1๋ถ๋ง๋ค ๋๋ค ๋ณ๋ |
| FDT | $1 | ยฑ5% | 1๋ถ๋ง๋ค ๋๋ค ๋ณ๋ |
| USDC | $1 | 0% | ์คํ ์ด๋ธ์ฝ์ธ (๊ณ ์ ) |
| DAI | $1 | 0% | ์คํ ์ด๋ธ์ฝ์ธ (๊ณ ์ ) |
Lending ํตํฉ โ
LendingPoolV2๋ Oracle์ ์ฌ์ฉํ์ฌ:
- USD ๊ธฐ์ค ๋ด๋ณด ๊ฐ์น ๊ณ์ฐ
๋ด๋ณด ๊ฐ์น (USD) = ์๊ธ๋ ร Oracle ๊ฐ๊ฒฉ- Health Factor ๊ณ์ฐ
Health Factor = (์ด ๋ด๋ณด USD ร 75%) / ์ด ๋์ถ USD- ์ฒญ์ฐ ํ๋จ
Health Factor < 1.0 โ ์ฒญ์ฐ ๊ฐ๋ฅ์์ โ
| ์ํฉ | ETH ๊ฐ๊ฒฉ | ๋ด๋ณด (10 ETH) | ๋์ถ (FDT) | Health |
|---|---|---|---|---|
| ์ ์ | $2,000 | $20,000 | $10,000 | 1.50 |
| ํ๋ฝ | $1,500 | $15,000 | $10,000 | 1.125 |
| ์ํ | $1,200 | $12,000 | $10,000 | 0.90 |
๋ฌธ์ ํด๊ฒฐ โ
"Price is stale" ์ค๋ฅ โ
์์ธ: ๊ฐ๊ฒฉ์ด 1์๊ฐ ์ด์ ์ ๋ฐ์ดํธ๋์ง ์์
ํด๊ฒฐ:
- Oracle Server๊ฐ ์คํ ์ค์ธ์ง ํ์ธbash
curl http://localhost:3004/health - ์๋์ผ๋ก ๊ฐ๊ฒฉ ์
๋ฐ์ดํธbash
curl -X POST http://localhost:3004/update
"Price not available" ์ค๋ฅ โ
์์ธ: ํด๋น ํ ํฐ์ ๊ฐ๊ฒฉ์ด ์ค์ ๋์ง ์์
ํด๊ฒฐ:
- ํ ํฐ ์ฃผ์๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
- Oracle์ ๊ฐ๊ฒฉ ์ค์ bash
curl -X POST http://localhost:3004/set-price \ -d '{"symbol": "TOKEN", "price": 1.0}'
Oracle Server ์ฐ๊ฒฐ ์คํจ โ
์ฒดํฌ๋ฆฌ์คํธ:
- ์๋ฒ ์คํ ํ์ธ:
ps aux | grep "oracle" - ํฌํธ ํ์ธ:
netstat -tlnp | grep 3004 - RPC ์ฐ๊ฒฐ ํ์ธ: ๋ธ๋ก์ฒด์ธ ๋ ธ๋ ์ํ ํ์ธ
ํ์ฅ: ์ค์ ๊ฐ๊ฒฉ ํผ๋ ์ฐ๋ โ
์ค์ ์๋น์ค์์๋ ์ธ๋ถ ๊ฐ๊ฒฉ API๋ฅผ ์ฐ๋ํ ์ ์์ต๋๋ค:
// CoinGecko API ์์
async function fetchRealPrices() {
const response = await fetch(
'https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd'
);
const data = await response.json();
return data.ethereum.usd;
}์ฃผ์ ๊ฐ๊ฒฉ ์์ค โ
| ์๋น์ค | ํน์ง |
|---|---|
| Chainlink | ๋ถ์ฐํ Oracle ๋คํธ์ํฌ, ๊ฐ์ฅ ์ ๋ขฐ๋ ๋์ |
| CoinGecko | ๋ฌด๋ฃ API, ์ค์ํ |
| CoinMarketCap | ๋ฌด๋ฃ/์ ๋ฃ API, ์ค์ํ |
| Uniswap TWAP | ์จ์ฒด์ธ DEX ๊ฐ๊ฒฉ, ์กฐ์ ๋ฐฉ์ง |
์ปจํธ๋ํธ ์์ค โ
| ํ์ผ | ๊ฒฝ๋ก |
|---|---|
| PriceOracle.sol | /home/blockchain/lending/contracts/PriceOracle.sol |
| LendingPoolV2.sol | /home/blockchain/lending/contracts/LendingPoolV2.sol |
| Oracle Server | /home/blockchain/lending/oracle-server/ |
๊ด๋ จ ๋งํฌ โ
- FlutterLend - Oracle์ ์ฌ์ฉํ๋ Lending ํ๋กํ ์ฝ
- FlutterDex - ํ ํฐ ์ค์
- Block Explorer - ํธ๋์ญ์ ํ์ธ