写了个排序合约,采用链表的方式保存
不知道到了后期链表越来越长,会不会造成后面的用户进来,交互一次的GAS直接爆炸,因为交互的时候需要循环遍历链表,然后把数据插入到指定的位置
?
代码如下,我好像已经看到GAS爆炸的一幕了?

//按dna大小排列的链表
mapping(uint256 => uint256) private mNextStudents;
//链表的头
uint256 private constant GUARD = 10000;
constructor() public {
mNextStudents[GUARD] = GUARD;
}
//prevTokenid.dna大于等于_newDna且_newDna>_nextTokenid.dna
function _verifyIndex(
uint256 _prevTokenid,
uint256 _newDna,
uint256 _nextTokenid
) private view returns (bool) {
return
(_prevTokenid == GUARD || mTigers[_prevTokenid].dna >= _newDna) &&
(_nextTokenid == GUARD || _newDna > mTigers[_nextTokenid].dna);
}
//遍历寻找当前插入位置
function _findIndex(uint256 _newDna) private view returns (uint256) {
uint256 tokenid = GUARD;
while (true) {
if (_verifyIndex(tokenid, _newDna, mNextStudents[tokenid])) {
return tokenid;
}
tokenid = mNextStudents[tokenid];
}
}
//添加NFT链表
function _addTiger(uint256 _tokenid) private {
uint256 tokenid = _findIndex(mTigers[_tokenid].dna);
//指向tokenid原先指向的id
mNextStudents[_tokenid] = mNextStudents[tokenid];
//tokenid指向当前ID
mNextStudents[tokenid] = _tokenid;
}
//获取排名
function _getTop(uint256 _top)
internal
view
virtual
returns (uint256[] memory _res)
{
_res = new uint256[](_top);
uint256 tokenid = mNextStudents[GUARD];
for (uint256 i = 0; i < _top; i++) {
if (tokenid != GUARD) {
_res[i] = tokenid;
tokenid = mNextStudents[tokenid];
} else {
_res[i] = 999;
}
}
}