Частная информация в смарт-контракте Ethereum

Есть ли способ сохранить информацию о смарт-контракте и сохранить ее в секрете?

Если в контракте есть переменная состояния, которая не является общедоступной, например:

contract foo{
    uint public publicVariable;
    uint notPublic;
}

действительно ли «notPublic» не является общедоступным? что, если он содержит секретную информацию, например номер кредитной карты? это нормально? если бы я хотел сохранить какую-то совершенно секретную информацию в этой переменной, есть ли способ сделать это, чтобы никто не мог получить ее, даже если она находится в сети?

Ответы (3)

Все в блокчейне Ethereum является общедоступным.

Поэтому вы не можете скрыть данные. Это связано с тем, что каждый узел Ethereum хранит копию всей цепочки блоков, и поэтому каждый узел теоретически может проверять свою копию, чтобы найти любые данные, которые вы хотите скрыть .

Это не означает, что вы не можете поместить конфиденциальные данные в блокчейн, вам просто нужно сначала зашифровать их.

Шифрование данных с помощью открытого ключа

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

Это может показаться большим объемом работы, чем с обычным веб-приложением, но на самом деле это преимущество. Если вы предполагаете, что злоумышленник может получить доступ к вашим данным, вы избежите многих ловушек безопасности, которые вызывают эти огромные утечки данных. Безопасность через неизвестность на самом деле вовсе не безопасность!

Как бы я подошел к такому шифрованию, не зная заранее получателя?
Я присоединюсь к вопросу Карла: кто-нибудь видел хорошие примеры, которые могли бы выполнить следующее: 1. Зашифровать закрытые данные 2. Позже предоставить данные новой стороне, все это делается через смарт-контракт или блокчейн (то есть без нужна какая-то третья оффлайн передача информации) Есть мысли?
Меня тоже интересует именно эта проблема. Но, по-видимому, это невозможно сделать без какой-либо помощи вне сети (например, keep). Дайте мне знать, если вы придумаете что-нибудь.
theoretically inspect their copy to find whatever data you wanted to be obscured.как это сделать? @Карл

Вы можете зашифровать данные и сохранить ключи вне цепочки:

См.: https://github.com/brix/crypto-js .

Хорошо, это хорошо. Но как насчет этой переменной «notPublic»? как кто-то вообще сможет получить доступ к чему-то подобному? я не понимаю что с ним не так
все состояние блокчейна общедоступно, как и каждая транзакция и взаимодействие с ним. Если бы он хранился в цепочке один раз, можно было бы просто просмотреть состояние контрактов или смоделировать все входящие транзакции и т. д., есть много способов. делая переменную не общедоступной, просто не создавайте интерфейс. См., например , live.ether.camp , где вы можете «следить» за каждой транзакцией .
@zunior Все изменения в «общедоступной» части связаны с кодом. Когда переменная является общедоступной, к ней может получить доступ, например, любая глобальная функция(). Если он частный, доступ к нему возможен только локально.
@thee-engineer Даже если он частный, у злоумышленников все равно есть способы его украсть.

Одна из проблем с шифрованием данных и помещением их в цепочку заключается в том, что вы навсегда оставляете свои зашифрованные данные в общедоступном неизменяемом хранилище данных. Что, если какая-то радикально новая вычислительная парадигма (квантовая?) сможет сломать шифрование или ваши ключи будут украдены?

Эту проблему и призван решить Базовый протокол , см.:

https://docs.baseline-protocol.org

Короче говоря, он направлен на использование доказательств с нулевым разглашением (ZKP), чтобы НЕ хранить вашу личную информацию в сети, а вместо этого хранить доказательство того, что вы знаете информацию, не раскрывая ее.