Saltar al contenido principal

DPoS (Delegated Proof of Stake)

Introducción

KodeChain implementa un sistema DPoS optimizado para transacciones de alta velocidad con un sistema de rotación justo basado en múltiples métricas de performance.

Características Principales

Parámetros Básicos

  • Delegados Activos: 21 (producción) / 7 (desarrollo)
  • Tiempo de Bloque: 3 segundos
  • Duración de Ronda: 63 segundos (21 bloques × 3s)
  • TPS Estimado: ~300 transacciones por segundo

Archivos Clave

  • consensus/dpos.go (1485 líneas)
  • consensus/dpos_beacon_chain.go
  • pkg/staking/staking_contract.go

Arquitectura

Estructura Principal

type DPoS struct {
NodeID string
Delegates map[string]*DelegateInfo
ActiveDelegates []string
CurrentProducer string
RoundLength int // 21 bloques
BlockTime int // 3 segundos
CurrentRound int
CurrentSlot int
StakeByNodeID map[string]float64
VotesByNodeID map[string]string
stakingContract *staking.StakingContract
passiveDelegationManager *staking.PassiveDelegationManager
blockchainInstance *blockchain.Blockchain
}

DelegateInfo

type DelegateInfo struct {
Address string
PublicKey string
Stake float64
Votes float64
BlocksProduced int
MissedBlocks int
Reliability float64
IsActive bool
LastBlockTime time.Time
RewardsEarned float64
JoinedAt time.Time
}

Sistema de Selección de Delegados

Cálculo de Score Balanceado

score = (reliability × 0.4) +
(votes × 0.3) +
(blocksCreated × 0.2) +
(stake × 0.1)

Pesos de Métricas

  • Confiabilidad (40%): Uptime y bloques producidos exitosamente
  • Votos (30%): Delegaciones pasivas recibidas
  • Bloques Creados (20%): Contribución histórica a la red
  • Stake (10%): Cantidad de KDC en stake

Proceso de Selección

1. Obtener todos los validadores registrados

2. Filtrar validadores activos (IsActive = true)

3. Calcular score balanceado para cada uno

4. Ordenar por score (mayor a menor)

5. Seleccionar top 21 como ActiveDelegates

6. Actualizar cada 100 bloques (5 minutos)

Producción de Bloques

Ciclo de Producción

┌─────────────────────────────────────┐
│ Ticker cada 3 segundos │
└──────────────┬──────────────────────┘

┌──────────────────────────────────────┐
│ updateSchedule() │
│ - Calcula slot actual │
│ - Determina CurrentProducer │
└──────────────┬───────────────────────┘

┌──────────────────────────────────────┐
│ ¿Soy el productor actual? │
└──────────────┬───────────────────────┘
↓ Sí
┌──────────────────────────────────────┐
│ createAndMineBlock() │
│ 1. Obtener txs del mempool │
│ 2. Crear nuevo bloque │
│ 3. Forjar bloque (hash + merkle) │
│ 4. Agregar a blockchain │
└──────────────┬───────────────────────┘

┌──────────────────────────────────────┐
│ ¿Fin de ronda? │
└──────────────┬───────────────────────┘
↓ Sí
┌──────────────────────────────────────┐
│ distributeRewards() │
│ - Calcular fees del período │
│ - Distribuir a validadores │
└──────────────────────────────────────┘

Creación de Bloques

func (dpos *DPoS) createAndMineBlock() (*blockchain.Block, error) {
// 1. Obtener transacciones del mempool
transactions := mempool.GetTransactions("DPOS", 1000)

// 2. Crear bloque
block := &blockchain.Block{
Index: lastBlock.Index + 1,
Timestamp: time.Now().Format(time.RFC3339),
Type: blockchain.BlockTypeDPOS,
Transactions: transactions,
PreviousHash: lastBlock.Hash,
Validator: dpos.NodeID,
}

// 3. Forjar bloque
block.Hash = block.CalculateHash()
block.MerkleRoot = block.CalculateMerkleRoot()

// 4. Firmar bloque
signature, _ := dpos.signer.Sign([]byte(block.Hash))
block.Signature = hex.EncodeToString(signature)

// 5. Agregar a blockchain
blockchain.AddBlock(block)

return block, nil
}

Sistema de Recompensas

Distribución de Fees

Total Fee = 100%
├── Validador: 70% - Burn Rate
├── Desarrollo: 30%
└── Burn: 1-10% (dinámico según supply)

Burn Rate Dinámico

Supply TotalBurn RateValidador Recibe
> 40M KDC10%60%
20-40M KDC5%65%
< 20M KDC1%69%

Distribución por Ronda

Al final de cada ronda (21 bloques):

