2、区块链基础回顾:以太坊与EVM、账户模型、Gas机制、交易的生命周期

好,咱们进入第二章。说实话,每次讲NFT之前,我都得先带大家把地基夯实。你想想看,如果连以太坊怎么跑起来的都不清楚,后面写智能合约肯定会踩坑。我自己带过不少新人,发现很多人一上来就写合约,结果连Gas为什么烧掉了都不知道。

这一章,咱们就聊聊以太坊的几个核心概念。别急,我会用我踩过的坑帮你把路铺平。

2.1 以太坊与EVM:一台全球共享的“世界计算机”

以太坊是什么?说白了,它就是一个去中心化的全球账本。但跟比特币不一样,它不仅能记账,还能运行程序。这个运行程序的环境,就叫EVM(以太坊虚拟机)。

EVM 的核心特点:

  • 图灵完备:理论上能算任何问题。但别高兴太早,算力是有代价的——Gas。
  • 沙盒隔离:每个合约跑在自己的小世界里,互相不影响。嗯,这里要注意,虽然隔离,但数据是共享的。
  • 确定性:同样的输入,全世界节点跑出来的结果必须一模一样。否则就分叉了。

我个人习惯:把EVM想象成一个单线程的虚拟机。虽然它实际上能并行处理很多交易,但每个交易内部是顺序执行的。这个理解对后面优化Gas很有帮助。

我记得有一次,我在测试网上部署一个复杂的NFT合约,结果Gas估算完全不准。后来才发现,是因为EVM的存储操作比计算操作贵得多。你想想看,一次 SSTORE 操作,比一百次加法还贵。这就是EVM的设计哲学——存储是稀缺资源。

2.2 账户模型:EOA 与 合约账户

以太坊有两种账户,这个必须分清楚。很多新手搞混了,结果转错钱。

特性 EOA(外部账户) 合约账户
谁控制 私钥持有者 合约代码
能否发起交易 不能(只能被调用)
是否有代码 有(合约字节码)
存储什么 ETH 余额 ETH 余额 + 状态数据
创建方式 生成密钥对 部署交易

EOA(外部账户):就是你用MetaMask生成的那个地址。私钥在你手里,你想转钱就转钱,想调合约就调合约。说白了,它是整个以太坊的“入口”。

合约账户:这个地址不是人控制的,是代码控制的。比如你的NFT合约部署后,就会生成一个合约地址。它自己不能主动发起交易,只能被别人调用。

避坑指南:我曾经见过一个项目,把私钥直接写在了合约里。结果呢?合约账户里的ETH被黑客一秒提光。记住,合约账户没有私钥!它的行为完全由代码逻辑决定。

为什么会这样设计?其实很简单。EOA代表“人”,合约账户代表“规则”。你想让规则自动执行,就得用合约账户。NFT的铸造、转移、元数据更新,全是靠合约账户里的代码来执行的。

2.3 Gas机制:为什么每步操作都要花钱?

Gas是以太坊的“燃料”。你每执行一个操作,不管是转账还是调用合约,都得付Gas。这个设计很聪明——防止有人恶意塞满区块。

Gas 的计算公式:

交易费用 = Gas Used × Gas Price (Gwei)

其中:

  • Gas Used:实际消耗的Gas量,由操作复杂度决定。
  • Gas Price:你愿意为每单位Gas支付的价格,单位是Gwei(1 ETH = 10^9 Gwei)。

举个例子,一个简单的ETH转账,固定消耗21000 Gas。但如果你调用一个复杂的NFT铸造合约,可能消耗10万甚至更多Gas。为什么?因为合约里要写状态、要检查权限、要触发事件。

我个人经验:写NFT合约时,最贵的操作往往是 _safeMintsetApprovalForAll。尤其是 _safeMint,它不仅要写你的余额,还要检查接收方是不是合约,如果是合约还得调用它的 onERC721Received 方法。这一套下来,Gas轻松破10万。

Gas 的“三高”问题:

  1. 高波动:网络拥堵时,Gas Price能飙到几百Gwei。我见过最夸张的一次,一个简单的NFT mint花了0.1 ETH的Gas费。
  2. 高浪费:如果你设置的Gas Price太低,交易可能一直pending,最后被丢弃。但Gas费不会退给你——因为矿工已经验证过了。
  3. 高复杂度:EIP-1559之后,Gas机制变成了基础费 + 小费。基础费会被销毁,小费给矿工。这个设计让Gas费更可预测,但也更复杂了。

警告:千万不要在合约里写死Gas限制!我见过有人写 tx.gasprice 来动态调整,结果被矿工利用,白白多付了钱。正确的做法是让用户自己设置Gas Price,合约只负责估算Gas Used。

2.4 交易的生命周期:从发起到确认

一笔交易从你点击“发送”到最终上链,经历了什么?我把它拆成5步,你跟着走一遍就明白了。

第一步:签名与广播

你用私钥对交易数据签名,然后广播到以太坊网络。签名的作用是证明“这笔交易确实是你发的”。没有签名,矿工不会理你。

第二步:交易池(Mempool)

广播后的交易进入每个节点的交易池。这里要注意,交易池是公开的——任何人都能看到你还没确认的交易。这就是“三明治攻击”的温床。

避坑指南:我曾经在mempool里看到有人mint一个稀有NFT,我立刻用更高的Gas Price插队,结果抢到了。后来我反思,这种MEV(矿工可提取价值)攻击对普通用户很不公平。所以现在很多项目会用“私密交易”或“暗池”来避免这个问题。

第三步:矿工打包

矿工从交易池里选交易,按Gas Price从高到低排序。Gas Price高的优先打包。如果你给的Gas Price太低,可能永远轮不到你。

第四步:执行与验证

矿工执行你的交易,更新状态。比如你mint一个NFT,矿工会执行合约代码,把你的地址加到owner列表里,然后生成一个tokenId。这个过程会消耗Gas。

第五步:上链与确认

矿工把打包好的区块广播出去,其他节点验证。验证通过后,区块被加到链上。通常需要12个区块确认(约3分钟)才能保证交易不可逆。

交易状态一览:

状态 含义 怎么办
Pending 交易在交易池里,等待打包 提高Gas Price或等待
Success 交易成功上链 恭喜,可以查收结果了
Failed 交易执行出错,Gas不退 检查合约逻辑或Gas限制
Dropped 交易被矿工丢弃 重新发送,提高Gas Price

嗯,这里要注意一点:交易失败不代表没花钱。Gas费照收不误,因为矿工确实执行了你的交易,只是执行到一半发现报错了。所以写合约时一定要做好错误处理,别让用户白白烧钱。

小结

这一章我们聊了以太坊的四大基石:EVM、账户模型、Gas机制、交易生命周期。你想想看,这些概念其实环环相扣。EVM是执行环境,账户模型是参与者,Gas是激励机制,交易是动作载体。理解了这些,后面写NFT合约时,你就能明白为什么某个操作那么贵,为什么某个交易会失败。

下一章,咱们就正式进入NFT的世界,聊聊ERC-721标准。到时候我会用我实际部署过的合约代码,带你一步步走通。准备好了吗?