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.
Sí
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 outputs
tienen 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.