- Authors
- Name
はじめに
2026年、DeFi市場はTradFi(伝統的金融)との境界が急速に崩れつつあります。トークン化された証券、オンチェーンプライバシー、機関投資家の参入が加速し、DeFiはもはやニッチ市場ではなくなりました。開発者にとって、この技術を理解することがますます重要になっています。
本記事では、開発者の目線でDeFiのコアメカニズムを掘り下げます。
ブロックチェーンの基礎 — 開発者の視点
スマートコントラクトとは?
スマートコントラクトはブロックチェーン上にデプロイされたプログラムです。一度デプロイすると変更不可能(immutable)であり、誰でもコードを検証でき、条件が満たされると自動的に実行されます。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// シンプルなトークン交換コントラクト
contract SimpleSwap {
mapping(address => uint256) public balanceA;
mapping(address => uint256) public balanceB;
uint256 public reserveA;
uint256 public reserveB;
// 流動性の提供
function addLiquidity(uint256 amountA, uint256 amountB) external {
// トークンをコントラクトに送金(実際にはERC20 transferFrom)
reserveA += amountA;
reserveB += amountB;
}
// トークン A -> B 交換 (AMM: x * y = k)
function swapAforB(uint256 amountA) external returns (uint256 amountB) {
uint256 k = reserveA * reserveB; // 定数積不変量
uint256 newReserveA = reserveA + amountA;
uint256 newReserveB = k / newReserveA;
amountB = reserveB - newReserveB;
reserveA = newReserveA;
reserveB = newReserveB;
return amountB;
}
}
イーサリアムのトランザクションフロー
ユーザーウォレット (MetaMask)
↓ トランザクション署名
ノード (Infura/Alchemy)
↓ ブロードキャスト
メムプール (Mempool)
↓ ブロックへの組み込み(ガス代競争)
ブロック確定
↓ 状態変更
スマートコントラクト実行
DeFiコアプロトコル分析
1. DEX(分散型取引所) — Uniswap
UniswapはAMM(Automated Market Maker)方式を採用しており、オーダーブック(注文板)なしで流動性プールから自動的にトークンを交換します。
コア公式: x * y = k
# AMMシミュレーション
class ConstantProductAMM:
def __init__(self, reserve_a: float, reserve_b: float, fee: float = 0.003):
self.reserve_a = reserve_a
self.reserve_b = reserve_b
self.fee = fee
self.k = reserve_a * reserve_b
def get_price(self) -> float:
"""トークンAの価格(トークンB基準)"""
return self.reserve_b / self.reserve_a
def swap_a_for_b(self, amount_a: float) -> float:
"""トークンAをBに交換"""
# 手数料控除
amount_a_after_fee = amount_a * (1 - self.fee)
# x * y = k の公式を適用
new_reserve_a = self.reserve_a + amount_a_after_fee
new_reserve_b = self.k / new_reserve_a
amount_b_out = self.reserve_b - new_reserve_b
self.reserve_a = new_reserve_a
self.reserve_b = new_reserve_b
self.k = self.reserve_a * self.reserve_b
return amount_b_out
def calculate_price_impact(self, amount_a: float) -> float:
"""価格インパクトの計算"""
price_before = self.get_price()
# 一時的なスワップ
amount_b = self.swap_a_for_b(amount_a)
price_after = self.get_price()
# ロールバック
self.reserve_a -= amount_a * (1 - self.fee)
self.reserve_b += amount_b
self.k = self.reserve_a * self.reserve_b
return abs(price_after - price_before) / price_before * 100
# 使用例
pool = ConstantProductAMM(1_000_000, 1_000_000) # 1:1 プール
print(f"初期価格: {pool.get_price():.4f}")
# 初期価格: 1.0000
amount_out = pool.swap_a_for_b(10_000)
print(f"10,000 A -> {amount_out:.2f} B")
# 10,000 A -> 9,940.18 B(スリッページ発生)
print(f"交換後の価格: {pool.get_price():.4f}")
# 交換後の価格: 1.0202(価格変動)
2. Lending Protocol — Aave
# レンディングプロトコルのメカニズムシミュレーション
class LendingPool:
def __init__(self):
self.deposits = {} # ユーザー別預入金
self.borrows = {} # ユーザー別借入金
self.total_deposits = 0
self.total_borrows = 0
self.base_rate = 0.02 # 基本金利 2%
self.slope1 = 0.04 # 最適利用率以下の傾き
self.slope2 = 0.75 # 最適利用率以上の傾き
self.optimal_utilization = 0.80 # 最適利用率 80%
def utilization_rate(self) -> float:
"""利用率 = 総借入 / 総預入"""
if self.total_deposits == 0:
return 0
return self.total_borrows / self.total_deposits
def borrow_rate(self) -> float:
"""利用率に応じた変動借入金利"""
u = self.utilization_rate()
if u <= self.optimal_utilization:
return self.base_rate + (u / self.optimal_utilization) * self.slope1
else:
excess = (u - self.optimal_utilization) / (1 - self.optimal_utilization)
return self.base_rate + self.slope1 + excess * self.slope2
def supply_rate(self) -> float:
"""預入金利 = 借入金利 * 利用率"""
return self.borrow_rate() * self.utilization_rate()
def deposit(self, user: str, amount: float):
self.deposits[user] = self.deposits.get(user, 0) + amount
self.total_deposits += amount
def borrow(self, user: str, amount: float, collateral_value: float):
# LTV(Loan-to-Value)チェック
max_borrow = collateral_value * 0.75 # 75% LTV
current_borrow = self.borrows.get(user, 0)
if current_borrow + amount > max_borrow:
raise ValueError(f"LTV超過: 最大 {max_borrow}, 現在 {current_borrow}")
self.borrows[user] = current_borrow + amount
self.total_borrows += amount
# シミュレーション
pool = LendingPool()
pool.deposit("Alice", 1_000_000) # 100万ドル預入
pool.borrow("Bob", 600_000, 1_000_000) # 60万ドル借入
print(f"利用率: {pool.utilization_rate():.1%}")
# 利用率: 60.0%
print(f"借入金利: {pool.borrow_rate():.2%}")
# 借入金利: 5.00%
print(f"預入金利: {pool.supply_rate():.2%}")
# 預入金利: 3.00%
3. Yield Farming
# Yield Farming収益計算
class YieldFarm:
def __init__(self, pool_name: str, tvl: float, daily_rewards: float):
self.pool_name = pool_name
self.tvl = tvl # Total Value Locked
self.daily_rewards = daily_rewards
def apr(self) -> float:
"""年間利回り(単利)"""
return (self.daily_rewards * 365) / self.tvl * 100
def apy(self, compounds_per_year: int = 365) -> float:
"""年間利回り(複利)"""
daily_rate = self.daily_rewards / self.tvl
return ((1 + daily_rate) ** compounds_per_year - 1) * 100
def impermanent_loss(self, price_ratio: float) -> float:
"""インパーマネントロスの計算
price_ratio: 現在価格 / 初期価格
"""
il = 2 * (price_ratio ** 0.5) / (1 + price_ratio) - 1
return il * 100 # パーセント
# ETH-USDCプールの例
farm = YieldFarm("ETH-USDC", tvl=10_000_000, daily_rewards=5_000)
print(f"APR: {farm.apr():.1f}%")
# APR: 18.2%
print(f"APY: {farm.apy():.1f}%")
# APY: 20.0%
# ETH価格が2倍になった場合
il = farm.impermanent_loss(2.0)
print(f"インパーマネントロス(価格2倍): {il:.2f}%")
# インパーマネントロス(価格2倍): -5.72%
DeFiリスク分析
1. スマートコントラクトリスク
// 脆弱なコード例 — リエントランシー攻撃(reentrancy)
// このパターンは絶対に使用しないでください!
contract Vulnerable {
mapping(address => uint256) public balances;
// 危険: 外部呼び出し後に状態変更
function withdraw() external {
uint256 amount = balances[msg.sender];
(bool success, ) = msg.sender.call{value: amount}("");
require(success);
balances[msg.sender] = 0; // 状態変更が外部呼び出しの後に!
}
}
// 安全なパターン: Checks-Effects-Interactions
contract Safe {
mapping(address => uint256) public balances;
function withdraw() external {
uint256 amount = balances[msg.sender];
balances[msg.sender] = 0; // 先に状態変更!
(bool success, ) = msg.sender.call{value: amount}("");
require(success);
}
}
2. 主要リスクまとめ
| リスク | 説明 | 対策 |
|---|---|---|
| スマートコントラクトバグ | コードの脆弱性による資産流出 | 監査(audit)済みプロトコルのみ使用 |
| インパーマネントロス | 流動性提供時の価格変動による損失 | 相関性の高い資産ペアを選択 |
| オラクル操作 | 価格フィードの操作による不当な清算 | 複数のオラクルを使用するプロトコルを選択 |
| 規制リスク | 各国の規制変化 | 規制動向のモニタリング |
| ラグプル | 開発者による資金持ち逃げ | TVL、チーム経歴、コード検証の確認 |
開発者のためのDeFi参加戦略
保守的戦略:ステーブルコイン預入
リスク: ★☆☆☆☆
想定リターン: 3-8% APY
方法:
1. USDC/USDTをAaveに預入
2. 貸出金利を受取
3. 追加: Aaveトークンリワード
注意: ステーブルコインにもデペッグリスクあり
中間戦略:相関資産の流動性提供
リスク: ★★★☆☆
想定リターン: 10-25% APY
方法:
1. ETH-stETHなど相関資産ペアの流動性プールに提供
2. 取引手数料 + リワードトークンを受取
3. インパーマネントロスが小さい(価格が同様に動くため)
注意: スマートコントラクトリスクは依然として存在
積極的戦略:レバレッジYield Farming
リスク: ★★★★★
想定リターン: 30-100%+ APY
方法:
1. 資産を預入
2. 預入資産を担保に借入
3. 借入金で再び流動性提供(レバレッジ)
4. 手数料 + リワードで金利を上回る
注意: 清算リスク、複雑なポジション管理が必要
Web3開発ツール
# Hardhat — スマートコントラクト開発環境
npm install --save-dev hardhat
npx hardhat init
# Foundry — Rustベースの高速開発ツール
curl -L https://foundry.paradigm.xyz | bash
foundryup
# ethers.js — フロントエンド連携
npm install ethers
// ethers.jsでDeFiプロトコルを照会
import { ethers } from 'ethers'
const provider = new ethers.JsonRpcProvider('https://eth.llamarpc.com')
// Uniswap V3プール価格照会
const poolAddress = '0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8' // USDC/ETH
const poolABI = [
'function slot0() view returns (uint160, int24, uint16, uint16, uint16, uint8, bool)',
]
const pool = new ethers.Contract(poolAddress, poolABI, provider)
const [sqrtPriceX96] = await pool.slot0()
const price = (Number(sqrtPriceX96) / 2 ** 96) ** 2 * 1e12 // 価格計算
console.log(`ETH/USDC: $${price.toFixed(2)}`)
税金と規制
韓国では暗号資産の課税が2027年に延期されていますが、事前に準備しておくことをお勧めします:
- 売買差益: 250万ウォン超過分に22%課税(予定)
- DeFi収益: 雑所得として分類される可能性
- 記録管理: 全トランザクションのウォン換算額の記録が必須
# トランザクション記録管理の例
import csv
from datetime import datetime
def log_transaction(tx_type, asset, amount, usd_value, tx_hash):
with open('defi_transactions.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([
datetime.now().isoformat(),
tx_type, # deposit, withdraw, swap, harvest
asset,
amount,
usd_value,
tx_hash,
])
まとめ
DeFiは開発者に、金融システムの内部構造をコードで理解できるユニークな機会を提供します:
- AMMの数学: x * y = k の公式でオーダーブックなしの取引を実現
- レンディングプロトコル: 利用率ベースの変動金利で需給バランスを調整
- Yield Farming: 複利効果 + リワードトークンで収益を最大化
- リスク管理: スマートコントラクト監査、インパーマネントロスの理解が必須
クイズ: DeFi理解度チェック(8問)
Q1. AMMの x * y = k の公式でkが意味するものは?
流動性プールの2つのトークン数量の積で、交換前後で一定に保たれる定数積不変量です。
Q2. スリッページ(Slippage)はなぜ発生するのか?
AMMでは取引量が大きいほどプールの比率が大きく変わるため、予想交換レートと実際の交換レートに差が生じます。
Q3. インパーマネントロス(Impermanent Loss)とは?
流動性提供時にトークン価格が変動すると、単純に保有していた場合と比べて資産価値が減少する現象です。
Q4. Lending Protocolで利用率が高くなると?
借入金利が急激に上昇し、借入需要を抑制して預入需要を促進します。
Q5. リエントランシー攻撃(Reentrancy)を防ぐパターンは?
Checks-Effects-Interactionsパターン:外部呼び出しの前に状態を変更します。
Q6. APRとAPYの違いは?
APRは単利の利回り、APYは複利の利回りです。複利の頻度が高いほど、APYはAPRより高くなります。
Q7. ラグプル(Rug Pull)を見分ける方法は?
監査(audit)の有無、TVL規模、チームの身元公開、コードのオープンソース化、流動性ロック期間を確認します。
Q8. 韓国で暗号資産課税時に記録すべき情報は?
全トランザクションの日付、種類、資産、数量、ウォン換算額、トランザクションハッシュを記録する必要があります。