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 address
y recibir el objeto almacenado en la recordStruct
matriz?
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
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.
nyxynyx
Contract.method(params).call(options)
yContract.methods.method(params).call(options)
?nyxynyx
{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 demsg.sender
, en la función de contrato y, de ser así, no es esto una suplantación de identidadmsg.sender
si puede establecer cualquier dirección que desee?mirg
contract.methods.name.call()
ycontract.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