SolidityFoundry BitMap

news2024/11/17 1:46:29

        写合约的时候,记录某个账户的bool状态很常见,例如是否领取空投等,传统的写法mapping(uint256=>bool)中一个slot只能存储一个账户的信息,在其他语言中,我们经常会用到bitmap来表示标志位,如果我们可以将bitmap应用到合约中,可以节约很多gas;今天我们就开发一种适合solidity的bitmap;

solidityproject/BitMap at master · XuHugo/solidityproject · GitHubDApp go go go !!!. Contribute to XuHugo/solidityproject development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/XuHugo/solidityproject/tree/master/BitMap

代码分析

        首先我们定义一个mapping(uint256 => uint256)的变量,key表示第几个word,value表示对应word的bit情况;这样一个slot就可以表示256个key的情况,效率大大的提高了。

        只有两个函数,一个读,一个写;操作逻辑都是一样的,对于给定的index,先判断位于哪个一个word,在判断在word的哪个bit;然后在进行读写操作;

contract BitMap {
    mapping(uint256 => uint256) private BitMap;

    function get(uint256 index) public view returns (bool) {
        uint256 WordIndex = index / 256;
        uint256 BitIndex = index % 256;
        uint256 Word = BitMap[WordIndex];
        uint256 mask = (1 << BitIndex);
        return Word & mask == mask;
    }

    function set(uint256 index, bool flag) public {
        uint256 WordIndex = index / 256;
        uint256 BitIndex = index % 256;
        if (flag) {
            BitMap[WordIndex] = BitMap[WordIndex] | (1 << BitIndex);
        } else {
            BitMap[WordIndex] = BitMap[WordIndex] & ~(1 << BitIndex);
        }
    }
}

foundry测试:

        测试也没什么说的,比较简单;index之所以写成加法,是为了方便大家理解。

contract BitMapTest is Test {
    BitMap bitmap;

    function setUp() public {
        bitmap = new BitMap();
        bitmap.set(8, true);
        bitmap.set(256 + 8, true);
        bitmap.set(256 + 256 + 8, true);
    }

    function testGet() public {
        assertEq(bitmap.get(8), true);
        assertEq(bitmap.get(80), false);
        assertEq(bitmap.get(256 + 8), true);
        assertEq(bitmap.get(256 + 256 + 8), true);
    }

    function testSet() public {
        bitmap.set(256 + 256 + 256 + 256 + 8, true);
        assertEq(bitmap.get(256 + 256 + 256 + 256 + 8), true);
    }
}

        这个小功能是我读一个项目的时候发现的,觉得不错,就尝试的写了一下,结果发现openzeppelin里也有这个功能,大家用的时候,可以直接引用了,就不要自己写了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银行卡三要素验证如何用Java进行调用

一、什么是银行卡三要素验证&#xff1f; 银行卡三要素验证又叫银行卡三要素核验、银行卡三要素校验、银行卡实名认证、银行卡三元素验证&#xff0c;即输入银行卡卡号、姓名、身份证号码&#xff0c;验证此三要素是否一致&#xff0c;该接口支持所有带银联标识的银行卡。 二…

langchain入门系列之五 初探代理

代理的核心思想是使用LLM来选择要采取的一系列动作。 在链式结构中&#xff0c;一系列动作是硬编码的&#xff08;在代码中&#xff09;。 在代理中&#xff0c;使用语言模型作为推理引擎来确定要采取的动作及其顺序。 代理 这是负责决定下一步采取什么动作的类。 这是由语言…

lidar3607.2 lidar360mls7.2 强大的雷达点云数据处理应用软件

1、LiDAR360是一款强大的激光雷达点云数据处理和分析平台&#xff0c;拥有超过10种先进的点云数据处理算法&#xff0c;可同时处理超过300G点云数据。平台包含丰富的编辑工具和自动航带拼接功能&#xff0c;可为地形、林业、矿山和电力行业&#xff08;参考LiPowerline软件&…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…

前端使用canvas绘制简单工作流-react

效果图如下&#xff1a; 目前只做了绘制部分&#xff0c;绘制方式也比较简单&#xff0c;点击工具栏中需要绘制的图形&#xff0c;在画布上左键点击将会绘制一个图形出来&#xff0c;工具栏选中第一个&#xff0c;再点击其他图像&#xff0c;长按鼠标左键可以移动&#xff0c;删…

丢掉Beyond Compare吧!新款文件差异对比工具WinMerge更具性价比!

今天想和大家分享一款非常实用的免费开源文件比较工具&#xff1a;WinMerge。 作为一名长期从事互联网行业的人&#xff0c;我经常需要处理大量的文档和代码文件&#xff0c;文件对比工具在我的日常工作中可谓是必不可少的“左膀右臂”。 也相信很多朋友在处理多个文档内容或者…

96页PPT集团战略解码会工具与操作流程

德勤集团在战略解码过程中通常会用到以下一些具体工具&#xff1a; 一、平衡计分卡&#xff08;Balanced Scorecard&#xff09; 财务维度&#xff1a; 明确关键财务指标&#xff0c;如营业收入、利润、投资回报率等。你可以通过分析历史财务数据和行业趋势&#xff0c;确定…