func (dpos *DPoS) distributeRewards() {
// Calcular total de fees de la ronda
totalFees := calculateRoundFees()

// Aplicar burn rate
burnRate := calculateBurnRate(currentSupply)
burnAmount := totalFees * burnRate

// Calcular porción del validador
validatorPortion := (totalFees * 0.70) - burnAmount
developmentPortion := totalFees * 0.30

// Distribuir a validadores según bloques producidos
for _, delegate := range ActiveDelegates {
blocksInRound := delegate.BlocksProducedInRound
share := (blocksInRound / 21.0) * validatorPortion
delegate.RewardsEarned += share
}

// Burn tokens
blockchain.BurnTokens(burnAmount)
}

Reliability Score

Cálculo

reliability = (BlocksProduced / BlocksAssigned) × 100%

Ejemplo

Bloques Asignados: 1000
Bloques Producidos: 995
Bloques Perdidos: 5

Reliability = (995 / 1000) × 100% = 99.5%

Impacto en Score

Un validador con alta reliability tiene ventaja en la selección de delegados activos.

Sistema de Penalizaciones

Tipos de Penalties

Minor (0.1% stake, -5% reliability)

- Miss 1-3 bloques consecutivos
- Downtime < 1 hora

Severe (0.3% stake, -20% reliability)

- Miss 4-10 bloques consecutivos
- Downtime 1-6 horas

Critical (0.5% stake, reliability = 0, desactivación)

- Double signing
- Downtime > 6 horas
- Miss > 10 bloques consecutivos

Implementación

func (dpos *DPoS) SlashDelegate(address string, reason string) {
delegate := dpos.Delegates[address]

var penaltyAmount float64
var reliabilityPenalty float64

switch reason {
case "missed_blocks_minor":
penaltyAmount = delegate.Stake * 0.001 // 0.1%
reliabilityPenalty = 0.05 // -5%

case "missed_blocks_severe":
penaltyAmount = delegate.Stake * 0.003 // 0.3%
reliabilityPenalty = 0.20 // -20%

case "double_sign":
penaltyAmount = delegate.Stake * 0.005 // 0.5%
delegate.Reliability = 0
delegate.IsActive = false
}

// Aplicar penalty
delegate.Stake -= penaltyAmount
delegate.Reliability -= reliabilityPenalty

// Burn penalty tokens
blockchain.BurnTokens(penaltyAmount)
}

Delegación Pasiva

Los usuarios pueden delegar tokens a validadores sin correr un nodo.

Ventajas

  • Participar en consenso sin hardware
  • Recibir parte de las recompensas del validador
  • Aumentar el voto del validador

Proceso

// 1. Usuario delega 100 KDC a validador
PassiveDelegationManager.Delegate(
delegator: "0xUser",
validator: "0xValidator",
amount: 100 KDC
)

// 2. Aumenta "Votes" del validador
validator.Votes += 100

// 3. Mejora score del validador
score = (reliability × 0.4) + (votes × 0.3) + ...

// 4. Validador comparte recompensas
validatorReward = 10 KDC
delegatorShare = (delegatedAmount / totalDelegated) × validatorReward

Sincronización de Delegados

Entre Peers

func (dpos *DPoS) SyncDelegatesWithPeer(peerURL string) {
// Obtener delegados del peer
peerDelegates := fetchDelegatesFromPeer(peerURL)

// Comparar con locales
for address, peerDelegate := range peerDelegates {
localDelegate := dpos.Delegates[address]

// Actualizar si peer tiene info más reciente
if peerDelegate.LastBlockTime.After(localDelegate.LastBlockTime) {
dpos.Delegates[address] = peerDelegate
}
}

// Actualizar ActiveDelegates si cambió
dpos.UpdateActiveDelegates()
}

Ventajas de DPoS en KodeChain

1. Alta Velocidad

  • Bloques cada 3 segundos
  • ~300 TPS
  • Confirmación casi instantánea

2. Eficiencia Energética

  • No requiere minería
  • Bajo consumo de recursos
  • Ambientalmente sustentable

3. Descentralización Controlada

  • 21 delegados activos
  • Rotación dinámica
  • Sistema de votación

4. Incentivos Alineados

  • Recompensas por producción
  • Penalties por mal comportamiento
  • Delegación pasiva inclusiva

Comparación con Otros Sistemas

CaracterísticaKodeChain DPoSBitcoin PoWEthereum PoS
Tiempo de Bloque3s~10min~12s
TPS~300~7~15
Consumo EnergéticoBajoMuy AltoMedio
FinalidadInmediata~60min~15min
Validadores21TodosTodos con 32 ETH
DelegaciónSí (pasiva)NoNo directa

Próximos Pasos


DPoS: Velocidad y eficiencia sin comprometer seguridad