Transacciones normales VS. Transacciones internas en etherscan

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?

Respuestas (5)

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

  1. Las transacciones internas de la DAO
  2. Cómo obtener transacciones internas de contrato
nicksmac: ¿Son las transacciones internas los eventos registrados en los registros? ¿Es eso lo que son?
@ThomasJayRush esvalue transfers that were initiated by executing a contract.
@ThomasJayRush no, son solo llamadas de un contrato a otro

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 dataparte, alimentarla con toel contrato C1 y ejecutar la máquina virtual Ethereum. Esto dataes 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.

Cuando dices "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?
@mecampbellsoup Las llamadas de mensajes internos se pueden derivar ya que, de hecho, todos los datos de la cadena de bloques son públicos, pero también debe ejecutar el EVM como se explica en la respuesta. No se "publican" en el sentido de que la mayoría de los clientes no proporcionan una "búsqueda" para ellos.

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.

la lista completa de códigos de operación es: CREATE, CALL, CALLCODE, DELEGATECALL, SELFDESCTUCT
¿Por qué un contrato necesita llamar a otro contrato para una transferencia de valor? ¿No puede simplemente hacer la transferencia de valor dentro de sí mismo?

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

¡Bienvenido a Ethereum Stack Exchange! Varios de ustedes de Alchemy han estado publicando respuestas duplicadas sin responder la pregunta con mayor precisión. Se han eliminado algunas de las respuestas duplicadas que no responden a la pregunta. Algunas preguntas pueden ser una oportunidad para demostrar cómo Alchemy realmente ayuda o resuelve la pregunta que se está formulando.