Arrays

返回動態數組:氣體不足

  • July 23, 2018

我正在嘗試將一個動態結構數組從 Solidity 函式返回給客戶端。由於我需要建構結果,因此我聲明了一個儲存變數並向其中添加元素:

function conversations(address user) public view returns (Conversation[]){
   Conversation[] userConversations;
   userConversations.push(conversations[0]);
   return userConversations;
}

但是,我在 Truffle 測試中不斷遇到out of gas異常。當它是一個視圖功能時,它怎麼會耗盡燃料呢?我知道這userConversations是一個儲存變數(或者我將無法對其執行push),但它真的會修改合約的狀態嗎?如果是這樣,您如何重寫它以便獲得動態數組?

userConversations.push(對話

$$ 0 $$);

肯定會修改狀態,因此不能在view函式中使用。您基本上需要為此 setter 函式編寫一個 getter 函式或userConversations公開,在這種情況下,它將自動獲取一個 getter 函式。

您會耗盡精力,因為您Conversation[] userConversations;認為在記憶體中的內容實際上是在儲存中。

嘗試將其更改為Conversation[] memory userConversations;,您將看到它不再編譯,因為.push它在記憶體陣列上不可用。

你試試這個怎麼樣:


function getConversations() public view returns (Conversation [] userConversations) {
   uint length = conversations.length;
   userConversations = new Conversation[](length);
   for (uint i = 0; i < length; i++) {
       userConversations[i] = conversations[i];
   }
}

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