El recibo de transacción tiene contractAddress como nulo

Veo que mi transacción está minada. Estoy tratando de almacenar algunos datos en una estructura. La minería es exitosa, sin embargo, en el recibo de la transacción veo que la dirección del contrato es nula. ¿Es eso un error? Además, cuando intento obtener los datos de la estructura nuevamente, no obtengo ningún dato.

transaction receipt : 
{
  blockHash: "0x6835e94160e4db15196bae0718fcec9ea5e3ae94aa83fa9a837d49b736155276",
  blockNumber: 1135,
  contractAddress: null,
  cumulativeGasUsed: 52773,
  from: "0x627263e6a7e435feb257f9f17032026635b6bb4e",
  gasUsed: 52773,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  root: "0x19a02c583d8855081cb16f2a3e5bded4b896f8c2db1e58aacb75738401f5cf9c",
  to: "0x031bad0e974ee22016e4578ceec980c35fa19e1e",
  transactionHash: "0x6420fba51c596055d917c8f7abb67164435c675b212188dd41efd9c8f334a9c7",
  transactionIndex: 0
}


transaction receipt : 
{
  blockHash: "0x6835e94160e4db15196bae0718fcec9ea5e3ae94aa83fa9a837d49b736155276",
  blockNumber: 1135,
  from: "0x627263e6a7e435feb257f9f17032026635b6bb4e",
  gas: 90000,
  gasPrice: 20000000000,
  hash: "0x6420fba51c596055d917c8f7abb67164435c675b212188dd41efd9c8f334a9c7",
  input: "0x136bbb5b000000000000000000000000e52743fbbc67a95283c7c1fed1764275e484a9f900000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000647616e657368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d616c6500000000000000000000000000000000000000000000000000000000",
  nonce: 24,
  r: "0x1b5086663b5f034731625e1b3894834bdef2e8fe1d4bef8fc674d601b55fa200",
  s: "0x1b667db9dcc05a253d1b80812e85c8c07bab44226235f23f186b294c7161ace",
  to: "0x031bad0e974ee22016e4578ceec980c35fa19e1e",
  transactionIndex: 0,
  v: "0x2a",
  value: 0

}

Sin embargo, no estoy recuperando los datos que almacené en la estructura. No puedo entender lo que está mal.

Podría sugerirle que incluya un resumen de su entorno y los comandos que usa para obtener estos resultados para que la gente no tenga que adivinar demasiado. Si lo entiendo correctamente (no estoy seguro), estos son recibos que indican que se envió algo. Por diseño, estos recibos no indican qué hará la red (minería) con las transacciones. En el primer caso, el to:null, es consistente con el proceso de despliegue del contrato que comienza enviando el código de despliegue a la dirección 0x0 en todos los casos. El segundo parece conocer la dirección del contrato, es decir, hablar con algo que tiene una dirección.

Respuestas (2)

Se crea un contrato (también llamado implementación) enviando el código de bytes del contrato a la dirección Ethereum 0x0 (es decir, el tocampo será 0x0).

Si la creación del contrato tiene éxito, entonces (y solo entonces) habrá un valor en el campo contractAddress del recibo de la transacción. Ese valor será la dirección del contrato recién creado. Las llamadas posteriores a la dirección de ese contrato siempre tendrán 'null' en el campo contractAddress de un recibo.

En otras palabras, el contractAddresscampo podría haberse llamado newlyCreateContractAddress. Lea más aquí: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionreceipt

Esta es una buena respuesta, pero para ampliar aún más, ¿cómo se descubriría la dirección del contrato?

Luché con este comportamiento también. En la implementación del contrato (para Rinkeby en mi caso), la dirección del contrato era nula. Utilizo la biblioteca web3.js en mi aplicación, que verifica esto en el recibo de la transacción (más específicamente, el paquete web3-core-methods lo verifica) y arroja un error en caso de que contractAddress sea nulo.

Este es un problema solo si ejecuta el cliente ligero (reproducible). Cuando ejecuta un nodo completo, contractAddress devuelve la dirección real.