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
是一个简单的智能合约,展示了以太坊的货币单位:Wei、Gwei 和 Ether。它通过状态变量存储这些单位的值,并用布尔变量验证它们的数值关系。
代码做什么?
- 定义货币单位:
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 提供关键字
wei
、gwei
和ether
,可以直接在代码中使用。 - 这些单位会被编译器转换为对应的 Wei 值(例如,
1 ether
自动转换为1000000000000000000
)。
- Solidity 提供关键字
- 状态变量:
oneWei
、oneGwei
和oneEther
是状态变量,存储在区块链的storage
中。- 初始化这些变量需要 Gas,因为它们会永久保存在区块链上。
- 布尔验证:
isOneWei
、isOneGwei
和isOneEther
使用比较运算(==
)验证单位之间的关系。
- 用途:
- 理解货币单位对于编写智能合约至关重要,例如:
- 处理转账(以 Wei 为单位)。
- 设置 Gas 价格(通常以 Gwei 为单位)。
- 显示用户余额(通常以 Ether 为单位)。
- 理解货币单位对于编写智能合约至关重要,例如: