第一章:区块链基础与以太坊原理

1.1 从比特币到以太坊的演进

说实话,我刚开始接触区块链时,也以为比特币就是区块链的全部。后来才发现,这就像把算盘当成了计算机的全部——格局小了。

比特币在2008年横空出世,它解决了一个困扰密码学界几十年的问题:如何在去中心化的网络里防止双重支付?中本聪的答案是:用工作量证明(PoW)加上链式数据结构。说白了,就是让全网节点一起记账,谁先算出数学题谁就有权写下一页账本。

但比特币有个硬伤——它只能转账。你想在上面跑个简单的投票程序?没门。它的脚本语言是故意设计成非图灵完备的,连循环都不能写。嗯,这其实是个安全考量,但也限制了想象力。

2013年,一个叫Vitalik Buterin的年轻人坐不住了。他当时在写比特币杂志,越写越觉得比特币的脚本能力太弱。他想要一个「世界计算机」——不仅能转账,还能运行任何程序。于是以太坊诞生了。

核心区别一句话总结:比特币是去中心化的账本,以太坊是去中心化的计算机。

我在2017年第一次部署合约时,深刻体会到了这种区别。比特币上你只能做「A转给B」这种操作,而在以太坊上,你可以写「如果A和B都签名,且当前时间大于某个时间戳,则转给C」——这种逻辑在比特币上几乎不可能实现。

1.2 智能合约概念

智能合约这个词,其实早在1994年就被密码学家Nick Szabo提出来了。他当时想的是自动售货机——你投币,它出货,中间不需要人盯着。但直到以太坊出现,这个想法才真正落地。

智能合约是什么?说白了,就是一段部署在区块链上的代码。一旦部署,就无法篡改。任何人只要满足条件,就能触发它执行。你想想看,这相当于把合同条款写成了代码,让机器来强制执行。

举个例子,我做过一个众筹合约:

// 一个极简的众筹合约
contract Crowdfunding {
    address public creator;
    uint public goal;
    mapping(address => uint) public contributors;
    
    function contribute() public payable {
        contributors[msg.sender] += msg.value;
    }
    
    function withdraw() public {
        require(msg.sender == creator);
        require(address(this).balance >= goal);
        payable(creator).transfer(address(this).balance);
    }
}

这段代码的逻辑很简单:大家往合约里打钱,如果筹款达到目标,创建者可以取走。如果没达到?嗯,这里没写退款逻辑——我在真实项目中就犯过这个错,后来被用户追着骂。所以记住:智能合约一旦部署,bug就是永恒的

避坑指南:我曾经部署过一个没有暂停机制的合约,结果发现有个漏洞,但已经无法停止。最后只能硬着头皮写了个迁移合约,让用户手动转移资产。那几天我几乎没合眼。

1.3 以太坊虚拟机(EVM)

EVM是以太坊的核心。你可以把它想象成一个分布式的、全球统一的计算机。每个节点都运行着EVM,执行相同的代码,得到相同的结果。这就是「确定性」——不管你在东京还是纽约,跑同一个合约,结果一模一样。

EVM是图灵完备的,这意味着理论上它可以计算任何可计算的问题。但图灵完备有个副作用:无限循环。你想想看,如果有人在合约里写了个死循环,整个网络不就卡死了?

所以以太坊引入了Gas机制来限制计算。每个操作码(opcode)都有对应的Gas消耗。比如:

操作 Gas消耗 说明
ADD 3 加法运算
SSTORE 20000 存储数据(贵!)
CALL 700 调用其他合约
SELFDESTRUCT 5000 销毁合约

我个人习惯在写合约时,先估算一下Gas消耗。特别是存储操作,SSTORE一次要20000 Gas,比普通计算贵了上千倍。所以能存在内存里的数据,就别往链上写。

1.4 Gas机制详解

Gas是以太坊的「燃料」。每一笔交易、每一次合约调用,都需要消耗Gas。Gas的价格由市场决定——网络越拥堵,Gas价格越高。

计算公式很简单:交易手续费 = Gas Used × Gas Price

举个例子,假设你调用一个合约函数消耗了50000 Gas,当前Gas Price是50 Gwei(1 Gwei = 10⁻⁹ ETH),那么手续费就是:

50000 × 50 × 10⁻⁹ = 0.0025 ETH

如果ETH价格是2000美元,这笔手续费就是5美元。嗯,高峰期可能更贵。我记得2021年NFT最火的时候,一次简单的转账就要几十美元,简直离谱。

小技巧:我一般会在交易前查一下Gas Now之类的网站,选在Gas价格低的时候操作。如果不太急,可以设置较低的Gas Price,让矿工慢慢打包。

Gas机制还有一个重要作用:防止DDoS攻击。如果计算是免费的,攻击者可以部署一个死循环合约,让全网节点陷入瘫痪。有了Gas,攻击者每执行一步都要付钱,很快就会破产。

1.5 账户模型

以太坊有两种账户:外部账户(EOA)和合约账户。这个区分很重要,我刚开始时经常搞混。

  • 外部账户(EOA):由私钥控制,可以发起交易。就是你用的MetaMask钱包那种。
  • 合约账户:由代码控制,不能主动发起交易,只能被动响应。

每个账户都有一个状态,包含:

{
  nonce: 交易计数(防止重放攻击)
  balance: ETH余额(单位:wei)
  storageRoot: 存储数据的哈希
  codeHash: 合约代码的哈希(EOA为空)
}

这里有个关键点:合约账户不能主动发起交易。这意味着你不能写一个定时器合约,让它每天自动转账。要实现类似功能,需要外部账户定期「唤醒」合约。

我在做一个自动化分红合约时就踩过这个坑。当时想写一个每周自动分红的合约,结果发现合约自己动不了。最后只能写了个链下脚本,每周定时调用合约的分红函数。

账户模型的核心区别:EOA是「人」,合约是「机器人」。机器人不能自己按开关,需要人来按。

1.6 本章小结

这一章我们走过了从比特币到以太坊的演进之路,理解了智能合约的本质,认识了EVM这个全球计算机,搞懂了Gas的计费逻辑,也分清了两种账户的区别。

说实话,这些概念刚接触时确实有点绕。但别急,后面我们会一步步深入。下一章,我们将亲手搭建开发环境,写第一个智能合约。到时候你会发现,这些理论基础会让你少踩很多坑。

记住一句话:区块链不是魔法,只是用代码重新定义了信任