我不知道为什么不能像我想要的那样分配字符串大小
i don't know Why string size can't be allocated as much as i want in solidity
这是我的 solidity 代码。
我想 return 通过我的函数 getDeals()
在以太坊区块链上存储一些数据
但是当我在 remix 上调用 getDeals() 函数时,它死了。看起来像是运行时错误之类的。
事实证明 str 大小还不够。它只有32字节。
所以我修改了我的代码如下,但它仍然无法正常工作。
是因为 space 不够用。
我这么认为的原因是,return32 字节的大小很好。
有没有人为什么不能像我想要的那样分配字符串大小?
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 虚拟机问题,因为我在混音中的 Javascript 虚拟机上进行了测试。我认为这是 vm 的内存问题。我检查了这段代码在 rinkeby testnet 上运行良好。
这是我的 solidity 代码。
我想 return 通过我的函数 getDeals()
在以太坊区块链上存储一些数据但是当我在 remix 上调用 getDeals() 函数时,它死了。看起来像是运行时错误之类的。
事实证明 str 大小还不够。它只有32字节。
所以我修改了我的代码如下,但它仍然无法正常工作。 是因为 space 不够用。
我这么认为的原因是,return32 字节的大小很好。
有没有人为什么不能像我想要的那样分配字符串大小?
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 虚拟机问题,因为我在混音中的 Javascript 虚拟机上进行了测试。我认为这是 vm 的内存问题。我检查了这段代码在 rinkeby testnet 上运行良好。