Solidity

從結構數組返回字節

  • May 15, 2018

在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;        
   }

}

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