¿Hay alguna manera de acceder a una variable de mapeo como:
mapping(bytes => bool) myMappingVar;
que NO es:
Por ejemplo, desde web3:
contract.instance.methods.myMappingVar('somevalue').call();
No convenientemente, pero puede acceder a cualquier valor en el almacenamiento de un contrato inteligente a través de web3.eth.getStorageAt
. Consulte https://solidity.readthedocs.io/en/develop/miscellaneous.html#layout-of-state-variables-in-storage para obtener detalles sobre cómo se distribuye el almacenamiento.
Si your mapping
es la primera variable de estado en el contrato, por lo que está en la ranura 0, este código recuperará el valor de la clave 0x123456
.
var slot = "0".repeat(64); // hex uint256 representation of 0
var key = "0x123456"; // hex representation of the key
web3.eth.getStorageAt(
contractAddress, // address of the contract to read from
web3.sha3(key+slot, { encoding: 'hex' }), // keccak256(k . p)
function (err, result) {
console.log(result); // 00...0 for false, 00...1 for true, both 32 bytes wide
}
);
Puede acceder a una variable de asignación pública como una variable pública normal, con la excepción de que debe proporcionar el valor de índice para la asignación .
He hecho el siguiente ejemplo, y funcionó para mí.
En mi contrato escrito usando Solidity
address public owner;
mapping(uint8 => address) public incomingQueue;
mapping(address => string) public assignedName;
Después de obtener la dirección del contrato:
const contract = web3.eth.contract(abiArray).at(contract_address);
Puedo acceder a estas variables usando el siguiente código javascript web3:
contract.owner.call(function(err, result){
if(!err)
alert(result)
});
contract.incomingQueue.call(0, function(err, result){
if(!err){
alert(result)
}
});
contract.assignedName.call(web3.eth.accounts[0], function(err, result){
if(!err){
alert(result)
}
});
Desde la perspectiva de la ocultación de información, no puede acceder a los campos desde el exterior. Necesitas una función getter. Cuando especifica el modificador público en el mapeo, Solidity genera una función getter para usted.
Sin embargo, como explica Smarx en su respuesta, esto no protege sus datos para que no se lean directamente desde el almacenamiento.
infinitoprimo
usuario19510
infinitoprimo
usuario19510
key = web3.fromAscii('height')
en el código anterior.infinitoprimo
usuario19510
mapping
se encuentre en su código Solidity. Si es la primera variable, entonces la ranura será 0. Si no, realmente tendrá que leer la documentación a la que me vinculé para obtener más detalles.infinitoprimo