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
Argumento para que sha256
debería estar en bytes
. Pero estás pasando, document
que 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 view
tipo ya que no está viendo ningún elemento de almacenamiento. Esto se puede convertir en una pure
función que no tiene efectos secundarios ni visualización de almacenamiento. Más detalles se pueden encontrar aquí .
ACTUALIZAR :
Si cambiar string
a bytes
da errores en otras llamadas de función, puede convertirlas también bytes
o puede convertirlas string
como bytes
sugirió @Mikhail. Entonces eso sería;
function proofFor(string memory document) public pure returns(bytes32) {
return sha256(bytes (document));
}
probablemente debería ser
return sha256(bytes (document));
Achala Dissanayake