Solidity
Solidity 從字元串記憶體到請求的字節記憶體的無效隱式轉換
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
既沒有副作用也沒有儲存查看的功能。更多細節可以在這裡找到。更新 :
如果更改
string
為bytes
在其他函式呼叫中出現錯誤,您也可以將它們轉換為,bytes
或者您可以按照@Mikhail 的建議進行轉換。那將是;string``bytes
function proofFor(string memory document) public pure returns(bytes32) { return sha256(bytes (document)); }