Solidity

將元素添加到映射(solidity)不起作用,即使在事務中實際呼叫了該方法

  • February 24, 2021

我目前(作為初學者)在一個涉及乙太坊區塊鍊和可靠性的項目中工作。

在我的契約中,我有一個以地址為鍵的映射以及 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 異常:氣體不足

你知道可能是什麼問題嗎?為什麼即使正確呼叫該方法也不會更新映射結構?先感謝您。

編輯

這裡有一個來自 javscript 控制台日誌的交易收據: 在此處輸入圖像描述

我還嘗試將以下函式添加到solidity合約中:

function getFilesCount() public view returns (uint256) {
   return filesList[msg.sender].length;
}

但是當我從 javascript 呼叫它時,我總是得到0.

在執行 go-ethereum 的本地環境中嘗試使用 Solidity 程式碼,效果很好。這聽起來可能很愚蠢,但是在您更改智能合約程式碼並重新部署它之後,您是否將文件添加到儲存中?因為它是一個新的智能合約、新地址、新儲存。我自己,我擺脫了 Ganache,因為生產網路(go-ethereum)的行為不同

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