leer el código de bytes del contrato de leveldb

¿Hay alguna manera de leer el código de bytes de un contrato implementado desde leveldb? Por lo que entiendo, dentro de cada cuenta en el árbol de estado, existe el nonce, el saldo, el codehash y la raíz de almacenamiento. ¿El codehash apunta a la ubicación en leveldb donde se almacena el bytecode del contrato?

¿Y es correcto decir que el código de bytes del contrato almacenado en leveldb es solo la parte del cuerpo del contrato y no el código de bytes de inicio/constructor?

Respuestas (2)

Puede consultar el código de bytes del contrato en este conjunto de datos público de BigQuery https://medium.com/@medvedev1088/more-blockchain-analysis-on-bigquery-92a863137f01 . Adicionalmente puedes consultar bloques, transacciones, recibos, logs, erc20_transfers:

### contracts.csv

Column                       |    Type     |
-----------------------------|-------------|
contract_address             | address     |
contract_bytecode            | hex_string  |

### blocks.csv

Column                  | Type               |
------------------------|--------------------|
block_number            | bigint             |
block_hash              | hex_string         |
block_parent_hash       | hex_string         |
block_nonce             | hex_string         |
block_sha3_uncles       | hex_string         |
block_logs_bloom        | hex_string         |
block_transactions_root | hex_string         |
block_state_root        | hex_string         |
block_miner             | address            |
block_difficulty        | numeric            |
block_total_difficulty  | numeric            |
block_size              | bigint             |
block_extra_data        | hex_string         |
block_gas_limit         | bigint             |
block_gas_used          | bigint             |
block_timestamp         | bigint             |
block_transaction_count | bigint             |

### transactions.csv

Column              |    Type     |
--------------------|-------------|
tx_hash             | hex_string  |
tx_nonce            | bigint      |
tx_block_hash       | hex_string  |
tx_block_number     | bigint      |
tx_index            | bigint      |
tx_from             | address     |
tx_to               | address     |
tx_value            | numeric     |
tx_gas              | bigint      |
tx_gas_price        | bigint      |
tx_input            | hex_string  |

### erc20_transfers.csv

Column              |    Type     |
--------------------|-------------|
erc20_token         | address     |
erc20_from          | address     |
erc20_to            | address     |
erc20_value         | numeric     |
erc20_tx_hash       | hex_string  |
erc20_log_index     | bigint      |
erc20_block_number  | bigint      |

### receipts.csv

Column                       |    Type     |
-----------------------------|-------------|
receipt_transaction_hash     | hex_string  |
receipt_transaction_index    | bigint      |
receipt_block_hash           | hex_string  |
receipt_block_number         | bigint      |
receipt_cumulative_gas_used  | bigint      |
receipt_gas_used             | bigint      |
receipt_contract_address     | address     |
receipt_root                 | hex_string  |
receipt_status               | bigint      |

### logs.csv

Column                       |    Type     |
-----------------------------|-------------|
log_index                    | bigint      |
log_transaction_hash         | hex_string  |
log_transaction_index        | bigint      |
log_block_hash   

La herramienta que utilicé para exportar los datos https://github.com/medvedev1088/ethereum-etl

¿Hay alguna manera de leer el código de bytes de un contrato implementado desde leveldb?

Sí, seguramente hay una manera porque (por ejemplo, geth) JSON RPC expone la función eth_getcode , que devuelve el código asociado a una cuenta. Debajo del capó, lee la base de datos de estado (que en el caso del cliente geth es una base de datos leveldb).

Por lo que entiendo, dentro de cada cuenta en el árbol de estado, existe el nonce, el saldo, el codehash y la raíz de almacenamiento. ¿El codehash apunta a la ubicación en leveldb donde se almacena el bytecode del contrato?

Según el Libro Amarillo , que es la especificación formal de Ethereum (Sección 4.1), sí:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

¿Y es correcto decir que el código de bytes del contrato almacenado en leveldb es solo la parte del cuerpo del contrato y no el código de bytes de inicio/constructor?

Sí, así es. Si echa un vistazo a la sección 7 del Ethereum Yellow Paper . Dice que:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Por lo tanto ise ejecuta y si toda la ejecución es exitosa se produce el cuerpo del código o. El hash del cuerpo KEC(o) se almacena en el estado de la cuenta. Y o se almacena en la base de datos para su posterior recuperación en caso de invocación de contrato (es decir, la llamada de mensaje).