我不知道为什么字符串大小不能像我想的那样分配得太多

时间:2018-12-07 09:30:17

标签: string ethereum solidity

这是我的验证码。

我想通过我的函数getDeals()返回以太坊区块链上的一些存储数据

但是当我在remix上调用getDeals()函数时,它死了。看起来像是运行时错误之类的。

结果发现str大小还不够。只有32字节。

所以我像下面那样修改了我的代码,但仍然无法正常工作。 这是因为空间不足。

我这么认为的原因,它以32byte大小返回了很好的结果。

有没有人为什么不能分配我想要的字符串大小?

pragma solidity ^0.4.25;

import "./TokenERC20.sol";

contract TradingBook is Pausable {


struct Deal {
  string dealNo;
  string price;
  string buyer;
  string seller;
} 


Deal[] public arrDeals;


function recordDeal(string _dealNo, string _price, string _buyer, string _seller) onlyOwner external {
    Deal memory newData = Deal(_dealNo, _price, _buyer, _seller);
    arrDeals.push(newData);
}

function getDeals() external view returns(string) {
    string memory str = new string(256 * arrDeals.length);

    for(uint i=0; i<arrDeals.length; i++){
        str = "{";
        str = _strConcat(str, "\"dealNo\":\"", arrDeals[i].dealNo, "\",");
        str = _strConcat(str, "\"price\":\"", arrDeals[i].price, "\",");
        str = _strConcat(str, "\"buyer\":\"", arrDeals[i].buyer, "\",");
        str = _strConcat(str, "\"seller\":\"", arrDeals[i].seller, "\"}");
    }
    return str;
}


function _strConcat(string _a, string _b, string _c, string _d, string _e) internal pure returns (string){
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    bytes memory _bc = bytes(_c);
    bytes memory _bd = bytes(_d);
    bytes memory _be = bytes(_e);
    string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
    bytes memory babcde = bytes(abcde);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
    for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
    for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
    for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
    for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
    return string(babcde);
}

function _strConcat(string _a, string _b, string _c, string _d) internal pure returns (string) {
    return _strConcat(_a, _b, _c, _d, "");
}

function _strConcat(string _a, string _b, string _c) internal pure returns (string) {
    return _strConcat(_a, _b, _c, "", "");
}

function _strConcat(string _a, string _b) internal pure returns (string) {
    return _strConcat(_a, _b, "", "", "");
}

}

1 个答案:

答案 0 :(得分:0)

哦,我终于知道了并分享。它似乎与javascript vm问题有关,因为我在混音中对Javascript VM进行了测试。我认为这是虚拟机的内存问题。我已经在rinkeby testnet上很好地检查了这段代码。