04-Solidity8.0以太单位Gas和全局变量

这篇具有很好参考价值的文章主要介绍了04-Solidity8.0以太单位Gas和全局变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Solidity8.0

04-Solidity8.0以太单位Gas和全局变量


soliidity 读取变量 gas,Solidity,区块链


前言

以太和Wei
交易ether.
类似于1美元等于 100 美分,1ether等于 10**18 wei。

Gas

ether您需要为交易支付多少费用?
您支付gas spent * gas price的金额ether,在哪里

gas是一个计算单位
gas spentgas是交易中使用的总金额
gas priceether是你愿意支付多少gas
具有较高gas价格的交易具有更高的优先级被包含在一个块中。
未用完的gas将被退还。

气体限制

您可以花费的汽油量有 2 个上限
gas limit(您愿意为交易使用的最大天然气量,由您设置)
block gas limit(区块中允许的最大气体量,由网络设置)

msg注解

msg的所有成员的值,包括msg.sender和msg.value可以在每个external函数调用中改变。这包括调用库函数。 如果你想在库函数实现访问限制使用msg.sender, 你必须手动设置msg.sender作为参数。

随机源注解

不要依赖block.timestamp,now和block.blockhash作为随机源
时间戳timestamp和区块哈希blockhash在一定程度上会受到矿工的影响。
例如,矿区中的坏节点可以对选定的哈希运行casino payout函数,如果他们没有收到任何钱,只需重试不同的哈希。
当前块时间戳必须严格大于最后一个块的时间戳,但唯一的保证是它将位于规范链中两个连续块的时间戳之间的某处。 由于区块链是增长可变的,所以不能获取整个区块链的哈希值。 您只能访问最近256个区块的哈希值,其他所有值都将为0。

错误处理(Error Handling)

assert(bool condition):如果条件不满足则抛出异常 - 用于内部错误。
require(bool condition):如果条件不满足则抛出异常 - 用于输入或外部组件中的错误。
revert():中止执行并恢复状态更改

数学和加密功能(Mathematical and Cryptographic Functions)

addmod(uint x, uint y, uint k) returns (uint):
计算(x + y)%k的值,其中加法以指定精度执行,并且不超过2 ** 256。从版本0.5.0开始断言k!= 0。
mulmod(uint x, uint y, uint k) returns (uint):
计算(x * y)%k的值,其中乘法以指定精度执行,并且不超过2 ** 256。从版本0.5.0开始断言k!= 0
keccak256(…) returns (bytes32):
计算(紧凑排列的)参数的Ethereum-SHA-3的Hash值值
sha256(…) returns (bytes32):
计算(紧凑排列的)参数的SHA-256 的Hash值
sha3(…) returns (bytes32):
keccak256的别名
ripemd160(…) returns (bytes20):
计算(紧凑排列的)参数的 RIPEMD-160 的Hash值
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):
从椭圆曲线签名中恢复与公钥相关的地址,或在错误时返回零
在上述中,“紧凑排列”,意思是没有填充的参数的连续排列,也就是下面表达式是没有区别的:

keccak256(“ab”, “c”)
keccak256(“abc”)
keccak256(0x616263)
keccak256(6382179)
keccak256(97, 98, 99)

如果需要填充,可以使用显式类型转换:keccak256(0) == keccak256(uint8(0)),keccak256(0x12345678) == keccak256(uint32(0x12345678))
在一个私有的blockchain里,你可能在使用sha256, ripemd160 或 ecrecover 的时候碰到”Out-of-Gas”的问题 。原因在于这个仅仅是预编译的合约,合约要在他们接到的第一个消息以后才真正的生成(虽然他们的合约代码是硬编码的)。对于没有真正生成的合约的消息是非常昂贵的,这时就会碰到“Out-of-Gas”的问题。 这一问题的解决方法是事先把1wei 发送到各个你当前使用的各个合约上。这不是官方或测试网的问题。

地址相关(Address Related)

.balance (uint256): 该地址的余额,单位是Wei
.transfer(uint256 amount): 给该地址发送金额,单位是Wei,发送失败抛出异常,消耗2300 gas 费用,不可调整
.send(uint256 amount) returns (bool): 给该地址发送金额,单位是Wei,发送失败返回false,消耗2300 gas 费用,不可调整
.call(...) returns (bool): 发出 low-level CALL, 失败时返回false , 消耗所有可用gas, 可调整
.callcode(...) returns (bool): 发出 low-level CALLCODE, 失败时返回false , 消耗所有可用gas, 可调整
.delegatecall(...) returns (bool): 发出 low-level DELEGATECALL, 失败时返回false , 消耗所有可用gas, 可调整 欲了解更多资料,请参阅地址Address部分。
警告

使用send存在一些危险:如果调用堆栈深度为1024,则转账将失败(调用程序始终强制执行此操作),并且如果接受者的gas耗尽,也会失败。
因此,为了让以太币转账更安全,请务必检查send的返回值,或者直接使用transfer那就更好了。

注解

callcode不建议使用,未来将会移除

合约相关(Contract Related)

this (current contract’s type):
当前的合约,可显式转换为地址Address
selfdestruct(address):
销毁当前合约,其资金发送给指定的地址
suicide(address recipient):
selfdestruct的别名
此外,当前合同的所有函数均可以被直接调用,包括当前函数。


一、Solidity8.0以太单位Gas和全局变量

1.以太单位Gas和全局变量

代码如下(示例):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

