El código de operación de "dificultad" empuja siempre 0x0 para apilar

Actualmente, hago algunos experimentos con Geth-EVM y ejecución de código de operación. Durante los experimentos, observé que el DIFFICULTYcódigo de operación siempre empuja 0x0a 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"
}

Respuestas (1)

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.

Lo entiendo, pero independientemente del valor, siempre empuja 0x0 a la pila. Durante la última ejecución establecí el valor en "0x9999999" y obtuve 0x0.
intente "empujar" GasLimit, si no es 0, entonces es el divisor.
Probaré eso. Sin embargo, probé la misma secuencia de bytecode con la implementación Parity de EVM. Esta implementación toma exactamente el valor difícil del archivo de génesis. ¿Hay alguna razón por la que Geth usa el divisor?
el divisor es parte de la función de dificultad, todos lo tienen implementado de la misma manera, de lo contrario no llegarás a un consenso. Para ejecutar bytecode, debe tener un entorno preinicializado, en otras palabras, a types.Header, a state.StateDby vm.Contextobjetos. En su caso Difficultyes 0 , esto significa types.Headerque no está inicializado, modifique la función vm.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.
Intentaré esto. Pero en realidad uso el ejecutable EVM independiente. Entonces, ¿types.Header debería inicializarse?
types.Headeres 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 incorrectamente
De acuerdo con este problema github.com/ethereum/go-ethereum/issues/17216 es un error que el EVM no inicializa estos valores. Pero claro, también tienes razón. ¡¡Gracias por tu ayuda!!