HUSB381A:带线PD适配器的绝佳选择

HUSB381A是慧能泰半导体全新推出的一款采用SOP8封装&#xff0c;集成MOS的USB PD Source芯片&#xff0c;带CC1和CC2引脚&#xff0c;支持不可分离线缆&#xff08;Captive Cable&#xff09;PD适配器和纯PD快充充电器应用。HUSB381A支持最大功率20V5A 100W应用&#xff0c;支持…

单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(一)方案架构

本文介绍使用单片机RA8889来驱动和控制彩屏的最小方案。文章从RA8889的架构功能、硬件电路设计及软件设计三个方面来说明。 小编已发布多篇文章介绍了单片机RA8889来驱动控制彩屏&#xff0c;但是仍有不少单片机玩家可能对驱动彩屏还不算熟悉&#xff0c;在此加推一个短篇介绍…

审计发现 FBI 的数据存储管理存在重大漏洞

据The Hacker News消息&#xff0c;美国司法部监察长办公室 &#xff08;OIG&#xff09; 的一项审计发现&#xff0c; FBI 在库存管理和处置涉及机密数据的电子存储媒体方面存在“重大漏洞”。 OIG 的审计显示&#xff0c;FBI 对包含敏感但未分类 &#xff08;SBU&#xff09…

橙子投屏,轻松连接大屏幕

对于某腾、某爱、某酷投屏大家在熟悉不过了吧&#xff0c;一款非常好用的投屏软件&#xff0c;但是使用起来还是限制颇多&#xff0c;比如有犷郜&#xff0c;还必须同步使用手机App才能实现投屏功能&#xff0c;关键还得开会员&#xff0c;劝退不少小伙伴。但是现在手机往往占据…

API代理指南:跨境业务的数据桥梁

在当今全球化的经济环境中&#xff0c;跨境业务已成为企业拓展国际市场、实现业务增长的重要途径。但面临着法律法规差异、网络复杂性和数据安全等诸多挑战。为了有效应对这些挑战&#xff0c;API&#xff08;应用程序编程接口&#xff09;代理成为了跨境业务中不可或缺的一部分…

接口自动化框架设计必备利器之参数传递

在我们设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML&#xff09;中&#xff0c;实现测试脚本与测试数据解耦&#xff0c;方便后期维护。 当涉及到业务场景接口用例时&#xff0c;由于接口与接口存在关联关系&#xff…

5步掌握Python Django开发办公管理系统核心技巧

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

Unity实现棋盘方格

本文参考&#xff1a;p1_哔哩哔哩_bilibili 一、精要提炼 1、Button自带的白色底图是圆角的&#xff0c;Image组件自带的白色底图是方角的。 2、2D中Instantiate指定的位置为屏幕坐标系的位置&#xff0c;左下角为(0,0) 3、求某个组件的位置&#xff1a;xx.transform.posi…

(javaweb)事务管理+AOP

目录 1.spring事务管理 2.rollbackFor&#xff08;异常回滚属性&#xff09; 3.propagation&#xff08;事物传播行为&#xff09; AOP基础 1.AOP概述 AOP快速入门 AOP核心概念 APO进阶 1.通知类型 2.通知顺序 3.切入点表达式 4.连接点 5.AOP案例 1.spring事务管理…

谷歌浏览器翻译不了网页怎么解决

谷歌浏览器的网页翻译功能因其便捷性和高效性&#xff0c;成为了许多用户跨语言浏览的重要工具。然而&#xff0c;有时候用户可能会遇到无法使用谷歌浏览器翻译网页的情况。接下来将为大家分析为何谷歌浏览器翻译不了网页以及解决方法&#xff0c;希望对你有所帮助。&#xff0…

从dxf文件中提取spline曲线

1.使用的工具 libDxf-负责解析dxf文件&#xff0c;提取图形元素 open_Nurbs-负责spline曲线的计算 2.效果如下 左图是CAD绘制的spline曲线&#xff0c;右图是程序中显示的曲线&#xff0c;红色点是在CAD中作图时鼠标点击的拟合点。 3.main.cpp代码 #include"zmDXF.h&…

【香橙派系列教程】(十五) VSCode SSH远程连接开发板,以香橙派为例

【十五】VSCode远程连接香橙派 文章目录 【十五】VSCode远程连接香橙派第一步&#xff1a;安装vscode第二步&#xff1a;安装Remote Development第三步&#xff1a;字体设置第四步&#xff1a;配置远程连接第五步&#xff1a;配置远程目录 第一步&#xff1a;安装vscode 之前发…

SuperMap WebGPA外部大数据集群部署实践

SuperMap WebGPA外部大数据集群部署实践 特别说明&#xff1a;部署前准备&#xff1a; 1.安装包说明2. 许可配置3. 机器情况部署过程说明&#xff1a; 1.设置ip主机名映射&#xff08;主机ip需要固定ip&#xff09;2. 查看防火强状态&#xff0c;关闭防火墙3. 新建用户&#…