主页 > imtoken官网版下载 > 02以太坊基金会

02以太坊基金会

imtoken官网版下载 2023-03-04 05:37:25

控制与责任

像以太坊这样的开放区块链是安全的,因为它们是_去中心化的_。 这意味着以太坊的每个用户都应该控制自己的密钥,这些密钥可以控制对资金和合同的访问。 一些用户选择通过使用第三方托管人(例如交换钱包)放弃对其密钥的控制。 在本书中,我们将教您如何控制和管理您自己的密钥。

这种控制带来了巨大的责任。 如果您丢失了密钥,您将无法访问资金和合同。 没有人可以帮助您重新获得访问权限——您的资金将永远被锁定。 以下是一些帮助您管理此责任的提示:

以太币单位

以太坊的货币单位称为以太,也称为 ETH 或符号 О(来自希腊字母“Xi”,看起来像程式化的大写字母 E)或(不太常见)♦,例如,1 以太,或 1 ETH,或∞1, 或 ♦1

提示

Ξ 使用 Unicode 字符 926,♦ 使用 9830。

以太被细分为更小的单位,直到可能的最小单位,称为_wei_。 一个以太是 1×1018 或 1,000,000,000,000,000,000 wei。 您可能听说过人们也将货币称为“以太坊”,但这是初学者常犯的错误。 以太坊是系统,以太币是货币。

以太币的价值在以太坊内部始终表示为_wei_,一个无符号整数值。 当你交易 1 个以太币时,交易将编码 10000000000000000000 wei 作为价值。

以太的各种单位都有使用国际单位制 (SI) 的科学名称和通俗名称,这是对计算和密码学领域许多伟大思想的致敬。

该表显示了各种单位、它们的常用(通用)名称和它们的 SI 名​​称。 为了与价值的内部表示一致,该表显示了所有面额(第一行)的 wei,在第七行显示了以太币的 1018 wei:

表 1. 以太面额和单位名称

值(以 wei 为单位) ExponentCommon NameSI Name

1个

1个

1,000

103

白菜

千维或飞秒

1,000,000

106

爱情花边

megawei 或 picoether

1,000,000,000

109

香农

技嘉或纳米醚

1,000,000,000,000

1012

绍博

微醚或微

1,000,000,000,000,000

1015

芬尼

毫醚或毫

1,000,000,000,000,000,000

1018

1,000,000,000,000,000,000,000

1021

盛大的

千醚

1,000,000,000,000,000,000,000,000

1024

兆以太

选择一个以太坊钱包

以太坊钱包是您通往以太坊系统的门户。 它拥有你的密钥,可以代表你创建和广播交易。 选择以太坊钱包可能很困难,因为有太多不同的功能和设计选项。 有些更适合初学者,有些更适合专家。 即使您现在选择了自己喜欢的钱包,您也可能会在以后决定切换到另一个钱包。 以太坊本身在不断变化,“最好的”钱包往往是适应它们的钱包。

不用担心! 如果您选择了一个钱包并且不喜欢它的工作方式,您可以轻松地切换钱包。 您只需要进行一次交易,即从旧钱包向新钱包发送资金,或者通过导出和导入私钥来移动密钥。

首先,我们将选择三种不同类型的钱包作为贯穿本书的示例:移动钱包、桌面钱包和基于网络的钱包。 我们选择这三个钱包是因为它们代表了广泛的复杂性和功能性。 但是,选择这些钱包并不代表对其质量或安全性的认可。 它们只是演示和测试。

起始钱包:

元掩码

MetaMask 是在您的浏览器(Chrome、Firefox、Opera 或 Brave 浏览器)中运行的浏览器扩展钱包。 它易于使用且测试方便以太坊Goerli测试币值多少钱,因为它可以连接到各种以太坊节点并测试区块链(参见“测试网”)。

贾克斯

Jaxx 是一款多平台和多币种钱包,可在各种操作系统上运行,包括 Android、iOS、Windows、Mac 和 Linux。 对于新用户来说,它通常是一个不错的选择,因为它的设计简单易用。

我的以太钱包 (MEW)

MyEtherWallet 是一款基于网络的钱包,可在任何浏览器中运行。 它有几个复杂的功能,我们将在许多示例中探讨这些功能。

