9.ETH-智能合约

一个例子 Solidity是以太坊中最常用的编程语言,这是一个公开拍卖智能合约的例子。 // SPDX-License-Identifier: MIT // 告诉编译器我们用的是哪个版本的Solidity pragma solidity ^0.8.20; contract SimpleAuction { // --- 状态变量 (State Variables) --- // 这些是永久存储在区块链上的数据 // 受益人,也就是卖东西收钱的人 address public beneficiary; // 拍卖结束的时间点(一个Unix时间戳) uint public auctionEndTime; // 当前最高出价者 address public highestBidder; // 当前最高出价的金额 uint public highestBid; // 一个映射,用于存储每个出价人被超过的退款。 // 如果A出价1ETH,B出价2ETH,那么A的1ETH就会暂存在这里等待他…

8.ETH-权益证明

基本思想 PoS是一个闭环 PoW认为,信任和安全来自于不可逆的物理成本。矿工必须购买昂贵的硬件(矿机)并消耗大量电力来解决复杂的数学难题。他们付出的巨大成本(电费、硬件折旧)证明了他们工作的真实性。攻击网络的成本,就是掌握比全网一半还要多的物理算力的成本,这个成本非常高昂。它的本质是“物理安全”。这个经济模型的运作流程如下: 1. 获得收入:矿工通过挖矿获得加密货币(如BTC)作为奖励。 2. 支付外部成本:矿工必须将这些加密货币在市场上卖出,换取法币(如美元、人民币)。 3. 价值外流:矿工用法币去支付现实世界中的账单,这些钱最终流向了电力公司、芯片制造商(如台积电)、硬件厂商(如比特大陆)等不属于该区块链生态的外部实体。 为了维持网络安全而支付的巨额成本,最终会持续地、结构性地流出这个加密经济体。这在资产上造成了持续的、结构性的抛售压力。可以说,PoW网络每天都在“流血”,需要有源源不断的新买家来吸收矿工为了支付电费而抛售的代币,才能维持价格稳定。 而PoS机制认为,信任和安全来自于可被惩罚的经济抵押。验证者(…

7.ETH-难度调整

在过渡到权益证明(Proof-of-Stake, PoS)之前,以太坊在其工作量证明(Proof-of-Work, PoW)时代采用了一种精密的双重机制来调整挖矿难度。该算法的目标有两个:一是在短期内维持稳定的出块时间,二是通过一个长期机制(即“难度炸弹”)来最终推动网络向 PoS 过渡。 整个难度调整算法主要由两部分构成: 1. 常规难度调整机制 2. 难度炸弹(The Difficulty Bomb),又称“冰河时代”(Ice Age) 1. 常规难度调整机制 这是算法的核心部分,旨在将平均出块时间维持在 10到20秒 之间。以太坊每个区块都会进行一次难度调整,而不是像比特币那样每2016个区块调整一次。这种设计使得以太坊能够更快速地响应全网算力的变化。 该机制的逻辑非常直观: * 如果一个区块的生成时间(与父区块的时间戳之差)小于10秒,说明当前难度太低,算力过剩,需要增加难度。 * 如果区块生成时间大于20秒,说明当前难度太高,算力不足,需要降低难度。 * 如果时间在10到19秒之间,难度将保持不变。…

6.ETH-挖矿算法

在比特币网络中,ASIC矿机的出现使得拥有大规模、高算力硬件的矿工占据了绝对优势,普通用户使用CPU或GPU几乎无法参与挖矿。为避免重蹈覆辙,新加密货币的开发者设计了新的挖矿算法。其特点是内存困难(Memory-hard)。这意味着该算法在进行哈希计算时,不仅需要大量的计算能力,还需要极大的内存带宽和容量。 莱特币-Scrypt算法 Scrypt 算法由加拿大计算机科学家科林·珀西瓦尔(Colin Percival)于2009年发明,它与比特币使用的 SHA-256 算法在设计哲学上有本质的区别。它不仅仅是一个简单的哈希函数,而是一个可调节难度的密钥派生函数 (Key Derivation Function, KDF),其设计精髓在于通过消耗大量内存来增加破解难度。 核心参数 在开始挖矿之前,需要先设定好关键参数。Scrypt 有三个关键参数来控制其挖矿的难度和资源消耗: 1. N (CPU/Memory Cost) - 内存成本参数: * 这是最重要的参数,直接决定了算法需要消耗多少内存。 * 它必须是2的幂(例如 1024, 2048, 16384)…

5.ETH-GHOST协议(PoW)

GHOST协议的出现是为了解决一个核心矛盾:如何在保证网络安全和去中心化的前提下,大幅缩短区块链的出块时间。 比特币(Bitcoin)网络大约每10分钟产生一个区块,这个时间足够长,可以确保新挖出的区块有充分的时间广播到全球绝大多数节点,从而让整个网络在“哪条是主链”这个问题上快速达成共识。比特币遵循的是“最长链原则”(Longest Chain Rule),即所有节点都默认最长的那条链是唯一合法的链。 以太坊为了提升交易处理速度(TPS)和用户体验,希望将出块时间缩短到几十秒的级别(最终在12-15秒左右)。如此短的出块时间带来了一些问题: * 高“孤块率”(High Orphan/Stale Block Rate):当一个矿工A挖出一个新区块并开始广播时,由于网络延迟,另一个矿工B可能在收到A的区块之前,也基于同一个父区块挖出了一个新区块。这时,网络中就同时存在了两个竞争的区块,产生了临时分叉。 * 在比特币的“最长链原则”下,最终只有一个分叉能胜出并被延长,另一个分叉上的区块就会被抛弃,成为**“孤块”(Orphan Block)**。 这种高孤块率会导致两个严重问题…

4.ETH-交易树和收据树

交易树(Transaction Trie) 交易树是为每一个区块单独构建的、一次性的数据结构,它的唯一目的就是存储该区块内包含的所有交易,并为它们生成一个唯一的、可验证的“指纹”。当一个验证者(Validator)要创建一个新区块时,它会为这个区块专门构建一棵交易树: 1. 收集数据:验证者从交易池中选择一批交易,并将它们按特定顺序(通常由验证者自己决定,以优化Gas费收益)排列好,形成一个列表。 2. 构建MPT:它会创建一个全新的、空的默克尔·帕特里夏·树,然后将这个交易列表存入其中。 * 键 (Key):不是交易哈希,也不是地址,而是这笔交易在这个列表中的索引(index),例如第0笔、第1笔、第2笔... 这个索引会经过RLP编码。 * 值 (Value):就是这笔交易本身的完整数据(包含了nonce, to, value, gasLimit, data等所有字段),同样经过RLP编码。 3. 生成根哈希:当所有交易都插入到这棵树中后,…

3.ETH-状态树

以太坊的核心功能,就是维护一个从“地址 (Address)”到其对应“状态 (State)”的、持续更新的、全球共享的巨大映射(Mapping)关系。这个宏大的、在某一瞬间的完整映射,就被称为以太坊的世界状态 (World State)。而我们之前讨论的状态树(State Trie),正是实现这个映射的技术手段。 以太坊的地址和状态 以太坊地址是一个独一无二的标识符,它代表了网络上的一个“位置”或“目的地”。所有可以接收资产或信息的实体,都拥有一个地址。一个以太坊地址是一个以0x开头的、由40个十六进制字符(数字0-9和字母a-f)组成的字符串。 例如:0x742d35Cc6634C0532925a3b844Bc454e4438f44e实际上这个地址也是由一个公钥进行一定的哈希算法得到的。 而以太坊所述的状态,具体指账户的状态,根据上节所述的不同的账户,EOA与合约账户往往状态不太一样。 一个外部拥有账户的状态,主要由两项数据构成: * nonce: 一个计数器,记录了“这个地址已经发送过多少笔交易”。每成功发送一笔交易,nonce就加1。它的核心作用是防止交易重放。…

2.ETH-账户

BTC的交易结构不符合常识 比特币的账本不记录任何人的“账户余额”。它只记录一笔笔“未被花费的交易输出”,即 UTXO (Unspent Transaction Output)。这个账本记录有一些不符合我们日常常识的地方: * 没有“账户”这个概念:比特币协议层面没有“账户”。你的“余额”并不是一个存在某处的数字,而是你的钱包软件在背后默默地帮你扫描整个区块链,把你所有能花的“电子钞票”(UTXOs)加起来的总和。 * 花钱就像用现金,必须整张花掉:假设你的钱包里有一张价值5 BTC的UTXO(一张电子钞票),而你只想给朋友转1 BTC。 * 你不能从这张5 BTC的“钞票”上撕下1 BTC给朋友。 * 你必须把整张5 BTC的钞票都花掉。这笔交易会产生两个新的输出(两张新钞票): * 一张价值1 BTC的新钞票,支付给你的朋友。 * 一张价值4 BTC的新钞票(扣除手续费后略少于4 BTC),作为**“找零”**支付给你自己的一个新地址。…