Arrays
返回動態數組:氣體不足
我正在嘗試將一個動態結構數組從 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]; } }