Solidity
從結構數組返回字節
在solidity中,我是否以字節為單位返回數組或結構。
這不是這個問題的重複,因為該解決方案總是返回錯誤:new BigNumber() not a number:$$ object Object $$
pragma solidity ^0.4.2; contract Something { mapping (address => Ton[]) allTons; struct Ton { uint id; string name; bool access; } function Something() public { allTons[msg.sender].push(Ton({ id: 1, name: "CoolDude", access: true })); allTons[msg.sender].push(Ton({ id: 2, name: "NotCoolDude", access: false })); } function GiveBytes() public constant returns(bytes){ // unsure } }
我擺弄它,直到它起作用。
可能有一個更優雅的解決方案,但應該警告您返回數組和結構是非常新的。此外,它不會像這種模式那樣擴展。
如果需要整個表,通過依賴客戶端迭代函式,這將具有任何規模的固定 gas 成本。
pragma solidity ^0.4.18; contract Something { mapping (address => Ton[]) allTons; struct Ton { uint id; string name; bool access; } function Something() public { allTons[msg.sender].push(Ton({ id: 1, name: "CoolDude", access: true })); allTons[msg.sender].push(Ton({ id: 2, name: "NotCoolDude", access: false })); } // fish them out one row at a time // and return a simpler response. function getTonAtRow(address user, uint row) public constant returns(uint, string, bool) { return(allTons[user][row].id, allTons[user][row].name, allTons[user][row].access); } }
更多細節在這裡:Solidity 是否有很好解決且簡單的儲存模式?
希望能幫助到你。
只需將您的映射 AllTons 聲明為 public,您將獲得一個預設的 getter 函式,該函式接受一個地址和數組的索引。然後定義一個函式來返回數組中的項目數,給定一個地址。迭代 getter 函式以獲取所有項目。
pragma solidity ^0.4.23; contract Something { mapping (address => Ton[]) public allTons; struct Ton { uint id; string name; bool access; } constructor() public { allTons[msg.sender].push(Ton({ id: 1, name: "CoolDude", access: true })); allTons[msg.sender].push(Ton({ id: 2, name: "NotCoolDude", access: false })); } // Get the items count first, // then use the default allTons getter to get each item. function getTonCount(address _address) public view returns (uint _count) { _count = allTons[_address].length; } }