主页 > imtoken安卓版下载2.0 > 【一步步学DApp开发】(二)以太坊浅析

【一步步学DApp开发】(二)以太坊浅析

imtoken安卓版下载2.0 2024-01-17 05:13:40

在这里插入图片描述

据说要学以太坊,先看以太坊白皮书,BUT……这么长的白皮书怎么办? 今天,我就带大家轻松了解以太坊的工作原理。

1 以太坊概述

使用 Solidity 编程语言编写智能合约。 智能合约完全按照程序运行,抗宕机、抗审查、抗欺诈、抗第三方干扰。 部署智能合约或调用其方法需要以太币。

以太坊使用区块链数据结构和工作量证明共识协议。 网络中有两种节点:普通节点和矿工。 普通节点只是备份区块链上的数据,而矿工通过挖矿创建区块链。

2个以太坊账户

要创建以太坊帐户,您只需要一对非对称加密密钥——由不同算法(例如 RSA、ECC 等)生成。 以太坊使用椭圆曲线密码术 (ECC)。 ECC 有多个参数来调整速度和安全性。 以太坊使用 secp256k1 参数。

每个帐户都由一个地址表示。 获得密钥后,您需要生成地址。

从公钥生成地址的过程如下:

(1) 生成公钥的keccak-256 hash。 它将给出一个 256 位的数字。

(2) 丢弃前面的96位,即12个字节。 现在得到160位的二进制数据,也就是20个字节。

(3) 将地址编译成十六进制字符串,最后得到一个40个字符的word

节字符串是帐户地址。

3笔交易

交易是一个签名的数据包,用于将以太币从一个账户转移到另一个账户或合约,调用合约方法或部署新合约。

交易使用椭圆曲线数字签名算法 (ECDSA) 进行签名,ECDSA 是一种基于 ECC 的数字签名算法。

交易包括:

如果交易的目的是调用合约方法,它还包含输入数据。

如果其目的是部署合约,它可以包含初始化代码。 交易费用的计算方法是将交易消耗的gas乘以gas价格。

4 共识

用户需要保证节点不能篡改区块链,还需要一种机制来检查区块是否合法。

以太坊使用工作量证明共识协议来防止区块链被篡改。

工作量证明系统需要解决一个复杂的问题才能创建一个新块。

在工作量证明系统中,创建块的过程称为挖掘。

矿工是在网络中挖掘区块的节点。 一旦矿工成功挖出一个区块,它就会将该区块广播给网络中的所有其他节点。 一个区块有一个区块头和一个交易列表。 每个块存储前一个块的哈希值,从而创建一个连接的链。

为了挖掘一个区块,矿工首先从收到的广播中收集新的、未开采的交易,然后过滤掉非法交易。

合法交易必须满足私钥签名正确使用、账户余额充足等条件才能进行交易。 现在矿工创建一个带有区块头和内容的区块。

内容是区块中包含的交易列表。

区块头包含:

提示:

网络中的任何节点都可以检查区块链是否合法,首先检查区块链中的交易是否合法以及时间戳的验证,然后检查区块的目标值和随机数是否合法以太坊区块浏览器api,矿工是否合法获得合法奖励等等。

如果网络中的一个节点收到两个不同的有效区块链,则所有区块中具有较高整体难度值的区块链被认为是有效区块链。

例如,如果网络中的一个节点想要改变一个区块中的一些交易,它需要重新计算该区块以及该区块之后的所有区块的随机数。 但是在节点计算的过程中,网络中的其他节点又挖出了很多新的区块以太坊区块浏览器api,所以当它重新计算到最新的区块时,会因为整体难度值偏低而被系统拒绝。 可见,未经许可篡改账本是非常困难的。

5 时间戳

当矿工广播一个新挖出的区块时,其他节点对其时间戳的验证取决于它的时间戳是否大于前一个区块的时间戳。

如果矿工使用的时间戳大于当前时间戳,则难度值较低,因为难度值与当前时间戳成反比,因此网络将接受出块时间戳为当前时间戳的矿工,因为它具有更高的难度值.

如果矿工使用的时间戳大于前一个区块的时间戳且小于当前的时间戳,则难度值会更高,因此挖出该区块将花费更多时间。

6个随机数

nonce 是 64 位未签名证书。 矿工不断尝试随机数,直到找到目标值。

