Actualmente, hago algunos experimentos con Geth-EVM y ejecución de código de operación. Durante los experimentos, observé que el DIFFICULTY
código de operación siempre empuja 0x0
a la pila EVM independientemente de cómo establecí el valor de dificultad en el archivo de configuración de génesis. ¿Cómo puedo interpretar esto y cómo puedo definir el valor de dificultad?
Ejecuto el EVM con el siguiente comando:
/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
Este es mi archivo de configuración de génesis:
{"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"
}
No puedes usar una dificultad inferior a 2048 porque la función que calcula la dificultad la divide por 2048 y si usas 1, terminarás con 0 ya que es una división entera (1/2048 = 0). Este parámetro es configurable en
config/protocol_params.go
DifficultyBoundDivisor
Intente configurarlo en 1, tal vez funcione. Pero si no quieres tener estos problemas, simplemente establece tu dificultad en 2100 o más.
kedenk
Nulik
GasLimit
, si no es 0, entonces es el divisor.kedenk
Nulik
types.Header
, astate.StateDb
yvm.Context
objetos. En su casoDifficulty
es 0 , esto significatypes.Header
que no está inicializado, modifique la funciónvm.NewEVM()
y descargue todos los parámetros pasados a esta función a la consola, de esta manera tendrá una mejor comprensión de qué parte del entorno no está configurada correctamente.kedenk
Nulik
types.Header
es el encabezado del bloque, que almacena la dificultad, y el EVM lo obtiene desde allí. En su caso, si la Dificultad es 0, entonces este objeto no está instanciado o está configurado incorrectamentekedenk