Solidity
將元素添加到映射(solidity)不起作用,即使在事務中實際呼叫了該方法
我目前(作為初學者)在一個涉及乙太坊區塊鍊和可靠性的項目中工作。
在我的契約中,我有一個以地址為鍵的映射以及 FileDetails 結構數組的值。無論如何,當我嘗試將元素添加到數組和映射時,即使正確呼叫了該方法,它也不會更新(請參閱下面的事務詳細資訊)。我目前正在使用帶有 truffle 套件的 React 應用程序。(用於執行測試區塊鏈的 Ganache)。
我有以下契約:
contract Files { struct FileDetails { string fileHash; // The IPFS file hash string fileName; // The file name string transactionDate; // The date in which file infos was stored string fileExtension; // The type of file (its extension) } mapping(address => FileDetails[]) filesList; function addFile(string memory fileHash, string memory fileName, string memory fileType, string memory date) public { FileDetails memory fileDetail = FileDetails({ fileHash: fileHash, fileName: fileName, fileExtension: fileType, transactionDate: date }); filesList[msg.sender].push(fileDetail); } }
現在我
addFile(...)
使用以下內容從 javascript 呼叫該函式:await contract.methods.addFile("aaaa", "bbbb", "cccc", "dddd").send({ from: accounts[0] });
如您所見,我將隨機字元串放入參數中僅用於測試。
合約被呼叫,甚至帶有參數的函式在交易中被正確呼叫。
除此之外,我在 Ganache 的契約中沒有看到任何映射結構的更新(0 項):
我不知道它是否有用,但是當我嘗試對合約進行交易以給它一些資金時,但我收到以下錯誤:
處理事務時出現 VM 異常:氣體不足
你知道可能是什麼問題嗎?為什麼即使正確呼叫該方法也不會更新映射結構?先感謝您。
編輯
我還嘗試將以下函式添加到solidity合約中:
function getFilesCount() public view returns (uint256) { return filesList[msg.sender].length; }
但是當我從 javascript 呼叫它時,我總是得到
0
.
在執行 go-ethereum 的本地環境中嘗試使用 Solidity 程式碼,效果很好。這聽起來可能很愚蠢,但是在您更改智能合約程式碼並重新部署它之後,您是否將文件添加到儲存中?因為它是一個新的智能合約、新地址、新儲存。我自己,我擺脫了 Ganache,因為生產網路(go-ethereum)的行為不同