翡翠钱包

Emerald 钱包设计用于 Ethereum Classic 区块链,但与其他 Ethereum 区块链兼容。 它是适用于 Windows、Mac 和 Linux 的开源桌面应用程序。 Emerald Wallet 可以运行全节点或连接到公共远程节点,以“轻”模式工作。 它还有一个配套工具,可以从命令行执行所有操作。

我们首先在桌面上安装MetaMask

安装元掩码

打开谷歌浏览器并导航至:

搜索“MetaMask”并点击狐狸标志。 您应该会看到扩展的详细信息页面,如下所示:

MetaMask Detail Page

图 1. MetaMask Chrome 扩展的详细信息页面

确认您下载的是正版 MetaMask 扩展非常重要,因为有时人们可以通过 Google 的过滤器传递恶意扩展。

确认您正在查看正确的扩展程序后,点击“添加到 Chrome”进行安装。

第一次使用 MetaMask

安装 MetaMask 后,您应该会在浏览器的工具栏中看到一个新图标(狐狸头)。 单击它开始。 它会要求你接受条款和条件,然后通过输入你的密码创建一个新的以太坊钱包:

MetaMask Password Page

图 2. MetaMask Chrome 扩展的密码页面

提示

密码控制对 MetaMask 的访问,任何有权访问您的浏览器的人都无法使用它。

一旦你设置了密码,MetaMask 就会为你生成一个钱包,并向你展示一个_助记词备份_,由 12 个英文单词组成。 如果 MetaMask 或您的计算机出现问题,这些词可以在任何兼容的钱包中使用以恢复对您的资金的访问。 您不需要密码即可恢复。 这12个字就够了。

MetaMask Mnemonic Page

图 3. MetaMask 创建的钱包助记词备份

提示

把助记词(12个字)备份在纸上,两遍。 将两份纸质副本存放在两个独立的安全位置,例如防火柜、上锁的抽屉或保险箱。 将纸质备份视为您存储在以太坊钱包中的相同价值的现金。 任何有权访问这些文本的人都可以访问和窃取你的资金。

一旦确认您已安全存储助记词,MetaMask 将显示您的以太坊帐户详细信息:

MetaMask Account Page

图 4. 您在 MetaMask 中的以太坊账户

您的帐户页面将显示您的帐户名称(默认为“帐户 1”)、以太坊地址(示例中为 0x9E713… )和一个彩色图标,以帮助您将此帐户与其他帐户区分开来。 在账户页面的顶部,您可以看到您当前使用的是哪个以太坊网络(示例中的“主网络”)。

恭喜! 您已经创建了您的第一个以太坊钱包!

交换网络

正如您在 MetaMask 帐户页面上看到的那样,您可以在多个以太坊网络中进行选择。 默认情况下,MetaMask 将尝试连接到“主网络”。 其他选项包括公共测试网、您选择的任何以太坊节点或在您自己的计算机(本地主机)上运行私有区块链节点:

主以太坊网络

主要的公共以太坊区块链。 真正的 ETH,真正的价值,真正的后果。

Ropsten 测试网络

以太坊是一个公共测试区块链和网络,使用工作量证明共识(挖掘)。 该网络上的 ETH 没有任何价值。 Ropsten 的问题在于攻击者铸造了数万个区块,产生了巨大的重组并将气体限制推至 9B。 当时需要一个新的公共测试网,但后来(2017 年 3 月 25 日)Ropsten 也复活了!

Kovan 测试网

以太坊是一个公共测试区块链和网络,它使用“Aura”协议进行权威证明共识(共同签名)。 该网络上的 ETH 没有任何价值。 此测试网络仅受“Parity”支持。 其他以太坊客户端使用后来提出的“Clique”协议来证明权威。

Rinkeby 测试网

以太坊是一个公共测试区块链和网络,它使用“Clique”协议进行权威证明共识(共同签名)。 该网络上的 ETH 没有任何价值。

本地主机 8545

连接到与浏览器在同一台计算机上运行的节点。 该节点可以是任何公共区块链(主链或测试网)或私有测试网(参见 )的一部分。

自定义远程调用

允许您使用与 geth 兼容的远程过程调用 (RPC) 接口将 MetaMask 连接到任何节点。 该节点可以是任何公共或私有区块链的一部分。

