Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

news/2024/4/29 4:16:25/文章来源:https://blog.csdn.net/michael_wgy_/article/details/132002628

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

      • 0. 版本
        • 0.1 SignedMath.sol
      • 1. 目标合约
      • 2. 代码精读
        • 2.1 max(int256 a, int256 b) && min(int256 a, int256 b)
        • 2.2 average(int256 a, int256 b)
        • 2.3 abs(int256 n)

0. 版本

[openzeppelin]:v4.8.3,[forge-std]:v1.5.6

0.1 SignedMath.sol

Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/utils/math/SignedMath.sol

SignedMath库提供了solidity中尚未内置的标准有符号数的数学运算方法。

1. 目标合约

封装SignedMath library成为一个可调用合约:

Github: https://github.com/RevelationOfTuring/foundry-openzeppelin-contracts/blob/master/src/utils/math/MockSignedMath.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;import "openzeppelin-contracts/contracts/utils/math/SignedMath.sol";contract MockSignedMath {using SignedMath for int;function max(int a, int b) external pure returns (int) {return a.max(b);}function min(int a, int b) external pure returns (int) {return a.min(b);}function average(int a, int b) external pure returns (int){return a.average(b);}function abs(int n) external pure returns (uint) {return n.abs();}
}

全部foundry测试合约:

Github: https://github.com/RevelationOfTuring/foundry-openzeppelin-contracts/blob/master/test/utils/math/SignedMath.t.sol

2. 代码精读

