当前位置: 首页 > ops >正文

Ether and Wei

本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 + 解说 + 提示”的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。

Solidity 是以太坊等智能合约平台使用的主要编程语言,就像写网页要用 HTML 和 JavaScript,写智能合约就需要会 Solidity。

如果你从没写过区块链代码也没关系,只要你了解一点点编程概念,比如“变量”“函数”“条件判断”,我们就能从最简单的例子开始,一步步建立你的 Solidity 编程思维。

Ether and Wei

交易使用以太(Ether)支付。

类似于一美元等于 100 美分,一以太(Ether)等于 10^18 Wei

  • 以太(Ether):

    • 以太坊的原生货币,用于支付交易费用(Gas)、转账或其他操作。
    • 类似于现实中的“美元”,是主要货币单位。
  • Wei:

    • 以太坊的最小货币单位,1 Ether = 10^18 Wei(即 1,000,000,000,000,000,000 Wei)。
    • 类似于“美分”,是更小的单位,用于精确计算。
  • 交易费用:

    • 在以太坊上,任何修改区块链状态的操作(例如转账、调用合约函数)都需要支付 Gas 费用,以 Ether 为单位。
    • Gas 费用最终以 Wei 计算,因为 Wei 提供了更高的精度。
  • 类比:

    • 就像 1 美元 = 100 美分,1 Ether = 10^18 Wei。
    • 以太坊还有其他单位(如 Gwei,1 Gwei = 10^9 Wei),用于不同场景。
// SPDX-License-Identifier: MIT
// 声明代码采用 MIT 开源许可证,这是一种常见的开源许可协议,允许自由使用、修改和分发代码。pragma solidity ^0.8.26;
// 指定 Solidity 编译器版本必须大于或等于 0.8.26 并且小于 0.9.0。
// `pragma` 指令确保合约使用兼容的编译器版本,`^0.8.26` 表示支持 0.8.26 或更高版本(但不超过 0.9.0)。contract EtherUnits {// 定义一个名为 `EtherUnits` 的智能合约。// 合约是一个运行在以太坊区块链上的程序,包含数据(状态变量)和逻辑(函数)。// 这个合约的目的是展示以太坊的货币单位:Wei、Gwei 和 Ether。uint256 public oneWei = 1 wei;// 声明一个名为 `oneWei` 的状态变量,类型为 `uint256`(256 位无符号整数)。// 初始化值为 `1 wei`,其中 `wei` 是 Solidity 中的单位,表示以太坊的最小货币单位(1 Wei)。// `public` 关键字表示该变量可以被外部访问,Solidity 会自动为其生成一个 getter 函数。// 存储在区块链上,默认值表示 1 Wei。// 1 wei is equal to 1// 1 Wei 等于 1bool public isOneWei = (oneWei == 1);// 声明一个名为 `isOneWei` 的状态变量,类型为 `bool`(布尔值)。// 初始化值为表达式 `(oneWei == 1)` 的结果。// 在 Solidity 中,`1 wei` 等价于数值 `1`,因此 `oneWei == 1` 结果为 `true`。// `public` 允许外部访问,存储在区块链上。uint256 public oneGwei = 1 gwei;// 声明一个名为 `oneGwei` 的状态变量,类型为 `uint256`。// 初始化值为 `1 gwei`,其中 `gwei` 是以太坊的货币单位,1 Gwei = 10^9 Wei(1,000,000,000 Wei)。// `public` 允许外部访问,存储在区块链上。// 1 gwei is equal to 10^9 wei// 1 Gwei 等于 10^9 Weibool public isOneGwei = (oneGwei == 1e9);// 声明一个名为 `isOneGwei` 的状态变量,类型为 `bool`。// 初始化值为表达式 `(oneGwei == 1e9)` 的结果。// `1e9` 表示 10^9(1,000,000,000),因此 `1 gwei` 等价于 `10^9 Wei`,结果为 `true`。// `public` 允许外部访问,存储在区块链上。uint256 public oneEther = 1 ether;// 声明一个名为 `oneEther` 的状态变量,类型为 `uint256`。// 初始化值为 `1 ether`,其中 `ether` 是以太坊的主要货币单位,1 Ether = 10^18 Wei。// `public` 允许外部访问,存储在区块链上。// 1 ether is equal to 10^18 wei// 1 Ether 等于 10^18 Weibool public isOneEther = (oneEther == 1e18);// 声明一个名为 `isOneEther` 的状态变量,类型为 `bool`。// 初始化值为表达式 `(oneEther == 1e18)` 的结果。// `1e18` 表示 10^18(1,000,000,000,000,000,000),因此 `1 ether` 等价于 `10^18 Wei`,结果为 `true`。// `public` 允许外部访问,存储在区块链上。
}

