基于双数组实现Set功能(基于Solidity)

1、背景

在以太坊NFT中,需要使用Set进行NFT(本质是存的NFT的唯一ID)的存储,以太坊本身没有Set的概念,只有数组。基于单数组实现Set,每次删除value,都需要遍历数组然后逐个调整,由于太坊执行操作需要消耗gas,这种调整比较消耗gas,因此会基于双数组来实现删除功能。

 

2、原理图

3、solidity代码实现

mapping(address => uint256[]) internal ownerTokens;
mapping(uint256 => uint256) internal tokenIndexs;
mapping(uint256 => address) internal tokenOwners;

function addTokenTo(address to, uint256 tokenId) internal {
     uint256[] storage tokens = ownerTokens[to];
     tokenIndexs[tokenId] = tokens.length;
     tokens.push(tokenId);
     tokenOwners[tokenId] = to;
}
    

function removeTokenFrom(address from, uint256 tokenId) internal {
     uint256 index = tokenIndexs[tokenId];
     uint256[] storage tokens = ownerTokens[from];
     uint256 indexLast = tokens.length - 1;
        
     uint256 tokenIdLast = tokens[indexLast];
     tokens[index] = tokenIdLast;
     tokenIndexs[tokenIdLast] = index;
     tokens.pop();
        
     delete tokenOwners[tokenId];
}

添加操作

1、tokenIndexs是一个数组,它的下标是要保存的tokenId,它的值是当前tokenId的数量,比如第一次存入tokenId=7的NFT,当前没有NFT,那么tokenIndexs[7] = 0,第二次存入tokenId=5的NFT,当前有一个NFT,那么tokenIndexs[5] = 1,第三次存入tokenId=9的NFT,当前有两个NFT,那么tokenIndexs[9] = 2

2、tokens是一个数组,它保存了所有的tokenId,上面三次操作后tokens=[7,5,9]

删除操作,删除tokenId=7

1、将最近加入的元素设置到要删除元素的位置,也就是tokenIndexs[9] = tokenIndexs[7] ,由于tokenIndexs[7] =0,这时候tokenIndexs[9]就是0,然后让tokens[0]=9

2、然后调用pop删除tokens最后一个元素

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值