string - 我不知道为什么字符串大小不能像我想要的那样在solidity中分配
问题描述
这是我的可靠代码。
我想通过我的函数 getDeals() 返回一些存储在以太坊区块链上的数据
但是当我在 remix 上调用 getDeals() 函数时,它就死了。它看起来像运行时错误或其他东西。
结果发现 str 大小还不够。它只有 32 字节。
所以我修改了我的代码,如下所示,但它仍然无法正常工作。是因为空间不够。
我之所以这么认为,它返回了 32 字节大小。
有没有人为什么不能分配我想要的字符串大小?
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, "", "", "");
}
}
解决方案
哦,我终于明白了,分享一下。看起来是关于 javascript vm 问题,因为我在 remix 中测试了 Javascript VM。我认为这是vm的内存问题。我检查了这段代码在 rinkeby 测试网上运行良好。