Видны ли данные, введенные в качестве параметра для функции смарт-контракта?

Скажем, у меня есть что-то вроде этого:

bytes32 person;

function registerPerson(address _person) public {
   bytes32 x;
   x = sha256(abi.encodePacked(_person));
   person = x;
}

Из соображений конфиденциальности я хочу сохранить этот элемент «_person» в виде хэша, чтобы люди не знали, что это за адрес. Я знаю, что значение bytes32 можно просмотреть, но теперь мне интересно, есть ли способ, которым люди могут увидеть необработанный ввод «_person»?

На мой взгляд, ответ отрицательный, но с помощью Remix он показывает входные данные, сделанные в функцию, и теперь мне интересно, это просто функциональность компилятора для отладки или необработанный ввод действительно где-то виден.

Большое спасибо.

Ответы (1)

Да, _personзначение будет видно через данные транзакции, которые создаются для вызова этой функции. Это было бы полностью общедоступно для всех и каждого, кто видел вашу транзакцию в сети.

Вы даже сможете использовать такой сервис, как Etherscan, для просмотра входных данных транзакции, которые будут содержать версию вашего ввода в шестнадцатеричном коде, которую можно легко превратить обратно в необработанные данные.

Если вы хотите хешировать адресные данные, чтобы сохранить их в «секрете», вы должны сделать это до того, как они будут отправлены в контракт.

Например, посмотрите на эту транзакцию к контракту, который позволяет вам хранить некоторый текст в смарт-контракте:

https://etherscan.io/tx/0xecd6399f05410c8c3d64dcacccce647c55df135f24a1632fb9bc3665e02dbf5a

Если вы посмотрите Input Dataи выберите «Просмотреть ввод как: UTF-8», вы сможете прочитать сохраненное сообщение:

латте с медовыми булочками и тыквой 14.03.2016

Это справедливо для всех входных данных.

Спасибо. Оглядываясь назад, конечно, вход должен быть видимым, поскольку узлы должны запускать код в своих EVM.
Это правда сегодня. Я не очень разбираюсь, но я думаю, что такие вещи, как ZK-SNARKS и другие доказательства с нулевым разглашением, могут позволить узлам проверять состояние контрактов, не зная входных данных... определенно еще не готов в Ethereum.