Код операции «Сложность» всегда помещает 0x0 в стек

В настоящее время я провожу некоторые эксперименты с Geth-EVM и выполнением кода операции. Во время экспериментов я заметил, что DIFFICULTYкод операции всегда помещается 0x0в стек EVM независимо от того, как я установил значение сложности в файле genesis config.file. Как я могу это интерпретировать и как определить значение сложности?

Я запускаю EVM с помощью следующей команды:

/home/user/ethereum/evms/geth-evm-1.8.0-stable 
--code 5a5b5b325932443a4332364333348942594458453441344130349944585b600960d360513900 
--prestate /home/user/ethereum/geth_genesis.json 
--gas 1048575 --sender 0x054fcf7870c50924ecbddd38c26e159d2cc78232 
--receiver 0xa31741b8972eea1991a9093284ad16bab63b9c18 --nomemory --json run

Это мой конфигурационный файл генезиса:

{"alloc": {
"0x123456789a123456789a123456789a123456789a": {
  "balance": "0x2bcb2dca0cded",
  "code": "0x1337",
  "nonce": "0x0"
},
"0x123456789a123456789a123456789a123456789c": {
  "balance": "0x9a815cb917edb",
  "code": "0x1337",
  "nonce": "0x0"
},
"0x123456789a123456789a123456789a123456789e": {
  "balance": "0x1c63ab403d7514",
  "code": "0x1337",
  "nonce": "0x0"
},
"0x123456789a321232189a123456789a123456789f": {
  "balance": "0xd3f6cdb0ae123",
  "code": "0x1337",
  "nonce": "0x0"
},
"0x333456789a123456789a123453289a1234512893": {
  "balance": "0x26b012410311d",
  "code": "0x1337",
  "nonce": "0x0"
}
},
    "coinbase": "0x0000000000000000000000000000000000000000",
    "config": {
        "byzantiumBlock": 0,
        "daoForkBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "homesteadBlock": 0
},
    "difficulty": "0x01",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0x3D0900",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "nonce": "0x0000000000000000",
    "number": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp": "0x00"
}

Ответы (1)

Вы не можете использовать сложность ниже 2048, потому что функция, вычисляющая сложность, делит ее на 2048, и если вы используете 1, вы получите 0, поскольку это целочисленное деление (1/2048 = 0). Этот параметр настраивается в

config/protocol_params.go

DifficultyBoundDivisor

Попробуйте установить его на 1, может быть, это сработает. Но если вы не хотите иметь эти проблемы, просто установите сложность на 2100 или выше.

Я это понимаю, но независимо от значения он всегда помещает 0x0 в стек. Во время последнего выполнения я установил значение «0x9999999» и получил 0x0.
попробуй "толкать" GasLimit, если не 0, то делитель.
Я попробую это. Однако я протестировал ту же последовательность байт-кода с реализацией EVM Parity. Эта реализация берет именно сложное значение из файла генезиса. Есть ли причина, по которой Гет использует делитель?
делитель является частью функции сложности, у всех он реализован одинаково, иначе вы не достигнете консенсуса. Для запуска байт-кода у вас должна быть предварительно инициализированная среда, другими словами, a types.Header, a state.StateDbи vm.Contextобъекты. В вашем случае Difficulty0 , это означает types.Header, что не инициализировано. Измените функцию vm.NewEVM()и выгрузите все параметры, переданные этой функции, на консоль, таким образом вы будете лучше понимать, какая часть среды не настроена должным образом.
Я попробую это. Но на самом деле я использую автономный исполняемый файл EVM. Итак, types.Header должен быть инициализирован?!
types.Header— это заголовок блока, в котором хранится сложность, и EVM получает ее оттуда. В вашем случае, если сложность равна 0, этот объект не создан или неправильно настроен.
Согласно этой проблеме github.com/ethereum/go-ethereum/issues/17216 , это ошибка, заключающаяся в том, что EVM не инициализирует эти значения. Но, конечно, вы тоже правы. Спасибо за вашу помощь!!