Solidity

Solidity 從字元串記憶體到請求的字節記憶體的無效隱式轉換

  • June 14, 2020
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
}

給出以下錯誤:

TypeError:函式呼叫中的參數類型無效。從字元串記憶體到請求的字節記憶體的隱式轉換無效。

我無法理解為什麼會出現這個錯誤。

更新 :

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

更新錯誤按照建議進行更新後,我得到了同樣的錯誤,但這次是在有 ** …** 的行上。為什麼現在來了?謝謝

參數sha256應該在bytes. 但是你正在傳遞document這是一個string. 以下將起作用。

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

附帶說明 - 您的函式不需要view鍵入,因為它沒有查看任何儲存項目。這可以成為一個pure既沒有副作用也沒有儲存查看的功能。更多細節可以在這裡找到。

更新 :

如果更改stringbytes在其他函式呼叫中出現錯誤,您也可以將它們轉換為,bytes或者您可以按照@Mikhail 的建議進行轉換。那將是;string``bytes

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

引用自:https://ethereum.stackexchange.com/questions/69055