contract EtherUnits {
    uint public oneWei = 1 wei;
    bool public isOneWei = 1 wei == 1;

    uint public oneEther = 1 ether;
    bool public isOneEther = 1 ether == 1e18;
    // bool public isOneEther1 = 1 ether == 10^3 finney;
    // bool public isOneEther2 = 1 ether == 10^6 szabo;
    bool public isOneEther3 = 1 ether == 1e9 gwei;
    // bool public isOneEther4 = 1 ether == 1e12 mwei;
    // bool public isOneEther5 = 1 ether == 1e15 kwei;

    bool public time = 1 == 1 seconds;
    bool public time1 = 1 minutes == 60 seconds;
    bool public time2 = 1 hours == 60 minutes;
    bool public time3 = 1 days == 24 hours;
    bool public time4 = 1 weeks == 7 days;
    // bool public time5 = 1 years == 365 days;

    // 区块和交易属性(Block and Transaction Properties)
    // block.blockhash(uint blockNumber) returns (bytes32): 给定区块的哈希值 - 仅适用于最新的256个区块,不包括当前区块
    // block.coinbase (address):当前区块的矿工的地址
    // block.difficulty (uint):当前区块的难度系数
    // block.gaslimit (uint):当前区块gas限制
    // block.number (uint):当前区块编号
    // block.timestamp (uint):当前块的时间戳
    // msg.data (bytes):完整的calldata
    // msg.gas (uint):剩余的gas
    // msg.sender (address):消息的发送方(当前调用)
    // msg.sig (bytes4):calldata的前四个字节(即函数标识符)
    // msg.value (uint):所发送的消息中wei的数量
    // now (uint):当前块时间戳(block.timestamp的别名)
    // tx.gasprice (uint):交易的gas价格
    // tx.origin (address):交易发送方(完整的调用链)
}

总结

日拱一卒。文章来源地址https://www.toymoban.com/news/detail-784132.html

到了这里,关于04-Solidity8.0以太单位Gas和全局变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊gas

    eip-1559提案更新了以太坊的奖励机制,新增了 maxFeePerGas 和 maxPriorityFeePerGas ;区块打包时,使用区块中小费(priorityFee)最少的区块作为基础费用(baseFeePerGas);小费用于支付给矿工,基础费则销毁。 maxFeePerGas : 每笔gas最大费用 maxPriorityFeePerGas : 给矿工的小费 ​ TransactionFee :(

    2024年01月22日
    浏览(33)
  • 【Solidity】Gas estimation failed-Gas estimation errored with the following message

    *【Solidity】Gas estimation failed-Gas estimation errored with the following message 这个问题一般会伴随以上这个图片出现,图片搬来的,因为我的已经解决 这个问题我在网上也看了很多提示和解决办法,有位博主是说自己代码出的问题,但是我感觉并不完全是,我这边用的是ganache的测试链

    2024年02月10日
    浏览(34)
  • Solidity中this、msg、block、tx、gas的用法

    目录 前言 1.this 2.msg 3.block 4.tx 5.gas 总结 在智能合约编程中,全局变量扮演着关键的角色,提供了访问外部信息和交易上下文的重要途径。本文将重点介绍 Solidity 中的五个重要全局变量: this 、 msg 、 block 、 tx 和 gas ,以及它们在智能合约中的用法和作用。通过深入了解这些

    2024年04月09日
    浏览(37)
  • 以太坊燃料费用定价机制Ethereum Gas Fee Pricing Mechanism

            以太坊燃料在交易过程中起着重要作用。从以太坊系统的角度,通过燃料费用提高恶意交易的成本减少攻击者的攻击收益,增强了以太坊交易的安全性,也促使合约开发者优化设计减少合约对以太坊算力的消耗;从交易发起者角度,通过设定燃料相关的参数,以尽

    2024年01月15日
    浏览(32)
  • 以太坊开发学习-solidity(三)函数类型

    目录 函数类型 函数类型 solidity官方文档里把函数归到数值类型 函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量, 也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。 函数类型有两类:-  内部(internal)  函数和  外

    2024年04月09日
    浏览(47)
  • 以太坊智能合约语言Solidity - 3 数组

    1字节(Byte) = 8位 (bit), bytes32 = 256位,bytes1 实质上就等于 int8 固定长度的数组一旦被定义就无法再更改,并且长度在一开始就会被显式定义 我们再来创建一个新的文件用来编写代码 字节数组无法进行基本运算,但是可以比较 字节数组还支持其他一些逻辑运算,具体计算结果

    2023年04月08日
    浏览(49)
  • 第四章 以太坊智能合约solidity介绍

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言,设计的目的是能在以太坊虚拟机上运行。 本章大概介绍合约的基本信息,合约的组成,语法方面不做过多的介绍,个人建议多阅读官方文档效果更佳,后续的章节会开发ERC20代币合约案例以便于更好的学习智

    2024年02月06日
    浏览(47)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(39)
  • 自定义的搭建solidity开发环境(以太坊)

    环境地址    github: GitHub - yinzhiqing/templete-sol: solidity platform(hardhat)    gitlab: zqy / templete-sol · GitLab 本项目利用openzapplin solc web3js hardhat nodejs 在ubuntu下搭建solidity合约开发环境.大多数功能实现了自动化(脚本)执行. 特点: 1.开发环境可充分使用 2.合约可升级 3.记

    2024年02月01日
    浏览(28)
  • 基于以太坊的智能合约开发Solidity(基础篇)

    参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili (1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意, 合约一旦部署,就会永久存在于区块链上,且不可篡改 ,不过可以销毁) (2)执行完成后,可以得到以

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包