有关各种以太坊测试网以及如何在它们之间进行选择的更多信息,请参阅。

提示

您的 MetaMask 钱包在其连接的所有网络上使用相同的私钥和以太坊地址。 但是,每个以太坊网络上的以太坊地址余额会有所不同。 例如,您的密钥可以控制 Ropsten 上的以太币和合约,但不能控制主网上。

得到一些测试以太

我们的首要任务是充值我们的钱包。 我们不会在主网上这样做,因为真正的以太币要花钱,处理它需要更多经验。 现在,我们将用一些测试网以太币加载我们的钱包。

将 MetaMask 切换到_Ropsten 测试网络_。 然后点击“购买”,然后点击“Ropsten 测试水龙头”。 MetaMask 将打开一个新网页:

MetaMask Ropsten Test Faucet

图 5. MetaMask Ropsten 测试龙头

您可能会注意到该网页已经包含您的 MetaMask 钱包的以太坊地址。 MetaMask 将支持以太坊的网页(参见 参考资料)与您的 MetaMask 钱包集成在一起。 MetaMask 可以在网页上“看到”以太坊地址,例如,您可以向显示以太坊地址的在线商店发送付款。 如果网页有要求,MetaMask 也可以使用自己的钱包地址填写网页作为收件人地址。 在此页面中,水龙头应用程序向 MetaMask 询问钱包地址以发送测试以太币。

按下绿色的“从水龙头请求 1 个以太币”按钮。 您将在页面底部看到一个交易 ID。 水龙头应用程序创建一个交易——向您付款。 交易 ID 如下所示:

0x7c7ad5aaea6474adccf6f5c5d6abed11b70a350fbc6f9590109e099568090c57

几秒钟后,新交易将由 Ropsten 矿工开采,您的 MetaMask 钱包将显示余额为 1 ETH。 单击交易 ID,您的浏览器将带您进入_区块浏览器_,这是一个允许您查看和浏览区块、地址和交易的网站。 MetaMask 使用 etherscan.io 区块浏览器,这是流行的以太坊区块浏览器之一。 包含 Ropsten Test Faucet 付款的交易显示在 中。

Etherscan Ropsten Block Explorer

图 6. Etherscan Ropsten 区块浏览器

交易记录在 Ropsten 区块链上,任何人都可以随时通过简单地搜索交易 ID 或访问链接来查看:

尝试访问该链接,或将交易哈希输入 ropsten.etherscan.io 网站以亲自查看。

使用 MetaMask 发送以太币

一旦我们从 Ropsten 测试水龙头收到我们的第一个测试以太币,我们将尝试将一些以太币发送回水龙头。 正如您在 Ropsten Test Faucet 页面上看到的那样,您可以选择“捐赠”1 ETH。 此选项可用,因此一旦您完成测试,您可以归还剩余的测试以太币,以便其他人可以使用它。 虽然测试以太币没有任何价值,但有些人囤积测试以太币,导致其他人难以使用测试网。 囤积测试以太并不愉快!

幸运的是我们不是测试以太币囤积者,我们想练习发送以太币。

点击橙色的“1 以太币”按钮,告诉 MetaMask 创建一个支付 Faucet 1 以太币的交易。 MetaMask 将准备交易并弹出一个确认窗口:

Sending 1 ether to the faucet

图 7. 向水龙头发送 1 个以太币

为什么! 您可能会注意到您无法完成交易。 MetaMask 显示“交易余额不足”。 乍一看这可能令人困惑:我们有 1 个 ETH,我们想发送 1 个 ETH,为什么 MetaMask 说我们没有足够的资金?

答案是因为_gas_的成本。 以太坊交易需要矿工收取费用来验证交易。 以太坊费用以 _gas_ 虚拟货币收取。 作为交易的一部分,您用以太币支付天然气费用。

提示

测试网也需要费用。 如果没有费用,测试网的行为将与主网不同,使其成为不合适的测试平台。 费用还可以保护测试网络免受拒绝服务攻击和构造不良的合约(如无限循环),就像它们保护主网络一样。

