Являются ли данные, хранящиеся в виде строк в смарт-контрактах, общедоступными для чтения?

Как новичок, я написал приведенный ниже контракт в целях обучения, стремясь создать «Безопасную систему обмена сообщениями»:

pragma solidity ^0.4.24;

contract SafeMessage {

string message;
string password;
string enterPassword;

function sendMessage(string _message, string _password) public {
       require (bytes(_message).length > 0 && bytes(_password).length > 0 );
       message = _message;
       password = _password;
}

function readMessage (string _enterPassword) view public returns (string) {
   require (stringsEqual(password, _enterPassword) == true);
   return (message);
}

function stringsEqual(string storage _a, string memory _b) internal pure returns(bool) {
    bytes storage a = bytes(_a);
    bytes memory b = bytes(_b);

    if (keccak256(a) != keccak256(b)) {
        return false;
    }
    return true;
}
}

Итак, с помощью приведенного выше кода я могу установить сообщение, и вызов «readMessage» вернет сообщение только с правильным паролем. Проблема в том, насколько я понимаю, данные, хранящиеся в строковой форме (сообщение и пароль), могут быть прочитаны кем-то другим. Это правда? И как это работает?

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

Ответы (2)

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

См. раздел «Ничего не скрыто» на странице https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/ .

У смарт-контракта нет возможности хранить секреты, поэтому единственные секреты, которые могут существовать в блокчейне, — это те, которые зашифрованы и расшифрованы вне блокчейна . (То есть зашифровать, затем сохранить в блокчейне, затем извлечь, затем расшифровать. После шифрования также было бы безопасно просто опубликовать данные в Twitter.)

Это то, о чем я думал. Большое спасибо за разъяснения. Да и нет смысла делать для этого смарт-контракт. О, но из любопытства, какой процесс должен пройти кто-то, чтобы прочитать эти данные?
Около 4 строчек JavaScript и немного знаний о структуре хранилища в солидности. Web3 предоставляет getStorageAtметод, который можно использовать для чтения непосредственно из хранилища смарт-контрактов.

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

Вот прямой пример: контракт CryptoKitties: https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#readContract

Для простых переменных состояния вы видите значение, например, paused = False bool

Для сопоставлений вы получаете форму для ввода ключа: например, kittyIndexToOwner принимает uint256, представляющий индекс котенка, и нажатие «Запросить» возвращает адрес владельца.

Для общедоступных или внешних функций вы получаете форму для ввода всех аргументов, например, canBreedWith принимает _matronId (uint256) и _sireId (uint256), возвращая логическое значение.

Я считаю, что вопрос был о частных переменных. (Насколько мне известно, Etherscan не предоставляет простого инструмента для доступа к ним.)