Transactions

哪種類型的交易屬於 etherscan 上的內部交易

  • March 16, 2022

Etherscan 合約詳情界面顯示內部交易屬於哪類交易。

在此處輸入圖像描述

合約地址託管智能合約,智能合約是儲存在區塊鏈上的一組程式碼,當與相關輸入數據(合約互動)進行交易時執行。來源


內部交易,儘管名稱(不是黃皮書的一部分;這是人們已經確定的約定)不是實際交易,也不直接包含在區塊鏈中; 它們是通過執行契約啟動的價值轉移

因此,它們沒有明確地儲存在任何地方:它們是在區塊鏈狀態上執行有問題的交易的影響。像 etherscan 這樣的區塊鏈瀏覽器可以通過執行帶有儀表化 EVM 的修改節點來獲取它們,該 EVM 記錄作為交易執行的一部分發生的所有價值轉移,並將它們分開儲存。有關更多資訊,請查看thisthisthis


要理解這一點,請查看以下範例

EOA 地址 A 想要向 EOA 地址 C 發送一些 ERC-20 代幣。為此,EOA 地址 A 應該使用以下參數向 ERC-20 合約地址 B 進行轉賬交易:

tx_obj = {
           'from'      : EOA_address_A,
           'to'        : ERC_20_Contract_address_B,
           'value'     : 0,
           'data'      : data,
           'gas'       : estimated_gas,
           'gasPrice'  : web3.eth.gas_price,
           'nonce'     : web3.eth.get_transaction_count(EOA_address_A),
           'chainId'   : web3.eth.chain_id
           }

其中

estimated_gas = self.w3.eth.estimate_gas({
           'from'      : EOA_address_A,
           'to'        : ERC_20_Contract_address_B,
           'value'     : 0,
           'data'      : data,
           'nonce'     : web3.eth.get_transaction_count(EOA_address_A),
           'chainId'   : web3.eth.chain_id
           })

data = contract_token.encodeABI(fn_name="transfer", args=[EOA_address_C, to_wei(amount, 'ether')])

其中

contract_token = web3.eth.contract(address=ERC_20_Contract_address_B, abi=ERC_20_Contract_address_B_abi)

在此範例中,EVM 將 tx_obj 辨識為交易參數: 0 從 EOA_address_A 到 ERC_20_Contract_address_B 的金額,“數據”作為數據。這稱為交易。

所謂的內部交易就是這種交易的結果。即,在完成此交易後,通過觸發 ERC_20_Contract_address_B 中的轉移函式並傳遞此交易提供的“數據”,將執行 ERC_20_Contract_address_B 的轉移函式並將代幣轉移到 EOA_address_C。

由於執行這個函式不會改變區塊鏈狀態(儘管是主交易),EVM 不會將其辨識為交易,人們通常將其稱為內部交易。然而,像 etherscan 這樣的區塊鏈瀏覽器可以通過執行帶有儀表化 EVM 的修改節點來獲取它們,該 EVM 記錄作為交易執行的一部分發生的所有價值轉移,並將它們分開儲存。

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