¿Se garantiza que los datos de estructura devueltos por web3 estén en el orden correcto?

Tengo esta estructura de solidez.

struct Prices {
    uint sell_price;        // wei
    uint target_price;      // primary
    uint penalty_price;     // wei
}
Prices public prices

En truffle, cuando lo hago contract.prices(), recupero una matriz [sell_price, target_price, penalty_price], el orden en que aparecen en la estructura. Quería saber si este pedido está garantizado.

Respuestas (2)

La función captadora que genera Solidity utiliza el orden indicado en la estructura. Solidity generaría una función de la siguiente forma:

function prices() constant returns (uint sell_price, uint target_price, uint penalty_price) {
  sell_price = prices.sell_price;
  target_price = prices.target_price;
  penalty_price = prices.penalty_price;
}

Aquí está el ABI y vea que outputstienen un orden específico:

[
  {
    "constant": true,
    "inputs": [],
    "name": "prices",
    "outputs": [
      {
        "name": "sell_price",
        "type": "uint256"
      },
      {
        "name": "target_price",
        "type": "uint256"
      },
      {
        "name": "penalty_price",
        "type": "uint256"
      }
    ],
    "payable": false,
    "type": "function"
  }
]

Además, un ejemplo más complejo de captador de http://solidity.readthedocs.io/en/develop/contracts.html#getter-functions

contract Complex {
    struct Data {
        uint a;
        bytes3 b;
        mapping (uint => uint) map;
    }
    mapping (uint => mapping(bool => Data[])) public data;
}

Generará una función de la siguiente forma:

function data(uint arg1, bool arg2, uint arg3) returns (uint a, bytes3 b) {
    a = data[arg1][arg2][arg3].a;
    b = data[arg1][arg2][arg3].b;
}

Tenga en cuenta que se omite la asignación en la estructura porque no hay una buena manera de proporcionar la clave para la asignación.

Sí.

La ABI es una colección de argumentos de longitud fija en un orden específico. Los elementos estarán ordenados de manera confiable/consistente.

Espero eso ayude.