¿Los datos almacenados en forma de cadena en contratos inteligentes son de lectura pública?

Como principiante, escribí el siguiente contrato con fines de aprendizaje, con el objetivo de crear un "Sistema de mensajería seguro":

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;
}
}

Entonces, con el código anterior, puedo configurar un mensaje y llamar a "readMessage" solo devolverá el mensaje con la contraseña correcta. El problema es que, por lo que entiendo, los datos almacenados en forma de cadena (mensaje y contraseña) pueden ser leídos por otra persona. ¿Es eso cierto? ¿Y cómo funciona?

Además, para la contraseña, podría simplemente tomar su hash en lugar de almacenarlo directamente como cadena, pero eso no resolvería el problema si el mensaje se puede leer de todos modos. Si lo mencionado en el párrafo anterior es cierto, ¿cómo se podría crear un "Sistema de mensajería seguro" con un contrato inteligente?

Respuestas (2)

Sí, todo en la cadena de bloques es público y cualquiera puede leerlo.

Consulte la sección "Nada está oculto" de https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/ .

No hay forma de que un contrato inteligente guarde un secreto, por lo que los únicos secretos que pueden existir en la cadena de bloques son los que se cifran y descifran fuera de la cadena de bloques . (Es decir, cifrar, luego almacenar en la cadena de bloques, luego recuperar, luego descifrar. Una vez cifrados, también sería seguro publicar los datos en Twitter).

Es lo que pensaba. Muchas gracias por aclarar. Sí, entonces no tiene sentido hacer un contrato inteligente para eso. Oh, pero por curiosidad, ¿cuál es el proceso por el que alguien tiene que pasar para leer esos datos?
Alrededor de 4 líneas de JavaScript y un poco de conocimiento sobre el diseño de almacenamiento en Solidity. Web3 proporciona el getStorageAtmétodo, que se puede usar para leer directamente desde el almacenamiento de contratos inteligentes

Etherscan facilita la lectura del código y las variables de estado de cualquier contrato, e incluso interactúa con él.

Aquí hay un ejemplo directo: el contrato CryptoKitties: https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#readContract

Para variables de estado simples, verá el valor, por ejemplo, en pausa = Falso bool

Para las asignaciones, obtiene un formulario para ingresar la clave: por ejemplo, kittyIndexToOwner toma un uint256 que representa el índice de kitty y al hacer clic en 'Consulta' se devuelve la dirección del propietario.

Para funciones públicas o externas, obtiene un formulario para ingresar todos los argumentos, por ejemplo, canBreedWith toma un _matronId (uint256) y un _sireId (uint256), devolviendo un bool.

Creo que la pregunta era sobre variables privadas. (Etherscan, que yo sepa, no proporciona una herramienta simple para acceder a ellos).