我怎样才能返回一个坚固的结构数组?
Posted
技术标签:
【中文标题】我怎样才能返回一个坚固的结构数组?【英文标题】:How can I return an array of struct in solidity? 【发布时间】:2018-07-30 09:09:09 【问题描述】:我正在为进行投标的以太坊智能合约设计一个解决方案。用例包括保留名称,例如。 “myName”并分配给一个地址。然后,人们可以竞标该名称(在本例中为 myName)。可以针对多个名称进行多次此类出价。
struct Bid
address bidOwner;
uint bidAmount;
bytes32 nameEntity;
mapping(bytes32 => Bid[]) highestBidder;
因此,如您在上面看到的,Bid 结构保存一个投标人的数据,类似地,映射highestBidder 中的键(例如myName)指向此类投标人的数组。
现在,当我尝试返回诸如highestBidder[myName]之类的内容时,我遇到了一个问题。
显然,solidity 不支持返回结构数组(动态数据)。我要么需要重新构建我的解决方案,要么找到一些解决方法来使其工作。
如果你们对这个问题有任何疑问,请告诉我,我会尽力说清楚。
我被困在这里,任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:正如您所提到的,Solidity 尚不支持此功能。权力正在计划改变它,所以你可以,但现在,你必须检索元素的数量,然后将分解的结构作为元组检索。
function getBidCount(bytes32 name) public constant returns (uint)
return highestBidder[name].length;
function getBid(bytes32 name, uint index) public constant returns (address, uint, bytes32)
Bid storage bid = highestBidder[name][index];
return (bid.bidOwner, bid.bidAmount, bid.nameEntity);
在这种情况下编辑以解决有关storage
与memory
的评论问题
本地存储变量是指向状态变量的指针(总是在storage
中)。来自Solidity docs:
局部变量x的类型是uint[] storage,但是由于storage不是动态分配的,所以必须从状态变量中赋值才能使用。因此不会为 x 分配存储空间,而是仅用作存储中预先存在的变量的别名。
这是指使用的变量为uint[] x
的示例。这同样适用于我的代码Bid bid
。换句话说,不会创建新的存储。
在成本方面:
getBid("foo", 0)
使用 Bid memory bid
:
getBid("foo", 0)
使用Bid storage bid
:
在这种情况下,storage
更便宜。
【讨论】:
这解决了我的问题,谢谢!只是有点怀疑您为什么在答案中使用“出价存储出价”。我们可以使用“内存”,这样可以节省一些gas。 @AdamKipnis 您使用哪个工具来获取以上屏幕截图的详细信息? txn cost Vs execution cost 和“解码的输入数据”等信息非常有用。 来自 Remix (remix.ethereum.org) 中的交易结果。【参考方案2】:以solidity返回结构数组? 在下面的函数中 getBid 返回出价结构数组。
contract BidHistory
struct Bid
address bidOwner;
uint bidAmount;
bytes32 nameEntity;
mapping (uint => Bid) public bids;
uint public bidCount;
constructor() public
bidCount = 0;
storeBid("address0",0,0);
storeBid("address1",1,1);
function storeBid(address memory _bidOwner, uint memory _bidAmount, bytes32 memory _nameEntity) public
bids[tripcount] = Bid(_bidOwner, _bidAmount,_nameEntity);
bidCount++;
//return Array of structure
function getBid() public view returns (Bid[] memory)
Bid[] memory lBids = new Bid[](tripcount);
for (uint i = 0; i < bidCount; i++)
Bid storage lBid = bids[i];
lBids[i] = lBid;
return lBids;
【讨论】:
【参考方案3】:关于“返回结构数组”...只是一个小的解决方法,以便返回从medium 中提取的结构数组
pragma solidity ^0.4.13;
contract Project
struct Person
address addr;
uint funds;
Person[] people;
function getPeople(uint[] indexes)
public
returns (address[], uint[])
address[] memory addrs = new address[](indexes.length);
uint[] memory funds = new uint[](indexes.length);
for (uint i = 0; i < indexes.length; i++)
Person storage person = people[indexes[i]];
addrs[i] = person.addr;
funds[i] = person.funds;
return (addrs, funds);
uint[] 索引参数应包含您要访问的索引。
最好的
【讨论】:
以上是关于我怎样才能返回一个坚固的结构数组?的主要内容,如果未能解决你的问题,请参考以下文章