Как Ethereum вводит вознаграждение за блок в соответствии с консенсусом PoA?
Как Ethereum вводит вознаграждение за блок в соответствии с консенсусом PoA?

В предыдущей статье мы представили метод изменения исходного кода для получения вознаграждения за блок в соответствии с консенсусом PoA. Когда есть только один узел, этот метод не вызывает никаких проблем, как только к сети присоединяется новый узел; Добавленные узлы застрянут на этапе синхронизации данных. Так почему же это происходит?

Предыстория проблемы

В соответствии с консенсусом PoA,Вообще, блока наград нет.,но в некоторых случаях,нас Может Исправлять Исходный код для настройкиизблокироватьнаградалогика。Например,путем измененияconsensus/clique/clique.goфайлы, которые будут выданы для блокировки производителейнаграда。

Язык кода:go
копировать
// consensus/clique/clique.go
func (c *Clique) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal) {
    if len(txs) != 0 {
        miner, err := ecrecover(chain.CurrentHeader(), c.signatures)
        if err != nil {
            log.Error("Failed to recover miner address", "err", err)
            return
        }
        // награда
        state.AddBalance(miner, uint256.NewInt(chain.Config().Clique.Reward*1e18))
    }
}

В этом коде,мы проходимecrecoverфункция для восстановления адреса производителя блока,И дайте блоку награду. Однако,Когда к сети присоединяется новый узел (будь то узел синхронизации или узел валидатора),Вы столкнетесь с проблемой: новый узел не может выполнить синхронизацию с существующим узлом.,Завис на этапе синхронизации данных.

основная причина проблемы

вопросиз Суть в том, что новый узел не может быть определен как правильный.изблокироватьнаградаадрес。в существующихизлогикасередина,блокироватьнаградаизадресзависит отetherbaseпараметризценить,Это приведет к созданию нового узлаизблокироватьнаградаадреси Существующие узлы отличаются,Это приводит к сбою синхронизации.

Конкретно:

  • дляузел синхронизации,Нет необходимости указыватьminerСвязанныйизпараметр,Система автоматически получит соответствующую информацию из конфигурации в блоке генезиса.
  • дляузел валидатора,Необходимо указать вручнуюminerадрес,Но если новый узел имеет другую конфигурацию, чем существующий узел,ecrecoverвозврат функцииизшахтерадресбудет другим,вызывая сбой синхронизации.

решение

Чтобы решить эту проблему,нас Может确保блокироватьнаградаадресизуверенность,То есть каждый узел может Получено из блока генезисатакой жеизблокироватьнаградаадрес。Поскольку каждая сеть блокчейнов имеет уникальныйизблок генезиса,Генезисный блок содержит первоначальную конфигурацию сети.,поэтомунас Может在блок генезисасередина写入блокироватьнаградаизадрес,并确保所有узел在同步时都能使用такой жеизнаградаадрес。

Этапы реализации

1. Измените конфигурацию генезис-блока.

первый,нам нужно быть внутриgenesis.jsonЧжунвэйPoAКонсенсус добавленблокироватьнаградаадрес(coinbasesПоле)инаградаколичество(rewardПоле)。так,Вновь присоединенные узлы могут получить эти конфигурации из генезисного блока.

Язык кода:go
копировать
// params/config.go
// CliqueConfig is the consensus engine configs for proof-of-authority based sealing.
type CliqueConfig struct {
	Period    uint64   `json:"period"`    // Number of seconds between blocks to enforce
	Epoch     uint64   `json:"epoch"`     // Epoch length to reset votes and checkpoint
	// new 
	Coinbases []string `json:"coinbases"` // List of coinbase addresses to use for getting rewards
	Reward    uint64   `json:"reward"`    // Reward amount in ETH per block
}

Исправлятьназадизgenesis.jsonПоказывать Например Вниз:

Язык кода:json
копировать
{
    "config": {
        "chainId": 12345,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "clique": {
            "period": 1,
            "epoch": 30000,
            "coinbases": [
                "0x618C92D30E4a7B21A0D00DC7f5038024752ADFD5",
                "0xe23C2c6e7f785e74EB7AAeF96455B78C53adb2E3"
            ],
            "reward": 2
        }
    },
    "difficulty": "1",
    "gasLimit": "0xFFFFFFFF",
    "extradata": "0x0000000000000000000000000000000000000000000000000000000000000000618C92D30E4a7B21A0D00DC7f5038024752ADFD50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "alloc": {
        "618C92D30E4a7B21A0D00DC7f5038024752ADFD5": {
            "balance": "10000000000000000000000"
        },
        "e23C2c6e7f785e74EB7AAeF96455B78C53adb2E3": {
            "balance": "10000000000000000000000"
        }
    }
}

В этой конфигурации:

  • coinbasesуказаны дваадрес,какблокироватьнаградаизполучатель。
  • rewardУкажите каждый блокизнаградаколичество。
  • extradataПоле Может包含блокировать ВОЗиздополнительные данные。

2. ИсправлятьFinalizeСпособ получениянаградаадрес

Следующий,нам нужно изменитьFinalizeметод,使其从блок генезисаиз配置середина动态获取блокироватьнаградаадрес,вместо того, чтобы полагаться наetherbaseилиecrecover

Язык кода:go
копировать
// consensus/clique/clique.go
func (c *Clique) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal) {
    // Если транзакции нет, вернитесь напрямую
    if len(txs) == 0 {
        return
    }

    decimals := 1e18
    // 从блок генезиса配置середина获取блокироватьнаградаадрес
    coinbases := chain.Config().Clique.Coinbases
    coinbaseLen := len(coinbases)
    
    if coinbaseLen != 0 {
        // Рассчитывается на основе номера блокаблокироватьнаградаадрес
        index := header.Number.Uint64() % uint64(coinbaseLen)
        state.AddBalance(common.HexToAddress(coinbases[index]), uint256.NewInt(chain.Config().Clique.Reward*decimals))
    }
}

в этом ИсправлятьназадизFinalizeметодсередина:

  • наспервый Получено из блока генезисаcoinbases(Прямо сейчасблокироватьнаградаадрессписок)。
  • По текущему блокуизсерийный номер(header.Number)инаградаадрессписокиздлина,Рассчитать точный адрес,и датьадреспроблеманаграда。

3. Перекомпилируйте и запустите новый узел.

После завершения вышеуказанных модификаций кода,нас Нужно перекомпилироватьgethклиент,Используйте вместе Исправлятьназадизgenesis.jsonфайл начать зановоизузел。так,所有узел都会使用从блок генезисасередина读取изнаградаадрес,Вместо того, чтобы полагаться на ручную настройку.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose