В настоящее время я провожу некоторые эксперименты с 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"
}
Вы не можете использовать сложность ниже 2048, потому что функция, вычисляющая сложность, делит ее на 2048, и если вы используете 1, вы получите 0, поскольку это целочисленное деление (1/2048 = 0). Этот параметр настраивается в
config/protocol_params.go
DifficultyBoundDivisor
Попробуйте установить его на 1, может быть, это сработает. Но если вы не хотите иметь эти проблемы, просто установите сложность на 2100 или выше.
кеденк
Нулик
GasLimit
, если не 0, то делитель.кеденк
Нулик
types.Header
, astate.StateDb
иvm.Context
объекты. В вашем случаеDifficulty
0 , это означаетtypes.Header
, что не инициализировано. Измените функциюvm.NewEVM()
и выгрузите все параметры, переданные этой функции, на консоль, таким образом вы будете лучше понимать, какая часть среды не настроена должным образом.кеденк
Нулик
types.Header
— это заголовок блока, в котором хранится сложность, и EVM получает ее оттуда. В вашем случае, если сложность равна 0, этот объект не создан или неправильно настроен.кеденк