EtherUnits 是一个简单的智能合约,展示了以太坊的货币单位:WeiGweiEther。它通过状态变量存储这些单位的值,并用布尔变量验证它们的数值关系。

代码做什么?

  • 定义货币单位:
    • oneWei 存储 1 Wei 的值(等于 1)。
    • oneGwei 存储 1 Gwei 的值(等于 10^9 Wei)。
    • oneEther 存储 1 Ether 的值(等于 10^18 Wei)。
  • 验证单位换算:
    • isOneWei 验证 1 wei 是否等于 1(结果为 true)。
    • isOneGwei 验证 1 gwei 是否等于 10^9(结果为 true)。
    • isOneEther 验证 1 ether 是否等于 10^18(结果为 true)。
  • 公开访问:
    • 所有变量都是 public,可以通过自动生成的 getter 函数读取(例如 oneWei()isOneEther())。
    • 读取这些变量是 view 操作,链下调用免费。
  • Gas 成本:
    • 部署合约时,初始化这些状态变量需要 Gas(因为存储在区块链上)。
    • 读取变量(通过 getter 函数)是 view 操作,链下调用不消耗 Gas。

关键点:

  • 以太坊货币单位:
    • Wei:以太坊的最小单位,1 Wei = 1。
    • Gwei:1 Gwei = 10^9 Wei,常用于表示 Gas 价格(例如,20 Gwei 是常见的 Gas 价格)。
    • Ether:1 Ether = 10^18 Wei,是以太坊的主要货币单位。
  • Solidity 中的单位:
    • Solidity 提供关键字 weigweiether,可以直接在代码中使用。
    • 这些单位会被编译器转换为对应的 Wei 值(例如,1 ether 自动转换为 1000000000000000000)。
  • 状态变量:
    • oneWeioneGweioneEther 是状态变量,存储在区块链的 storage 中。
    • 初始化这些变量需要 Gas,因为它们会永久保存在区块链上。
  • 布尔验证:
    • isOneWeiisOneGweiisOneEther 使用比较运算(==)验证单位之间的关系。
  • 用途:
    • 理解货币单位对于编写智能合约至关重要,例如:
      • 处理转账(以 Wei 为单位)。
      • 设置 Gas 价格(通常以 Gwei 为单位)。
      • 显示用户余额(通常以 Ether 为单位)。
http://www.xdnf.cn/news/15165.html

相关文章:

  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
  • 详解缓存淘汰策略:LRU
  • python数据分析及可视化课程介绍(01)以及统计学的应用、介绍、分类、基本概念及描述性统计
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十课——图像gamma矫正的FPGA实现
  • C++11的整理笔记
  • 【LeetCode 热题 100】25. K 个一组翻转链表——迭代+哨兵
  • 【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
  • Jenkins+Gitee+Docker容器化部署
  • super task 事件驱动框架
  • 用AI做带货视频评论分析【Datawhale AI 夏令营】
  • 冒泡排序和快速排序
  • 「Linux命令基础」文本模式系统关闭与重启
  • 【C/C++】动态内存分配:从 C++98 裸指针到现代策略
  • Linux操作系统之进程间通信:命名管道
  • 飞算JavaAI:给Java开发装上“智能引擎”的超级助手
  • vue入门学习教程
  • 车载诊断进阶篇 --- 关于网关转发性能引起的思考
  • 匿名函数作递归函数引用
  • uniapp制作一个视频播放页面
  • C++11中的std::minmax与std::minmax_element:原理解析与实战
  • WIFI协议全解析06:Beacon帧、Probe帧你必须懂,搞WiFi通信绕不开它们
  • 【理念●体系】Windows AI 开发环境搭建实录:六层架构的逐步实现与路径治理指南
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • 从代码学习深度强化学习 - PPO PyTorch版
  • Go语言WebSocket编程:从零打造实时通信利器
  • Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源
  • 蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?
  • Spring的事务控制——学习历程
  • HarmonyOS NEXT端云一体化开发初体验