Número no válido de argumentos para la función de solidez (intentando recuperar el mapeo)

El contrato de solidez ha definido el siguiente mapeo

struct recordStruct {
    uint256 price;
    uint64 time;
}

mapping(address => recordStruct[]) public records;

Pregunta: ¿Cómo podemos usar Web3.js para recuperar todo el mapeo?

Si esto no es posible, ¿cómo podemos pasar addressy recibir el objeto almacenado en la recordStructmatriz?

Intente al usar el siguiente código web3:

var record = await MyContractInstance.records.call('0xDbB7d1Ed07F8D1D0C5D5bB9b9e427E997f240F7d')

Obtuve el siguiente error

(nodo: 2452) UnhandledPromiseRejectionWarning: Error: Número no válido de argumentos para la función Solidity

Estoy usando Web3.js 1.0.0-beta.34

Respuestas (1)

Debe especificar tanto la dirección como el índice de la matriz, ya que la ABI tendrá esta estructura:

[
    {
        "constant": true,
        "inputs": [
            {
                "name": "",
                "type": "address"
            },
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "name": "records",
        "outputs": [
            {
                "name": "price",
                "type": "uint256"
            },
            {
                "name": "time",
                "type": "uint64"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
]

Y tenga en cuenta que el código javascript tampoco es completamente correcto:

var record = await MyContractInstance.records('0xDbB7d1Ed07F8D1D0C5D5bB9b9e427E997f240F7d', 0).call({ from: ... })

o

var record = await MyContractInstance.methods.records('0xDbB7d1Ed07F8D1D0C5D5bB9b9e427E997f240F7d', 0).call({ from: ... })

Deberia trabajar.

¡Gracias! ¿ Cuál es la diferencia entre Contract.method(params).call(options)y Contract.methods.method(params).call(options)?
Además, ¿es necesario pasar {from: ... }? Los documentos de web3js dicen que esto establece la dirección desde la que se debe realizar la llamada "transacción" . ¿Establece esto el valor de msg.sender, en la función de contrato y, de ser así, no es esto una suplantación de identidad msg.sendersi puede establecer cualquier dirección que desee?
contract.methods.name.call()y contract.name.call()son exactamente iguales. 'from: ...' no es obligatorio ya que, en caso de que no lo proporcione, se usaría la cuenta predeterminada. No puede falsificarlo, en caso de transacción, su billetera debe estar desbloqueada y la transacción debe ser confirmada desde metamask (en caso de que la use). En su caso, es solo una lectura, el estado no cambiaría