当您发送交易时,Metamask 会计算最近一次成功交易的平均 gas 价格,单位为 3 GWEI(即 3 gigawei)。 正如我们在 中讨论的那样,Wei 是以太币的最小细分。 发送一个基本交易的 gas 成本是 21000 gas 单位。 因此,您可以花费的最大 ETH 数量为 3 * 21000 GWEI = 63000 GWEI = 0.000063 ETH。 请注意,平均天然气价格可能会波动,因为它们主要由矿工决定。 我们将在后面的章节中看到如何增加/减少气体限制以确保您的交易在需要时得到优先处理。

这表明:1 ETH 交易成本为 1.000063 ETH。 MetaMask 在显示总数时会将其四舍五入为 1 ETH,但您实际需要的数量是 1.000063 ETH,而您只有 1 ETH。 点击“拒绝”取消本次交易。

让我们再测试一下! 再次单击绿色的“从水龙头请求 1 个以太币”按钮并等待几秒钟。 别担心,水龙头应该有足够的以太币,如果你要的话,它会给你更多。

一旦您的余额达到 2 ETH,您就可以重试。 这一次,当您点击橙色的“1 以太币”捐赠按钮时,您就有足够的余额来完成交易。 当 MetaMask 弹出支付窗口时点击“提交”。 在所有这些之后,您应该看到 0.999937 ETH 的余额,因为您使用 0.000063 ETH 的气体将 1 ETH 发送到水龙头。

探索地址的交易历史

到目前为止,您已经成为使用 MetaMask 发送和接收测试以太币的专家。 您的钱包已收到至少两笔付款并发送至少一笔。 让我们使用 ropsten.etherscan.io 区块浏览器来看看所有这些交易。 您可以复制您的钱包地址并将其粘贴到浏览器的搜索框中,也可以让 MetaMask 为您打开该页面。 在 MetaMask 中您的帐户图标旁边,您会看到一个显示三个点的按钮。 单击它会显示与帐户相关的选项菜单:

MetaMask Account Context Menu

图 8. MetaMask 帐户上下文菜单

选择“在 Etherscan 上查看帐户”以在浏览器中打开一个网页,显示您帐户的交易历史记录:

Address Transaction History on Etherscan

图 9. Etherscan 上的地址交易历史

在这里你可以看到你的以太坊地址的整个交易历史。 它显示记录在 Ropsten 区块链上的所有交易,您的地址是交易的发送者或接收者。 单击其中一些交易以查看更多详细信息。

您可以浏览任意地址的交易记录。 查看您是否可以浏览 Ropsten Test Faucet 地址的交易历史记录(提示:它是最早向您的地址付款的“发件人”地址)。 你可以看到从水龙头发送给你的测试以太币和其他地址。 您看到的每笔交易都可能引导您找到更多地址和交易。 不久之后,您就会迷失在相互关联的数据迷宫中。 公共区块链包含大量信息,所有这些信息都可以通过编程方式进行探索,正如我们将在以后的示例中看到的那样。

世界计算机概论

我们已经创建了一个钱包,我们已经发送和接收了以太币。 到目前为止,我们已经将以太坊视为一种加密货币。 但以太坊代表的更多。 事实上,加密货币的功能是服务于以太坊作为世界计算机的功能; 一个去中心化的智能合约平台。 以太币旨在用于支付运行智能合约的费用,智能合约是在称为_以太坊虚拟机 (EVM)_ 的模拟计算机上运行的计算机程序。

EVM 是一个全局单例,这意味着它在任何地方都像一个全局单实例计算机一样运行。 以太坊网络上的每个节点都运行 EVM 的本地副本以验证合约执行,而以太坊区块链在处理交易和智能合约时记录这台世界计算机的状态。

外部账户 (EOA) 和合同

我们在 MetaMask 钱包中创建的账户类型称为外部拥有账户 (EOA)。 外部拥有的账户是那些持有私钥的账户,这些私钥控制着对资金或合同的访问。 现在,您可能会猜到还有另一种帐户,即_contract_帐户。 合约账户由以太坊区块链记录,由 EVM 执行的软件程序逻辑拥有(和控制)。

未来,所有以太坊钱包都可能作为以太坊合约运行,模糊了外部拥有账户和合约账户之间的区别。 但有一个重要的区别将永远存在:人们通过 EOA 做出决定,而软件通过合同做出决定。

