我怎样才能返回一个坚固的结构数组?

     2023-02-18     117

关键词:

【中文标题】我怎样才能返回一个坚固的结构数组?【英文标题】: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);

在这种情况下编辑以解决有关storagememory 的评论问题

本地存储变量是指向状态变量的指针(总是在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[] 索引参数应包含您要访问的索引。

最好的

【讨论】:

如果我有一个多维数组,我怎样才能只访问第一个维度的第一个值?

】如果我有一个多维数组,我怎样才能只访问第一个维度的第一个值?【英文标题】:IfIhaveamultidimentionalarray,howcanIacsessonlythefirstvalueofthefirstdimention?【发布时间】:2015-07-2202:08:23【问题描述】:如果我有一个多维数组,我怎样才... 查看详情

为啥 chr() 返回一个十六进制值,我怎样才能让它只返回字符 [重复]

】为啥chr()返回一个十六进制值,我怎样才能让它只返回字符[重复]【英文标题】:Whydoeschr()returnahexvalueandhowcanimakeitonlyreturncharacters[duplicate]为什么chr()返回一个十六进制值,我怎样才能让它只返回字符[重复]【发布时间】:2022-01-... 查看详情

给定一个旋转的排序数组,我怎样才能找到该数组中的最大值?

】给定一个旋转的排序数组,我怎样才能找到该数组中的最大值?【英文标题】:Givenarotatedsortedarray,howcanIfindthelargestvalueinthatarray?【发布时间】:2015-03-1201:59:34【问题描述】:我对此进行了很多思考,但无法找到最佳解决方案。... 查看详情

我怎样才能制作一个可能有也可能没有定义的字段的结构?

】我怎样才能制作一个可能有也可能没有定义的字段的结构?【英文标题】:HowcanImakeastructwhichmayormaynothaveafielddefined?【发布时间】:2021-10-0222:20:57【问题描述】:我正在研究多项式的实现,它在整数系数的情况下使用C库。但是... 查看详情

我怎样才能对变量或数组有多个值

】我怎样才能对变量或数组有多个值【英文标题】:HowcanIhadmultiplevaluestoavariableoranArray【发布时间】:2019-09-2114:03:26【问题描述】:我在下面有一个有效的查询。但是我需要使OWNRSHP_ID成为一个变量,我可以提供一个OWNRSHP_ID列表... 查看详情

我怎样才能坚持protobuf网可为空值的数组

参考技术Aprotobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。protobufrepeated类型相当于std的ve... 查看详情

我怎样才能得到一个结果? SQL: CASE 返回两行

】我怎样才能得到一个结果?SQL:CASE返回两行【英文标题】:HowcanIgetjustoneresult?SQL:CASEReturnstworows【发布时间】:2021-03-2214:24:38【问题描述】:我有两个用于汽车信息的表格,用于确定他们拥有哪种类型的发动机。因此,我需要第... 查看详情

我怎样才能把这个聊天机器人变成一个扫描用户输入的数组

】我怎样才能把这个聊天机器人变成一个扫描用户输入的数组【英文标题】:Howcaniturnthischatterbotintoanarraythatscansuserinput【发布时间】:2018-03-2623:01:26【问题描述】:嘿,所以基本上我有一个任务来制作一个简单的聊天机器人,他... 查看详情

我怎样才能洗牌一个单词的字母?

】我怎样才能洗牌一个单词的字母?【英文标题】:HowcanIshufflethelettersofaword?【发布时间】:2014-01-0212:49:21【问题描述】:对数组中单词的字母进行洗牌的最简单方法是什么?我在一个数组中有一些单词,我随机选择一个单词,... 查看详情

从下标运算符重载中返回一个数组

...法返回整个数组,因为我只能从数组中返回一个元素,我怎样才能获得返回整个数组的方法?例如:int&P 查看详情

我怎样才能做一个不同的总和?

】我怎样才能做一个不同的总和?【英文标题】:HowcanIdoadistinctsum?【发布时间】:2015-08-1723:13:07【问题描述】:我正在尝试创建一个“分数”统计数据,该数据源自某个列的值,计算为案例表达式的总和。不幸的是,查询结构... 查看详情

我怎样才能解构这个阵列?(代码片段)

ESLint建议我将数组下面的结构转换为ES6风格(prefer-destructuring)。是否有可能对此进行解构?params[key]=params[key].split('?')[0];答案使用数组解构,您将左侧放在[...]中,其中每个元素对应于您想要的右侧元素。在这种情况下,您只需... 查看详情

如何从带有组件的 vuejs 返回一个普通数组?

...(this.activeBeers)时,我没有得到一个数组而是一个对象。我怎样才能得到一个普通数组而不是一个对象?Vue 查看详情

我怎样才能只返回我的 String 方法的一部分?

】我怎样才能只返回我的String方法的一部分?【英文标题】:HowcanIonlyreturnapartofmyStringmethod?【发布时间】:2013-11-1622:43:01【问题描述】:我有一个String方法,我只想返回if语句之后的部分,而不是else!我已经尝试过try&catch但... 查看详情

java示例代码_-我怎样才能通过一个字符串字段对SomeClass对象数组进行最有效的排序

java示例代码_-我怎样才能通过一个字符串字段对SomeClass对象数组进行最有效的排序 查看详情

如何存储Java中方法返回的数组

...】:我想将一个方法返回的数组存储到另一个数组中。我怎样才能做到这一点?publicint[]method()intz[]=1,2,3,5;returnz;当我调用这个方法时,如何将返回的数组(z)存储到另一个数组中?【问题讨论】:你的意思是复制数组,还 查看详情

从谷歌云存储下载 excel 文件返回一个缓冲区,我怎样才能返回实际的 excel 文件,以便我可以在我的处理程序中写入它?

】从谷歌云存储下载excel文件返回一个缓冲区,我怎样才能返回实际的excel文件,以便我可以在我的处理程序中写入它?【英文标题】:DownloadingexcelfilefromGoogleCloudstoragereturnsabuffer,howcanIreturntheactualexcelfilesoIcanwritetoitinmyhandler?【发... 查看详情

如何将一个元素数组作为单列/列表返回? [复制]

...面的函数,它会返回如下内容:1,2,3,4-这是预期的,但我怎样才能将单列返回到这样的textarea字段?1234.functionReturnSingleColumnFromArr 查看详情