每个矿工挖出的区块的哈希是不同的,因为哈希取决于时间戳、矿工地址等东西,而这些东西很可能对所有矿工来说都是不同的。 因此,解决问题与其说是一场竞赛,不如说是一种运气问题。 因此,矿工可能会幸运地拥有高哈希率,但这并不意味着矿工总能找到下一个区块。

7 块时间

区块难度值公式采用最大10s的阈值,保证父块和子块的挖矿时间差在10s到20s之间。

陈旧块:在以太坊中,陈旧块被称为“叔块”。 如果两个矿工花费几乎相同的时间来开采下一个区块会怎样? 两个区块都必须是合法的,但是区块链不能包含两个区块号相同的区块,并且两个矿工都得不到奖励。 虽然这是一个普遍的问题,但解决方法很简单,最后一个难度值较高的区块链将被网络接受。 所以最后一个被忽略的有效块被称为无效无效块。

网络中生成的无效块总数与生成新块所需的平均时间成反比。 较短的区块生成时间意味着一个新挖出的区块需要较少的时间广播到全网,矿工有更大的概率找到问题的解决方案,所以当区块广播到全网时,其他一些矿工也可能解决它。 问题和广播,导致无效块。 但是如果出块的平均时间越长,多个矿工解决问题的概率就越小,即使他们都解决了问题,也很可能存在一个时间差,第一个解决的块广播,另一个矿工可以停止挖掘该区块并继续挖掘下一个区块。

在无效块上工作的网络正在无效块上挖掘下一个块,结果是网络计算能力的损失,因为计算能力被用于无用的事情。 因此,在开采下一个区块后,难度值会降低,因为开采一个区块所需的时间比平均时间长。 难度值的降低会影响整体区块链的安全性。 如果无效块率过高,将极大地影响区块链安全。

以太坊如何解决无效区块? ——幽灵协议

以太坊使用幽灵协议来解决无效区块带来的安全问题。 幽灵协议只是在父链上增加了无效区块,掩盖了安全问题,从而提高了区块链的整体难度值,因为区块链的整体难度值还包括了无效区块的难度值之和。

但是如何在不冲突交易的情况下将无效区块添加到父链中呢?

事实上,任何区块链都可以容纳零个或多个无效块。 为了激励矿工接受无效区块,矿工将因接受无效区块而获得奖励。 此外,发现无效区块的矿工也将获得奖励。 无效区块中的交易不用于计算确认,无效区块矿工不对​​无效区块中接受的交易收取交易费用。

矿工接受无效区块获得的奖励计算公式如下:

这里写图片描述

8个叉子

更改源代码可能会导致冲突。 根据冲突的类型,可能需要拥有超过 50% 算力的矿工升级,或者可能需要所有矿工升级来解决冲突。

9 创世区块

创世块是区块链中的第一个块,其块号为0。它是区块链中唯一不指向前一个块的块,因为没有前一个块。 它也不包含交易,因为还没有生成以太币。

网络中只有两个节点拥有相同的创世块才会相互配对,也就是说,如果两个对等节点拥有相同的创世块,它们将同步块,否则它们将相互拒绝。

每个节点生成自己的创世块。 对于不同的网络,创世块被硬编码到客户端中。

10 以太坊虚拟机 (EVM)

EVM 是以太坊智能合约字节码的执行环境,网络中的每个节点都运行 EVM。 所有节点使用 EVM 执行指向智能合约的所有交易,因此它们执行相同的计算并存储相同的值。

每个节点执行并存储最终状态。 例如,如果您有一个智能合约存储聚会上每个人的姓名和详细信息,每当添加新人时,都会向网络广播一个新交易。 网络中任何想要透露参加派对的每个人的详细信息的节点都可以简单地阅读合同的最终状态。

每笔交易都需要在网络中进行一些计算和存储。 因此,需要有交易手续费,否则整个网络就会充斥着垃圾交易,而没有交易手续费,矿工就没有理由接受区块交易,他们就会开始挖空块。

11气

Gas(燃料)是计算资源的计量单位。

每笔交易都需要包含一个 gas limit。 如果交易使用的gas小于或等于gas limit,则交易继续。 如果总 gas 超过 gas cap,所有修改都会被撤销,但交易仍然有效并且矿工仍然能够收到费用。

矿工决定天然气价格。 如果交易gas价格低于矿工决定的gas价格,矿工将拒绝挖矿交易。

如果 gas 价格低于预期,矿工可以拒绝将交易包含在区块中。

天然气价格以 wei 为单位。

EVM 的每个操作都分配了一个数字,代表它可以消耗的气体。