合约有一个地址,就像 EOA(钱包)一样。 合约可以发送和接收以太币,就像钱包一样。 当交易目的地是合约地址时,它会导致该合约在 EVM 中运行,并将交易作为其输入。

除了以太币,交易还可以包含_data_,它表示合约中要运行的特定方法以及传递给该方法的参数。 这样,交易通过合约_calls_methods。 最后,合约可以生成调用其他合约的交易,从而创建复杂的执行路径。 一个典型的用途是让合约 A 调用合约 B 以维护合约 A 的用户之间的共享状态。

在接下来的几节中,我们将编写我们的第一个合约。 然后,我们将使用 MetaMask 钱包和测试以太币在 Ropsten 测试网上创建、资助和使用合约。

一个简单的合约:一个测试以太水龙头

以太坊有许多不同的高级语言,都可以用来编写合约和生成 EVM 字节码。 您可以在 中阅读许多最成功和最有趣的内容。 用于智能合约编程的主要高级语言:Solidity。 本书的合著者 Gavin Wood 创建了 Solidity,它已成为以太坊之外和其他地方使用最广泛的语言。 我们将使用 Solidity 编写我们的第一个合约。

作为我们的第一个例子,我们将编写一个控制_水龙头_的合约。 我们已经使用 faucent 在 Ropsten 测试网络上获得了测试以太币。 水龙头是一个相对简单的东西:它向任何地址发放以太币,可以定期补充。 您可以将水龙头实现为由人(或网络服务器)控制的钱包,但我们将编写一个实现水龙头的 Solidity 合约:

Faucet.sol:实现水龙头的 Solidity 合约

link:code/Solidity/Faucet.sol[]

这是一份非常简单的合同。 这也是一个*有缺陷*的合同,显示了一些不良做法和安全漏洞。 我们将通过检查后面章节中的所有陷阱来学习。 但是现在,让我们逐行看一下这个合约的作用,以及它是如何工作的。

第一行是注释

// Version of Solidity compiler this program was written for

注释仅供人类阅读,不包含在可执行 EVM 字节码中。 我们通常将注释放在我们试图解释的代码之前,有时在同一行。 注释以两个正斜杠 // 开头。 从斜杠到行尾的所有内容都被视为空行并被忽略。

下一行是我们的_real_ 合约开始的地方:

contract Faucet {

这一行声明了一个合约对象,类似于其他面向对象语言(如 JavaScript、Java 或 C++)中的类声明。 合同的定义包括用花括号 {} 括起来的所有行,它定义了 +scope+,就像许多其他编程语言中的花括号一样。

接下来以太坊Goerli测试币值多少钱,我们声明水龙头合约的第一个函数:

function withdraw(uint withdraw_amount) public {

该函数名为 withdraw,它接收一个名为 withdraw_amount 的无符号整数 (uint) 参数。 它被声明为公共函数,这意味着它可以被其他合约调用。 函数定义包含在花括号中:

require(withdraw_amount <= 100000000000000000);

withdraw+ 方法的第一部分设置提款限额。 它使用内置的Solidity函数+require来测试withdraw_amount小于等于100000000000000000 wei的前置条件,这是ether的基本单位(参见),等于0.1 ether。 如果以大于该金额的 withdraw_amount 调用 withdraw 函数,则此处的 require 函数将导致合约执行停止并因_Exception_而失败。

这部分合约是我们水龙头的主要逻辑。 它通过设置取款限额来控制合约中的资金流出。 这是一个非常简单的控件,但可以让您看到可编程区块链的强大功能:分散资金控制的软件。

接下来是实际提款:

msg.sender.transfer(withdraw_amount);

这里发生了一些有趣的事情。 msg 对象是所有合约都可以访问的输入之一。 它代表触发该合约执行的交易。 属性sender是交易的发件人地址。 函数 transfer 是一个内置函数,它将以太币从合约转移到调用它的地址。 从后往前读,即传递给触发本合约执行的msg的发送者。 传递函数将数量作为其唯一参数。 我们传递先前声明的 withdraw_amount 值作为 withdraw 方法的参数。

下一行是右花括号,它标志着 withdraw 函数定义的结束。