Evm

從 leveldb 讀取合約字節碼

  • July 3, 2018

有沒有辦法從 leveldb 讀取已部署合約的字節碼?據我了解,在狀態樹的每個帳戶中,都存在隨機數、餘額、程式碼雜湊和儲存根。codehash 是否指向 leveldb 中儲存合約字節碼的位置?

說儲存在 leveldb 中的合約字節碼只是合約的主體部分而不是 init/constructor 字節碼是否正確?

您可以在這個公共 BigQuery 數據集https://medium.com/@medvedev1088/more-blockchain-analysis-on-bigquery-92a863137f01中查詢合約字節碼。此外,您可以查詢區塊、交易、收據、日誌、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   

我用於導出數據的工具https://github.com/medvedev1088/ethereum-etl

有沒有辦法從 leveldb 讀取已部署合約的字節碼?

是的,肯定有一種方法,因為(例如 geth)JSON RPC 公開了函式 eth_getcode,它返回與帳戶關聯的程式碼。在後台它讀取狀態數據庫(在 geth 客戶端的情況下是 leveldb 數據庫)。

據我了解,在狀態樹的每個帳戶中,都存在隨機數、餘額、程式碼雜湊和儲存根。codehash 是否指向 leveldb 中儲存合約字節碼的位置?

根據乙太坊的正式規範黃皮(第 4.1 節),是的:

在此處輸入圖像描述 在此處輸入圖像描述

說儲存在 leveldb 中的合約字節碼只是合約的主體部分而不是 init/constructor 字節碼是否正確?

是的,就是這樣。如果你看一下乙太坊黃皮書第 7 節。它說:

在此處輸入圖像描述 在此處輸入圖像描述

因此i執行,如果所有執行都成功,則生成程式碼 o 的主體。主體 KEC(o) 的雜湊儲存在帳戶狀態中。o 儲存在數據庫中,以供以後在合約呼叫(即消息呼叫)的情況下檢索。

引用自:https://ethereum.stackexchange.com/questions/46407