Uso de contrato inteligente para verificar el cálculo de datos cifrados

Estoy trabajando en un proyecto donde todos los datos se almacenan encriptados en una cadena de bloques. Hay algunos nodos de cómputo fuera de la cadena que tienen la clave para descifrar los datos y realizar algunos cálculos y devolver resultados. Me gustaría diseñar un esquema en el que se pueda verificar que el cálculo sea correcto mediante un contrato inteligente. Entonces, estoy pensando en tener un contrato inteligente que implemente la función de verificación. La función de verificación tendría dos argumentos: una clave para el descifrado y el resultado esperado. La función es constante, por lo que la clave privada no debe escribirse en blockchain, por lo tanto, debe permanecer oculta para todos. La función devuelve verdadero o falso y firma este resultado. Esta función solo puede ser llamada por la entidad que conoce la clave. Para implementar lo anterior, necesito una función para descifrar y para iniciar sesión en Solidity, pero no pude encontrar ninguna.

¿Algún consejo si el descifrado, la función de firma existe en Solidity? ¿Alguna biblioteca? Algún consejo sobre diseños alternativos para mi problema.

Si la clave privada nunca llega a la cadena de bloques y solo se usa en una función constante, no hay ningún beneficio particular en el código para que esa función esté en la cadena de bloques. Escríbelo en un idioma normal y ahórrate el dolor de intentar hacerlo en Solidity.
Para aclarar por qué lo que describe no funciona, los contratos no tienen claves privadas y, por lo tanto, no pueden firmar nada. (Incluso si tuvieran claves privadas, esas claves en realidad no serían privadas. Cualquiera que ejecute un nodo Ethereum tendría acceso a la clave privada y luego podría firmar cualquier cosa).
su requisito parece ser que guardará algunos datos cifrados en blockchain y escribirá verificar (clave, datos cifrados) que devuelve bool. @MarkS Corrígeme si me equivoco.
@EdmundEdgar, el valor que veo al hacer la verificación en el contrato es que cualquiera puede ver el código de verificación. Entonces, la respuesta "verdadero" / "falso" es más confiable. si paso la clave privada como argumento a una función que no actualiza el estado de la cadena de bloques (función constante), entonces la clave seguirá siendo privada, ¿correcto?
Si realmente tiene que compartir el código de verificación a través del contrato, puede guardarlo en IPFS y publicar su hash de IPFS en el contrato.
@JitendraKumar.Balla, sí, correcto. La función de "verificar" es constante, por lo que no escribe nada en blockchain y la clave no está expuesta
@EdmundEdgar, idea interesante. Cuando hago esto por contrato, también es mucho más fácil ejecutar este código para cualquier persona que quiera desafiar el cálculo (no se requiere configuración, solo vaya a Etherescan y haga clic en "Leer contrato inteligente"
@Marcas. actualicé mi respuesta

Respuestas (1)

Según su pregunta, sí, puede hacerlo. Pero desafortunadamente no pude encontrar ninguna biblioteca de cifrado en Solidity. En general, los buenos algoritmos de cifrado/descifrado requieren una buena potencia de cálculo. Eso significa que requiere más gasolina. Siento que esto es rentable.

Permítanme resumir con el código:

contract Mail{
    mapping(address=>string) loginInfo;
    function validate(bytes key, bytes expectedResult) public constant returns(bool){
         //Check given saved data  
          //To do check given data and decrypted data is same or not?
       return true;
    }

} 

En lugar de hacer esto, puede seguir otra forma:

  1. Subir datos a IPFS
  2. Guarde la dirección IPFS/Swarm y el hash de los datos cifrados en su contrato.
  3. Cuando desee verificar, obtenga la dirección Swarm/IPFS y el valor hash del contrato.
  4. Use ifps/swarm api/sdks para obtener los datos.
  5. Hash del paso 4 con valor de hash del contrato si ambos son iguales, siga el paso 6
  6. Use cualquier biblioteca de cliente para descifrar datos
  7. Compare sus datos con datos descifrados.

En el método anterior, sus datos originales no irán a la red.

Ej: contrato,

contract Mail{
    struct MailInfo{
        bytes ipfs;
        bytes enc_hash;
    } 
    mapping(address=>MailInfo) loginInfo;
    function getIPFS(address userId) public constant returns(bytes,bytes){
       return (loginInfo[userId].ipfs,loginInfo[userId].enc_hash);
    }

}