分析关于Hash哈希游戏竞猜项目系统开发(逻辑讲解)

2022-06-24 16:34:21 浏览数 (1)

本文将打开一系列有关在Solidity中进行数值运算的文章。讨论的第一个主题是:数值。

介绍

以太坊是一个可编程的区块链,可以通过将可执行代码(称为智能合约)发布到区块链本身来扩展其功能。以太坊与第一代区块链的区别在于,新功能要求修改客户端软件,升级节点以及对整个区块链进行分叉。

智能合约是链上发布的一段可执行代码,具有分配给它的唯一区块链地址。智能合约控制属于其地址的所有资产,并且在与其他智能合约进行交互时可以代表该地址进行操作。每个智能合约都有永久性存储,用于在调用之间保留智能合约的状态。

Solidity是在以太坊以及其他使用以太坊虚拟机(EVM)的其他区块链平台上进行智能合约开发的主要编程语言。

编程始终与数值有关,区块链始终与金融有关,而金融自古以来就与数学有关(或者数学与金融有关)。作为以太坊区块链的主要编程语言,Solidity必须做好数学。

在本系列中,我们讨论了Solidity如何进行数值运算以及开发人员如何在Solidity中进行数值运算的各个方面。讨论的第一个主题是:数值。

在solidity中的数值类型

与主流编程语言相比,Solidity有很多数值类型:即5,248。是的,根据文档,有32个有符号整数,32个无符号整数,2592个有符号定点和2592个无符号定点类型。JavaScript只有两种数值类型。Python 2以前有四个,但是在Python 3中删除了“ long”类型,所以现在只有三个。Java有7个,而C 有14个。

有这么多的数值类型,Solidity应该为每个人提供合适的类型,对吗?没那么快。让我们再仔细看看这些数值类型。

我们将从以下问题开始:

为什么我们需要多种数值类型?

纯数学中没有数值类型。一个数可以是整数或非整数、有理或无理、正数或负数、实数或虚数等,但这些只是性质,这个数可以有也可以没有,单个数可以同时有几个这样的性质。

许多高级编程语言都有单一的数字类型。在2019年引入BigInt之前,JavaScript只有“number”。

除非做核心的底层工作,否则开发人员实际上并不需要多个数值类型,他们只需要具有任意范围和精度的纯数字。然而,硬件本身并不支持这些数值,而且在软件上进行模拟有点昂贵。

这就是为什么低层编程语言和高性能语言通常有多个数值类型,如有signed/unsigned、8/16/32/64/128 bits、整数/浮点等。这些类型在硬件上是本机支持的,广泛应用于文件格式、网络协议等,因此低层代码从中受益。

但是出于性能原因,这些类型通常继承基础CPU指令的所有怪异语义,例如静默上溢和下溢,非对称范围、二进制分数、字节排序问题等,这使它们在高级业务逻辑代码中感到痛苦。直截了当的用法通常显得不安全,并且安全的用法通常变得麻烦且难以理解。

所以,下一个问题是:

为什么Solidity有这么多数值类型?

EVM本机支持两种数据类型:256位字和8位字节。堆栈元素,存储键和值,指令和内存指针,时间戳,余额,事务和块哈希,地址等均为256位字。内存,字节码,调用数据和返回数据由字节组成。大多数EVM操作码都处理单词,包括所有数值运算。一些数值运算将单词视为有符号整数,而某些数值运算则将单词视为无符号整数,而其他运算则不管参数是否在无符号上签名,都以相同的方式工作。

因此,EVM本机支持两种数值类型:带符号的256位整数和无符号的256位整数。这些类型在Solidity中分别称为int和uint。

除了这两种类型(及其别名int256和uint256)以外,Solidity还具有62个整数类型int 和uint ,其中可以是8到248之间的8的任意倍数,即8、16… ,248。在EVM级别上,所有这些类型都由相同的256 bits支持,但是每个操作的结果都被截断为N bits。当需要特定的位宽时,它们在特定情况下可能很有用,但是对于一般计算而言,这些类型的int和uint的功能和效率都较低(在每次操作后都被截断不是免费的)。

0 人点赞