Evm
從 leveldb 讀取合約字節碼
有沒有辦法從 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
有沒有辦法從 leveldb 讀取已部署合約的字節碼?
是的,肯定有一種方法,因為(例如 geth)JSON RPC 公開了函式 eth_getcode,它返回與帳戶關聯的程式碼。在後台它讀取狀態數據庫(在 geth 客戶端的情況下是 leveldb 數據庫)。
據我了解,在狀態樹的每個帳戶中,都存在隨機數、餘額、程式碼雜湊和儲存根。codehash 是否指向 leveldb 中儲存合約字節碼的位置?
根據乙太坊的正式規範黃皮書(第 4.1 節),是的:
說儲存在 leveldb 中的合約字節碼只是合約的主體部分而不是 init/constructor 字節碼是否正確?
是的,就是這樣。如果你看一下乙太坊黃皮書第 7 節。它說:
因此
i
執行,如果所有執行都成功,則生成程式碼 o 的主體。主體 KEC(o) 的雜湊儲存在帳戶狀態中。o 儲存在數據庫中,以供以後在合約呼叫(即消息呼叫)的情況下檢索。