交易成本会影响可以从一个账户转移到另一个账户的以太币数量。 例如,如果一个账户中总共有 5 个以太币,则它不能将这 5 个以太币全部转移到其他账户,因为如果所有以太币都被发送出去,该账户将没有余额来支付交易费用。

12 发现对等节点

一个节点不需要连接到网络中的每个节点; 相反,它仅连接到其他几个节点,而这些节点又连接到其他几个节点。 这样,整个网络就相互连接起来了。

节点如何发现网络中的其他一些节点?

以太坊有自己的节点发现协议可以用来解决这个问题,它基于 Kadelima 协议。 节点发现协议中有一种特殊的节点,称为 Bootstrap(初始启动)节点。 Bootstrap 节点保留它们随时间连接的所有节点的列表,但不保留区块链本身。 当peer节点连接到以太坊网络时,首先连接到Bootstrap节点,Bootstrap节点共享事先定义好的时刻连接到自己的peer节点列表。 对等节点然后与对等节点连接并同步。

13 耳语与蜂群

Whisper 是一种去中心化的通信协议,Swarm 是一种去中心化的文件系统。

14geth(去以太坊)

geth 是以太坊、Whisper 和 Swarm 节点的实现。 合并它们的目的是让它们看起来像一个单一的 DApp,通过一个节点客户端可以访问三个 DApp。

geth 是一个用 Go 语言编写的 CLI 应用程序。

14.1 安装geth

brew tap ethereum/ethereum
brew install ethereum

14.2 JSON-RPC 和 JavaScript 控制台

geth 为其他应用程序提供了一个 JSON-RPC API 进行通信。 geth 使用 HTTP、WebSocket 和其他协议提供 JSON-RPC API。

geth 还提供了一个交互式 JavaScript 控制台,可以使用 JavaScript API 进行程序交互。 交互式控制台使用 JSON-RPC 与 geth 通信。

14.3 geth 子命令和选项

以太坊网络中的节点默认使用端口 30303 进行通信。 但是节点也可以监听一些端口。

为了连接到主网网络,只需运行 geth 命令。 例如:

geth --datadir "/users/packt/ethereum" --networkid 1

其中,--datadir 选项用于指定存储区块链的位置。 如果没有提供,默认路径是“$HOME/.ethereum”;

--networkid 用于指定网络ID。 1代表主网网络ID。 如果不提供网络ID,则默认值为1。2代表测试网络ID。

要创建专用网络,只需提供一个随机网络 ID。 通常专用网络是为开发目的而创建的。 无需提供随机网络 ID 并放置多个与日志记录和调试相关的标志,而是可以简单地运行一个带有允许多个日志记录和调试相关标志的 --dev 标志的专用网络。

14.4 创建账户

geth account new

运行上述命令时,需要密码对账户进行加密。 如果您忘记了密码,您将无法访问您的帐户。

geth account list

默认情况下,密钥存储在 --datadir 路径中,但用户可以使用 --keystore 选项指定不同的目录。

1.挖矿

默认情况下,geth 不开始挖矿。 要指示 geth 开始挖矿,只需提供 --mine 选项。

这里写图片描述

2. 快速同步

快速同步不会下载整个区块,只会下载区块头、交易凭证和最新的状态数据库。

因此用户不需要下载和重放所有交易。 为了检查区块链的真实性,算法会在每个定义的块号之后下载一个完整的块。

为了在下载区块链时使用快速同步,用户需要在运行 geth 时使用 --fast。

出于安全原因,快速同步仅在初始同步时运行(即当节点自己的区块链为空时)。 节点成功与网络同步后,快速同步将永久禁用。

15 以太坊钱包

以太坊钱包允许用户创建账户、发送以太币、部署合约和调用合约方法。 以太坊钱包与 geth 捆绑在一起。 运行 ethereum 时,它会尝试发现本地 geth 实例并连接到它。 如果找不到正在运行的 geth,它会启动自己的 geth 节点。

16 浏览器钱包(Mist)

浏览器钱包 (Mist) 是 Ethereum、Whisper 和 Swarm 的客户端,允许用户发送交易、发送 Whisper 消息、检查区块链等。

目前运行在浏览器中的前端JavaScript可以使用web3.js库(该库提供以太坊控制台的JavaScript API与geth通信,供其他应用使用)访问geth节点的web3 API。

Mist的基本思想是创建第三代Web(Web 3.0),即用Ethereum、Whisper、Swarm来代替中心化的服务器端,做到不需要服务器端。

以太坊的 17 个缺点

这里写图片描述