Как уменьшить сложность в частной тестовой сети?

Я создал частную тестовую сеть. В genesis.jsonфайле я изменил difficultyна 1. Тем не менее, добыча блока по-прежнему занимает несколько часов на моем процессоре. Я подозреваю, что это связано с некоторой конфигурацией, связанной с сетевой адаптацией.

Какова правильная процедура снижения сложности в частной тестовой сети, чтобы я мог добывать первые блоки на не очень мощном процессоре?

Если ответ ответил на ваш вопрос, не стесняйтесь принять его как правильный ответ, поставив галочку под кнопками голосования.
Я не уверен, что этот ответ решает мою проблему. Как только я смогу провести расследование, я либо приму это, либо опубликую комментарий о том, почему это не сработало.
Конечно, если вы отредактируете свой вопрос или разместите какие-либо комментарии под ответом, я смогу порекомендовать решение.

Ответы (4)

Есть 2 способа сделать это:

  • Измените значение параметра сложности в genesis.jsonфайле на небольшое число (желательно установить его на 0). Вы можете обратиться к этому примеру файла генезиса

    {
       "config": {
          "chainId": 1994,
          "homesteadBlock": 0,
          "eip155Block": 0,
          "eip158Block": 0,
          "byzantiumBlock": 0
       },
       "difficulty": "0x0", //difficulty set to zero in hexadecimal format
       "gasLimit": "0x8000000",
       "alloc": {
          "9a963d0eefeb62678d8efb48561c81e51c552797": { 
              "balance": "9606938044258990275541962092341162602522202993782792835301376" 
          },
          "30f28686aef33adbfbc13797b1d9f5a2f2759f56": { 
              "balance": "9606938044258990275541962092341162602522202993782792835301376" 
          }
       }
    }
    

Проблема с этим методом заключается в том, что когда количество блоков увеличивается, сложность также начинает расти с высокой скоростью. Итак, чтобы решить эту проблему, обратитесь к следующей части.

  • Вы можете уменьшить скорость увеличения сложности блоков, внеся некоторые изменения в код консенсуса go-ethereum. Откройте consensus.go, который находится по адресу, consensus/ethash/consensus.goи найдите строку ниже.

return CalcDifficulty(chain.Config(), time, parent)

Теперь замените строку выше на строку ниже.

return big.NewInt(1).

Теперь создайте go-ethereum с помощью make gethкоманды.

Я настоятельно рекомендую вам прочитать эту статью для более подробной реализации описанного выше процесса.

Пожалуйста, объясните, что «когда количество блоков увеличивается, сложность также начинает увеличиваться с высокой скоростью». Я не думаю, что номер блока вообще связан со сложностью.

Вы можете сделать сложность статической , изменив CalcDifficultyв Geth так, чтобы она возвращала статическое число. Пример:

func CalcDifficulty(config *ChainConfig, time, parentTime uint64, parentNumber, parentDiff *big.Int) *big.Int {
    return big.NewInt(1)
}

Пересоберите Geth и используйте вашу модифицированную версию.

Источник: Ответ на вопрос Можно ли изменить целевое время блока?

Это та же самая переменная, которую мы установили в блоке генезиса, верно? Если да, то каковы преимущества этого метода?
@niksmac Я отредактировал, чтобы изменить сложность на 1, чтобы майнинг всегда был быстрым. В противном случае сложность будет постепенно увеличиваться, и майнинг займет около 15 секунд, что желательно в Homestead, но, вероятно, не в вашей частной сети.
Должен ли я внести это изменение и модификацию на все узлы, которые подключены к моей частной сети Эфириума? или на том , к enodeкоторому я подключаюсь? Если да, влияет ли это на сложность текущей частной сети блокчейна (например, уже добыто 491 312 блоков)? @эт♦
@Avatar Да, я думаю, что все узлы должны использовать один и тот же код/протокол. Лучше сбросить блокчейн, но если вы хотите продолжить, вам может потребоваться остановить все узлы с тем же номером блока и перезапустить их, иначе узлы могут разветвляться в разных направлениях.
Это излишество, потому что, если вам придется пересобирать geth, чтобы применить это решение, вы также можете удалить свою цепочку и перезапустить ее с меньшей сложностью, указанной в блоке генезиса.
@fccoelho Это возможно, и в ответе « сделать сложность статической » — это ссылка на проблему, с которой люди могут столкнуться, начав с меньшей сложности в блоке генезиса, а именно на то, что сложность может продолжать увеличиваться.
@eth, как я могу это сделать cpp-ethereum? Я не нашел ни одного файла с похожим именем, например Consensus.cpp.
Неважно, я нашел эту функцию-член Ethash::calculateDifficulty.

Как видно в этом блоге

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

Сложность установлена 0x4000​​в блоке генезиса, что помогает мне добывать блок каждую ~5секунду.

I0401 07:06:16.533385    4556 ethash.go:252] Generating DAG: 98%
I0401 07:06:16.533482    4556 ethash.go:252] Generating DAG: 99%
I0401 07:06:16.533586    4556 ethash.go:252] Generating DAG: 100%
I0401 07:06:16.533668    4556 ethash.go:237] Done generating DAG for epoch 0, it took 10.562412ms

и майнинг

I0401 07:06:26.062135    4556 worker.go:348] 🔨  Mined block (#219 / 9704b2d0). Wait 5 blocks for confirmation
I0401 07:06:26.062687    4556 worker.go:569] commit new work on block 220 with 0 txs & 0 uncles. Took 484.843µs
I0401 07:06:26.063166    4556 worker.go:569] commit new work on block 220 with 0 txs & 0 uncles. Took 375.001µs
I0401 07:06:32.221697    4556 worker.go:348] 🔨  Mined block (#220 / 77bb4f70). Wait 5 blocks for confirmation
I0401 07:06:32.222280    4556 worker.go:569] commit new work on block 221 with 0 txs & 0 uncles. Took 521.439µs
Так может ли сложность не измениться после того, как майнинг в цепочке начался?
@TMOTTM да, вот как это кажется.
То есть я не могу внести это изменение, если у меня есть действующая частная сеть блокчейнов (например, уже добыто 491 312 блоков)? @никсмак
@Аватар, вот как это выглядит.

Вы можете следовать этому руководству с подробным объяснением: http://blog.coinfabrik.com/fast-smart-contracts-execution-ethereum-private-blockchain-development-environment/