Solidez Conversión implícita no válida de la memoria de cadenas a la memoria de bytes solicitada

pragma solidity ^0.5

contract ProofOfExistence {

    // ... some code here

    function proofFor(string memory document) public view returns(bytes32) {
        return sha256(document);
    }

    // ... some more code here
}

Da el siguiente error:

TypeError: tipo no válido para el argumento en la llamada a la función. Conversión implícita no válida de la memoria de cadenas a la memoria de bytes solicitada.

No puedo entender por qué viene este error.

ACTUALIZAR :

pragma solidity ^0.5;
// Proof of Existence contract, version 3
contract ProofOfExistence3 {
  mapping (bytes32 => bool) private proofs;
  // store a proof of existence in the contract state
  function storeProof(bytes32 proof)  public{
    proofs[proof] = true;
  }
  // calculate and store the proof for a document
  function notarize(string memory document) public {
   **bytes32 proof = proofFor(document);**
    storeProof(proof);
  }
  // helper function to get a document's sha256
  function proofFor(bytes memory document) public pure returns (bytes32)  {
    return sha256(document);
  }
  // check if a document has been notarized
  function checkDocument(string memory document) view public returns (bool) {
    **bytes32 proof = proofFor(document);**
    return hasProof(proof);
  }
  // returns true if proof is stored
  function hasProof(bytes32 proof) view public returns(bool) {
    return proofs[proof];

ERROR DE ACTUALIZACIÓN Después de la actualización sugerida, obtengo el mismo error pero en las líneas que tienen ** ...** esta vez. ¿Por qué viene ahora? Gracias

Es mejor si puede copiar y pegar su código, en lugar de adjuntar una captura de pantalla

Respuestas (2)

Argumento para que sha256debería estar en bytes. Pero estás pasando, documentque es un string. Seguir funcionaría.

function proofFor(bytes memory document) public pure returns(bytes32) {
    return sha256(document);
}

Y una nota al margen: su función no necesita ser viewtipo ya que no está viendo ningún elemento de almacenamiento. Esto se puede convertir en una purefunción que no tiene efectos secundarios ni visualización de almacenamiento. Más detalles se pueden encontrar aquí .

ACTUALIZAR :

Si cambiar stringa bytesda errores en otras llamadas de función, puede convertirlas también byteso puede convertirlas stringcomo bytessugirió @Mikhail. Entonces eso sería;

function proofFor(string memory document) public pure returns(bytes32) {
    return sha256(bytes (document));
}
¡Gracias por la rápida respuesta! después de cambiar el código como sugirió, recibo errores en la otra parte.
solidez de pragma ^0.5; // Contrato de prueba de existencia, contrato de la versión 3 ProofOfExistence3 { mapeo (bytes32 => bool) pruebas privadas; // almacenar una prueba de existencia en el estado del contrato función storeProof(bytes32 prueba) public{ pruebas[prueba] = true; } // calcular y almacenar la prueba de un documento function notarize(string memory document) public { bytes32 proof = proofFor(document); storeProof(prueba); }
¡He agregado el código pero parece bastante feo aquí!
ahora el error se ha desplazado a esta línea... bytes32 prueba = pruebaPara(documento);
Muchas gracias por la orientación... ¡Ahora el problema está resuelto!
Sí hecho ahora!

probablemente debería ser

return sha256(bytes (document));