Analizando la salida del punto final del contrato

Un punto final de contrato en Ropsten devuelve un conjunto como este:

(uint256 _assetId, address _assetOwner, address _issuer, string _content, uint256 _sellPrice, uint256 _status)

El punto final es getAssetById y se puede consultar en:

https://ropsten.etherscan.io/address/0xd42e3ac7f89f5904a41cfd19d6505dec77fc2bcd#readContract

Estoy tratando de analizar la salida para los casos en que la entrada es 1 y 2 con los siguientes resultados:

asset 1:
0000000000000000000000000000000000000000000000000000000000000001 // uint256 _assetId
0000000000000000000000004b0897b0513fdc7c541b6d9d7e929c4e5364d2db // address _assetOwner
0000000000000000000000009b9731b07b9b5f982289bab87097eade6a4bc25d // address _issuer
00000000000000000000000000000000000000000000000000000000000000c0 // string _content ???
0000000000000000000000000000000000000000000000000000000000000000 // uint256 _sellPrice
0000000000000000000000000000000000000000000000000000000000000002 // uint256 _status
0000000000000000000000000000000000000000000000000000000000000016
43726f6d6f20646520546f6e69204d6f72616c2c206e00000000000000000000



asset 2:
0000000000000000000000000000000000000000000000000000000000000002 // uint256 _assetId
0000000000000000000000004b0897b0513fdc7c541b6d9d7e929c4e5364d2db // address _assetOwner
0000000000000000000000009b9731b07b9b5f982289bab87097eade6a4bc25d // address _issuer
00000000000000000000000000000000000000000000000000000000000000c0 // string _content ???
0000000000000000000000000000000000000000000000000000000000000000 // uint256 _sellPrice
0000000000000000000000000000000000000000000000000000000000000002 // uint256 _status
00000000000000000000000000000000000000000000000000000000000000c9
43726f6d6f20646520546f6e69204d6f72616c2c206e756d2e3120646520756e
612074697261646120646520312e20536567756e64612074697261646120656e
20726564206465207072756562617320526f707374656e3b2075726c496d6167
653d27687474703a2f2f692e696d6775722e636f6d2f4d457750436d492e6a70
67273b206861736853484131496d616765566572696669636174696f6e3d2735
6436393131353132623765386332313433316133656263343937323966376536
61653439613338273b0000000000000000000000000000000000000000000000

Pero la cuerda está estropeando las cosas.

¿Dónde puedo encontrar la longitud de la cuerda?

¿Por qué parte de la cadena está en la cuarta línea y el resto en la séptima y siguientes?

¿Alguna pista para interpretar estos resultados? ¡Gracias!

Referencias:

Análisis de la salida del método de contrato como una matriz de campos

¿Cómo llamaste a este método? si usaste algo como github.com/trufflesuite/truffle-contract obtendrías el resultado adecuado

Respuestas (1)

La longitud de la cadena es la palabra que sigue a la que ha identificado como status. Entonces, para activo1 es 0x16 = 22 en decimal, y para activo2 es 0xc9 = 201 decimal.

Las cadenas son tipos dinámicos y tienen una representación ABI particular como se describe en la especificación ABI . Los datos dinámicos aparecen después del resto de los datos: su string_content ???palabra es un puntero a donde comienza la cadena de datos dentro de los datos devueltos, es decir, en el byte 0xc0. A continuación, la cadena se representa mediante una palabra que contiene su longitud en bytes, seguida de los propios datos de caracteres de la cadena.

asset 1:
0x00 0000000000000000000000000000000000000000000000000000000000000001 // uint256 _assetId
0x20 0000000000000000000000004b0897b0513fdc7c541b6d9d7e929c4e5364d2db // address _assetOwner
0x40 0000000000000000000000009b9731b07b9b5f982289bab87097eade6a4bc25d // address _issuer
0x60 00000000000000000000000000000000000000000000000000000000000000c0 // pointer to string data starting at 0xc0
0x80 0000000000000000000000000000000000000000000000000000000000000000 // uint256 _sellPrice
0xa0 0000000000000000000000000000000000000000000000000000000000000002 // uint256 _status
0xc0 0000000000000000000000000000000000000000000000000000000000000016 // the length of the string data
0xe0 43726f6d6f20646520546f6e69204d6f72616c2c206e00000000000000000000 // the content of the string data
Esta respuesta, aunque quizás un poco concisa, es correcta. Deberías otorgar la recompensa.
Avíseme de cualquier falta de claridad/áreas demasiado concisas y felizmente ampliaré esto más.