2.1 max(int256 a, int256 b) && min(int256 a, int256 b)

  • max(int256 a, int256 b):求两个有符号数中的最大值;
  • min(int256 a, int256 b):求两个有符号数中的最小值。
    function max(int256 a, int256 b) internal pure returns (int256) {// 通过三元运算符来求二者中的最大值return a > b ? a : b;}function min(int256 a, int256 b) internal pure returns (int256) {// 通过三元运算符来求二者中的最小值return a < b ? a : b;}

foundry代码验证

contract SignedMathTest is Test {MockSignedMath msm = new MockSignedMath();function test_Max() external {assertEq(msm.max(1, 2), 2);assertEq(msm.max(- 1, - 2), - 1);assertEq(msm.max(- 1, 1), 1);assertEq(msm.max(- 1, 0), 0);assertEq(msm.max(1, 0), 1);}function test_Min() external {assertEq(msm.min(1, 2), 1);assertEq(msm.min(- 1, - 2), - 2);assertEq(msm.min(- 1, 1), - 1);assertEq(msm.min(- 1, 0), - 1);assertEq(msm.min(1, 0), 0);}
}

2.2 average(int256 a, int256 b)

求两个有符号整数的平均值,结果向零取整。

注:对比传统解法(a+b)/2,本方法不会在a和b足够大或足够小时产生溢出。

    function average(int256 a, int256 b) internal pure returns (int256) {// 具体位运算的数学依据参见书籍《Hacker's Delight》:https://baike.baidu.com/item/Hacker%27s%20Delight/6927658?fr=ge_ala// x为a&b与(a^b)/2的和。为两个uint256求均值的方法。详情见:https://learnblockchain.cn/article/6191中的2.4——average(uint256, uint256)int256 x = (a & b) + ((a ^ b) >> 1);// uint256(x) >> 255:将前面计算得出的x转成uint256后右移255位得到符号位。即如果x为负数则为1,如果未非负数则为0。// 将上述符号位转换成int256,并与a^b的结果做与运算。返回x与上述运算结果的和(即两个有符号数的均值)return x + (int256(uint256(x) >> 255) & (a ^ b));}

foundry代码验证

contract SignedMathTest is Test {MockSignedMath msm = new MockSignedMath();function test_Average() external {assertEq(msm.average(2, 4), 3);assertEq(msm.average(2, 3), 2);assertEq(msm.average(type(int).max, type(int).max - 2), type(int).max - 1);assertEq(msm.average(type(int).min, type(int).min + 2), type(int).min + 1);}
}

2.3 abs(int256 n)

求一个int256的绝对值

    function abs(int256 n) internal pure returns (uint256) {// 关闭solidity 0.8的整数运算溢出检查。为了当n为type(int).min时不发生溢出错误unchecked {// 如果n不是负数,返回uint256(n)。否则返回uint256(-n)return uint256(n >= 0 ? n : -n);}}

foundry代码验证

contract SignedMathTest is Test {MockSignedMath msm = new MockSignedMath();function test_Abs() external {assertEq(msm.abs(0), 0);assertEq(msm.abs(- 1), 1);assertEq(msm.abs(1), 1);// int256的最大正数的二进制为0+255个1assertEq(msm.abs(type(int).max), (1 << 255) - 1);// int256的最小负数的二进制为其最大正数+1,即1+255个0assertEq(msm.abs(type(int).min), 1 << 255);}
}

ps:
本人热爱图灵,热爱中本聪,热爱V神。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!

在这里插入图片描述

公众号名称:后现代泼痞浪漫主义奠基人

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blazor前后端框架Known-V1.2.8

V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

python整理

Python 整理&#xff08;更新中&#xff09; 一、环境搭建 1- 下载python解析器 下载地址&#xff1a;https://www.python.org/ 2- 安装解析器: 3.pycharm 安装操作 1- 下载pycharm 下载地址: https://www.jetbrains.com/pycharm/ pycharm开发第一个Python程序 在这…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

Flutter 使用texture_rgba_renderer实现桌面端渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频&#xff08;本…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

IDEA debug总结

调试一次编程题&#xff0c;发现没有掌握debug技巧&#xff0c;确实费事&#xff0c;做一次总结&#xff0c;方便以后回顾。 Run to Cursor 跳到光标处&#xff0c;适用于快速跳过循环&#xff0c;定位到光标处&#xff0c;而不用到处打断点&#xff0c;使用断点跳转。非常实…

Cilium系列-6-从地址伪装从IPtables切换为eBPF

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx_fc1‘

问题描述 训练模型时&#xff0c;分阶段训练&#xff0c;第二阶段加载第一阶段训练好的模型的参数&#xff0c;接着训练 第一阶段训练&#xff0c;含有代码 if (train_on_gpu):if torch.cuda.device_count() > 1:net nn.DataParallel(net)net net.to(device)第二阶段训练…

记一次 .NET 某设备监控系统 死锁分析

一&#xff1a;背景 1. 讲故事 上周看了一位训练营朋友的dump&#xff0c;据朋友说他的程序卡死了&#xff0c;看完之后发现是一例经典的死锁问题&#xff0c;蛮有意思&#xff0c;这个案例算是学习 .NET高级调试 入门级的案例&#xff0c;这里和大家分享一下。 二&#xff…

从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现

目录 1. set和map中的红黑树 2. 仿函数比较键值对 3. 红黑树迭代器的实现 3.1 迭代器 3.2 迭代器-- 3.3 map的operator[ ] 4. 完整代码 Set.h Map.h RedBlackTree.h Test.cpp 本章完&#xff0c; 1. set和map中的红黑树 前一篇红黑树的源代码&#xff1a; #pragm…

掌握Python的X篇_12_如何使用VS Code调试Python程序

本篇将会介绍如何使用VS Code调试Python程序。 文章目录 1. 什么是调试2. 断点3. 如何启动调试4. 监视窗口5. 单步 1. 什么是调试 我们可以利用VS Code对Python代码进行调试。所谓调试&#xff0c;大家可以理解成有能力将程序进行 “慢动作播放”让我们有机会看到程序一步一步…

Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例

Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像&#xff08;文生图&#xff0c;txt2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、生成流程1、文本编码2、采样流…

JetBrains 为测试自动化打造的强大 IDE-Aqua

QA 和测试工程对现代软件开发必不可少。 在 JetBrains&#xff0c;我们相信使用正确的工具对每项工作都很重要。 对我们来说&#xff0c;为自动化测试开发创建单独的工具是自然而然的事&#xff0c;因为这使我们能够满足多角色软件开发团队的需求。 我们很高兴能够推出 JetBra…

信号的学习笔记二

文章目录 信号捕捉signal信号捕捉sigaction信号集未决信号集和阻塞信号集的工作过程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b896346af6f1462089779e513a7e237b.png)信号集相关函数sigemptysetsigfillsetsigaddsetsigdelsetsigismember应用 以下函数设置内核信号集…

流数据湖平台Apache Paimon(二)集成 Flink 引擎

文章目录 第2章 集成 Flink 引擎2.1 环境准备2.1.1 安装 Flink2.1.2 上传 jar 包2.1.3 启动 Hadoop2.1.4 启动 sql-client 2.2 Catalog2.2.1 文件系统2.2.2 Hive Catalog2.2.3 sql 初始化文件 2.3 DDL2.3.1 建表2.3.2 修改表 2.4 DML2.4.1 插入数据2.4.2 覆盖数据2.4.3 更新数据…

PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案

宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案 前言一、Redis安装部署1.安装Redis2.php安装Redis扩展3.启动Redis 二、避坑指南1.6379端口配置2.Redis服务启动&#xff08;1&#xff09;Redis服务启动失败&#xff08;2&#xff09;Redis启动日志排查&#xff08;3&a…

JS-----数据结构与算法(2)

目录 三. 栈结构 1.认识栈结构 2. 封装栈结构 3. 应用 3-1 十进制转二进制 3-2 进制转换法 四. 队列 1.队列是什么&#xff1f; 2.队列的封装 3. 队列的应用-击鼓传花 4. 双端队列 5.判断是否为回文 三. 栈结构 1.认识栈结构 栈&#xff08;stack&#xff09;又…

7.29训练总结

CodeForces - 1609E 这种使得整个串不包含子串’abc’的题目&#xff0c;发现可以用线段树维护 #include<bits/stdc.h> using namespace std; const int maxn1e55; #define lson now<<1 #define rson now<<1|1 struct seg {int a,b,c;int ab,bc,abc; }tr[m…

2023 年还推荐报计算机专业吗?

计算机科学是一个很好的专业&#xff0c;因为它由各种课程组成&#xff0c;为学生在成熟和新兴专业就业做好准备。以下是一些通常属于计算机科学专业的课程&#xff1a; 基本编程介绍了用于构建和维护数字架构和基础设施的编程语言和标准。 微积分为制定高级计算和设计概念提供…

eclipse 最新版没有navigator视图如何解决

使用project exploere视图可以显示类似navigator视图 1.显示project exploere视图 window---->show view --->project exploere 2.project exploere视图转换为类似navigator视图 第一步&#xff1a;点击视图右上角三个点或者倒三角&#xff0c;点击fiters and custom…