En etherscan :
-->> accounts >> contract accounts >> selecting one contract
,
Hay dos tipos de transacciones mencionadas en Número de transacciones :
Transacciones normales y Transacciones internas .
¿Cuál es la diferencia entre ellos y por qué las transacciones normales suelen ser mucho menores que las transacciones internas?
Las transacciones internas, a pesar del nombre (que no forma parte del papel amarillo; es una convención que la gente ha establecido) no son transacciones reales y no están incluidas directamente en la cadena de bloques; son transferencias de valor que se iniciaron mediante la ejecución de un contrato.
Revisa también estas respuestas
value transfers that were initiated by executing a contract.
En el protocolo Ethereum solo hay transacciones y llamadas de mensajes. Una transacción es un tipo de llamada de mensaje.
Una transacción puede realizar otras llamadas de mensajes, pero estas no son transacciones (aunque los exploradores de cadenas de bloques pueden etiquetarlas incorrectamente como "transacciones internas"). Estas llamadas de mensajes (internos) no se publican en la cadena de bloques.
Para intentar ilustrar, una transacción en Javascript se ve así:
{
from: ...,
to: "C1",
value: ...,
gas: ...,
data: ...,
gasPrice: ...,
nonce: ...
}
Esto es lo que verá en la cadena de bloques: una "transacción normal". Una "Transacción interna" son los efectos de tomar la data
parte, alimentarla con to
el contrato C1 y ejecutar la máquina virtual Ethereum. Esto data
es lo que le dice a C1 que debe llamar a otro contrato C2: no hay ningún {from:C1, to:C2,...}
objeto separado en la cadena de bloques que se necesite.
Los contratos que se llaman entre sí, junto con la recepción del pago, es la razón por la que "las transacciones normales suelen ser mucho menos que las transacciones internas". Por ejemplo, los tokens TheDAO se compraron originalmente llamando a una función en TheDAO y enviando ETH con ella.
"These (internal) message calls are not published on the blockchain"
, ¿no es falso ya que todos los datos son públicos y están contenidos en un bloque, asumiendo, por supuesto, que la transacción fue extraída?Una transacción interna no es una transacción real, no tiene firma y no está incluida en la cadena de bloques. Es el resultado de un contrato que inicia una transferencia de valor o llama a otro contrato, generalmente usando el código de operación CALL.
Los códigos de operación "similares" son: CALL, CREATE, CREATE2, CALLCODE, DELEGATECALL, SELFDESTRUCT.
Una dirección de contrato alberga un contrato inteligente, que es un conjunto de código almacenado en la cadena de bloques que se ejecuta cuando se realiza una transacción con datos de entrada asociados (interacción de contrato). fuente _
Como @nick-johnson demostró muy bien el concepto en este enlace :
Las transacciones internas, a pesar del nombre (que no forma parte del papel amarillo; es una convención que la gente ha establecido) no son transacciones reales y no están incluidas directamente en la cadena de bloques; son transferencias de valor que se iniciaron mediante la ejecución de un contrato .
Como tal, no se almacenan explícitamente en ningún lugar: son los efectos de ejecutar la transacción en cuestión en el estado de la cadena de bloques. Los exploradores de blockchain como etherscan los obtienen ejecutando un nodo modificado con un EVM instrumentado, que registra todas las transferencias de valor que tuvieron lugar como parte de la ejecución de transacciones, almacenándolas por separado.
Para obtener más información, echa un vistazo a este enlace .
Para entender esto, mira el siguiente ejemplo :
La dirección A del EOA quiere enviar algunos tokens ERC-20 a la dirección C del EOA. Para ello, la dirección A del EOA debe realizar una transacción de transferencia a la dirección B del contrato ERC-20, con estos parámetros:
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
}
donde
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
})
y
data = contract_token.encodeABI(fn_name="transfer", args=[EOA_address_C, to_wei(amount, 'ether')])
donde
contract_token = web3.eth.contract(address=ERC_20_Contract_address_B, abi=ERC_20_Contract_address_B_abi)
En este ejemplo, el EVM reconoce tx_obj como parámetros de transacción: 0 cantidad de EOA_address_A a ERC_20_Contract_address_B con "datos" como datos. Esto se llama una transacción.
La llamada transacción Interna es la consecuencia de esta transacción. es decir, con esta transacción realizada, activando la función de transferencia en ERC_20_Contract_address_B y pasando los "datos" proporcionados por esta transacción, se ejecutará la función de transferencia de ERC_20_Contract_address_B y los tokens se transferirán a EOA_address_C.
Debido a este hecho de que ejecutar esta función no cambiará el estado de la cadena de bloques (a pesar de la transacción principal), el EVM no reconocerá esto como una transacción y la gente convencionalmente lo llama una transacción interna. Sin embargo, los exploradores de blockchain como etherscan los obtienen ejecutando un nodo modificado con un EVM instrumentado, que registra todas las transferencias de valor que tuvieron lugar como parte de la ejecución de transacciones, almacenándolas por separado.
Las transacciones internas son transferencias ETH de contratos inteligentes, hay una buena explicación sobre los diferentes tipos de transferencias aquí: https://docs.alchemyapi.io/alchemy/guides/using-webhooks#address-activity
Además, ahora puede recibir notificaciones de transacciones internas usando Alchemy https://blog.alchemyapi.io/blog/internal-transactions-notifications
ismael