Skip to content

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์‹œ๊ฐ„

์ฃผ์š” ํ•จ์ˆ˜ โ€‹

solidity
// ๋‹จ์ผ ํ† ํฐ ๊ฐ€๊ฒฉ ์—…๋ฐ์ดํŠธ (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,0002000 * 10^18
FDT$11 * 10^18
USDC$11 * 10^18

Oracle Server โ€‹

์‹คํ–‰ ๋ฐฉ๋ฒ• โ€‹

bash
cd /home/blockchain/lending/oracle-server
npm install
node index.js

์„ค์ • โ€‹

javascript
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 ์‚ฌ์šฉ ์˜ˆ์‹œ โ€‹

์ „์ฒด ๊ฐ€๊ฒฉ ์กฐํšŒ โ€‹

bash
curl http://localhost:3004/prices

์‘๋‹ต:

json
{
  "success": true,
  "prices": {
    "ETH": {
      "address": "0xEeee...",
      "price": "2000.0",
      "lastUpdated": 1733123456,
      "lastUpdatedDate": "2025-12-02T..."
    },
    "FDT": {
      "address": "0xfD87...",
      "price": "1.0",
      ...
    }
  }
}

๊ฐœ๋ณ„ ๊ฐ€๊ฒฉ ์กฐํšŒ โ€‹

bash
curl http://localhost:3004/price/ETH

์‘๋‹ต:

json
{
  "success": true,
  "symbol": "ETH",
  "address": "0xEeee...",
  "price": "2000.0",
  "priceUSD": 2000,
  "lastUpdated": 1733123456
}

๊ฐ€๊ฒฉ ์ˆ˜๋™ ์„ค์ • (ํ…Œ์ŠคํŠธ์šฉ) โ€‹

bash
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$10%์Šคํ…Œ์ด๋ธ”์ฝ”์ธ (๊ณ ์ •)
DAI$10%์Šคํ…Œ์ด๋ธ”์ฝ”์ธ (๊ณ ์ •)

Lending ํ†ตํ•ฉ โ€‹

LendingPoolV2๋Š” Oracle์„ ์‚ฌ์šฉํ•˜์—ฌ:

  1. USD ๊ธฐ์ค€ ๋‹ด๋ณด ๊ฐ€์น˜ ๊ณ„์‚ฐ
๋‹ด๋ณด ๊ฐ€์น˜ (USD) = ์˜ˆ๊ธˆ๋Ÿ‰ ร— Oracle ๊ฐ€๊ฒฉ
  1. Health Factor ๊ณ„์‚ฐ
Health Factor = (์ด ๋‹ด๋ณด USD ร— 75%) / ์ด ๋Œ€์ถœ USD
  1. ์ฒญ์‚ฐ ํŒ๋‹จ
Health Factor < 1.0 โ†’ ์ฒญ์‚ฐ ๊ฐ€๋Šฅ

์˜ˆ์‹œ โ€‹

์ƒํ™ฉETH ๊ฐ€๊ฒฉ๋‹ด๋ณด (10 ETH)๋Œ€์ถœ (FDT)Health
์ •์ƒ$2,000$20,000$10,0001.50
ํ•˜๋ฝ$1,500$15,000$10,0001.125
์œ„ํ—˜$1,200$12,000$10,0000.90

๋ฌธ์ œ ํ•ด๊ฒฐ โ€‹

"Price is stale" ์˜ค๋ฅ˜ โ€‹

์›์ธ: ๊ฐ€๊ฒฉ์ด 1์‹œ๊ฐ„ ์ด์ƒ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ:

  1. Oracle Server๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ
    bash
    curl http://localhost:3004/health
  2. ์ˆ˜๋™์œผ๋กœ ๊ฐ€๊ฒฉ ์—…๋ฐ์ดํŠธ
    bash
    curl -X POST http://localhost:3004/update

"Price not available" ์˜ค๋ฅ˜ โ€‹

์›์ธ: ํ•ด๋‹น ํ† ํฐ์˜ ๊ฐ€๊ฒฉ์ด ์„ค์ •๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ:

  1. ํ† ํฐ ์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
  2. Oracle์— ๊ฐ€๊ฒฉ ์„ค์ •
    bash
    curl -X POST http://localhost:3004/set-price \
      -d '{"symbol": "TOKEN", "price": 1.0}'

Oracle Server ์—ฐ๊ฒฐ ์‹คํŒจ โ€‹

์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  1. ์„œ๋ฒ„ ์‹คํ–‰ ํ™•์ธ: ps aux | grep "oracle"
  2. ํฌํŠธ ํ™•์ธ: netstat -tlnp | grep 3004
  3. RPC ์—ฐ๊ฒฐ ํ™•์ธ: ๋ธ”๋ก์ฒด์ธ ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ

ํ™•์žฅ: ์‹ค์ œ ๊ฐ€๊ฒฉ ํ”ผ๋“œ ์—ฐ๋™ โ€‹

์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์™ธ๋ถ€ ๊ฐ€๊ฒฉ API๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

javascript
// 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 - ํŠธ๋žœ์žญ์…˜ ํ™•์ธ

FlutterDev Private Blockchain Platform