Твердость доступа к закрытой переменной - PullRequest
0 голосов
/ 23 мая 2018

в настоящее время я практикую основательность.Однако меня немного смущает доступ к закрытой переменной в контракте.

Например, здесь;

address private a;
address private b;
mapping (bytes32 => uint) public people;
mapping (bytes32 => mapping(address => uint)) public listOfEmp;
bytes32[] public list;
bytes32 private z;

Я могу получить доступ к 'a' с помощью

web3.eth.getStorageAt("0x501...", 0)

Как мне получить доступ к z здесь?Из другого контракта.

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Вы можете получить доступ к своему виду контракта, даже если он частный.

Попробуйте это:

web3.eth.getStorageAt("0x501...", 5)

Если вы хотите получить доступ к карте или массиву, проверьте этот документ для определения состояния.переменные: https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html

Кстати, вы всегда должны использовать getProof для проверки значения.

0 голосов
/ 09 мая 2019

Думайте об Ethereum как о процессе, запущенном на вашей машине или удаленно.Используя web3.eth.getStorageAt, вы читаете данные из памяти процесса.Таким же образом вы можете читать данные каждой программы на вашем компьютере.

С другой стороны, языки программирования высокого уровня, такие как Java, C ++ или Solidity, часто определяют правила доступа к переменным и функциям (приватным, защищенным и т. Д.).).Но эти правила действуют только в контексте выполнения программы.Для Solidity этот контекст является выполнением транзакции.

Это означает, что приватное поле является приватным только для других контрактов, пытающихся его прочитать.Но может читаться внешними (и довольно низкоуровневыми) API, такими как web3.eth.getStorageAt.

0 голосов
/ 23 мая 2018

Я не верю, что ты можешь.Закрытая переменная предназначена для использования только в договоре, в котором она определена.Смотрите здесь: http://solidity.readthedocs.io/en/v0.4.21/contracts.html

...