0

假设我们在 Solidity 合约中有以下结构:

struct EntityA {
string lessThen32ByteString1;
string moreThen32ByteString1;
string lessThen32ByteString2;
string moreThen32ByteString3;
bool flag;
uint var1;
uint var2;
uint var3;
uint var4;
ProposalStatus proposalStatus;}

// 100K entities EntityA[] public items;

我们现在有以下实现(带有用于字符串到 byte32 转换的辅助函数,将字符串拆分为几个 byte32 部分等等):

function getChunkOfPart1EntityADetails(uint filterAsUint, uint offset, uint limit) public constant
returns (bytes32[100] lessThen32ByteString1Arr, bytes32[100] moreThen32ByteString1PrefixArr, bytes32[100] moreThen32ByteString1SuffixArr) {
}

function getChunkOfPart2EntityADetails(uint filterAsUint, uint offset, uint limit) public constant
returns (bytes32[100] lessThen32ByteString2Arr, bytes32[100] moreThen32ByteString2PrefixArr, bytes32[100] moreThen32ByteString2SuffixArr) {
}

function getChunkOfPart3EntityADetails(uint filterAsUint, uint offset, uint limit) public constant
returns (bool[100] flagArr, uint[100] var1Arr, uint[100] var2Arr, uint[100] var3Arr, uint[100] var4Arr, ProposalStatus[100] proposalStatusArr,) {
}

从设计的角度来看,当前的实现看起来并不好,此外,由于缺少任何查询语言支持,每个额外的过滤器支持都需要更改合同。

用例示例:根据指定的 proposalStatus 和偏移量 50 检索 10 个实体(第 6 页,页面大小为 10 个实体(可能是 20、50、100))

4

1 回答 1

1

我知道我迟到了,但你走了。这将返回一个 uint 数组。然后,您可以在客户端上使用此数组来解析存储数据的数组的 getter 中的 id。

struct Zombie {
  //data
};

Zombie[] public zombies;

function paginateAllZombies(uint _resultsPerPage, uint _page) external view returns (uint[]) {
  Zombie[] memory result = new Zombie[](_resultsPerPage);
  for(uint i = _resultsPerPage * _page - _resultsPerPage; i < _resultsPerPage * _page; i++ ){
      result[i] = i;
    } //CONVERT TO SAFEMATH
    return result;
}

所以一旦你得到这个返回,你就可以在你的客户端应用程序中 .map() 结果并调用zombies(uint _index)。

如果您需要有关此方法的更多详细信息,请查看cryptozombies.io

不确定这是否是最好的方法。

希望将来您可以这样做:

function paginateAllZombies(uint _resultsPerPage, uint _page) external view returns (Zombie[]) {
  uint[] memory result = new uint[](_resultsPerPage);
  for(uint i = _resultsPerPage * _page - _resultsPerPage; i < _resultsPerPage * _page; i++ ){
      result[i] = zombies[i];
    } //CONVERT TO SAFEMATH
    return result;
}
于 2018-03-19T23:32:47.337 回答