第二章 区块链基础与智能合约
2.1 区块链核心概念
区块链这东西,说白了就是一个分布式账本。我刚开始接触时也觉得玄乎,后来想通了——它就是一群人共同记账,谁也别想篡改。
核心就三个东西:
- 区块:装交易的容器。每个区块都有个哈希值,像指纹一样唯一。
- 链:区块按时间顺序串起来。后一个区块包含前一个的哈希,所以改一个就得改全部。
- 共识机制:大家怎么达成一致。以太坊用PoS,比特币用PoW。
我在项目中遇到过一个问题:有人问「区块链是不是就是比特币?」其实不是。比特币是区块链的一个应用,就像电子邮件是互联网的一个应用一样。
关键点:区块链的核心价值在于去中心化、不可篡改、透明可追溯。这三个特性决定了它能做什么、不能做什么。
2.2 以太坊与EVM
以太坊跟比特币最大的区别是什么?比特币只能转账,以太坊能跑程序。这个程序就是智能合约。
EVM(以太坊虚拟机)是什么?你可以把它想象成一个全球统一的计算机。每个节点都跑着同样的EVM,执行同样的代码,得到同样的结果。
我个人习惯把EVM比作一个「沙盒」:
- 它隔离了合约代码和外部系统
- 它限制了计算资源(Gas机制)
- 它保证了确定性执行
为什么会需要Gas?嗯,这是为了防止有人写死循环把全网搞崩。你想想看,如果执行代码不花钱,那恶意攻击者可以写个无限循环,让所有节点卡死。Gas就是按计算步骤收费,你钱花完了,机器就停了。
避坑指南:我曾经在测试网上部署合约时,忘了设置Gas limit,结果交易一直pending。后来才发现默认Gas limit太低。记住:主网部署时,Gas price别设太低,否则矿工不搭理你。
2.3 智能合约原理
智能合约就是跑在区块链上的程序。它跟普通程序最大的区别是:一旦部署,就不能改了。
我经常跟团队说:智能合约不是「智能」的,它是「死板」的。它严格按照代码执行,不会变通。所以写合约时,你得把所有可能的情况都考虑到。
智能合约的生命周期:
- 编写:用Solidity写代码
- 编译:转成字节码
- 部署:发到以太坊网络,得到一个合约地址
- 调用:用户通过交易调用合约函数
- 销毁:用selfdestruct操作码销毁合约
这里有个关键点:合约部署后,代码就存在链上了。任何人都能查看。所以别把私钥、密码这类敏感信息写进合约里。
注意:智能合约一旦部署,就无法修改。如果你发现bug,只能部署新合约,然后把旧合约的数据迁移过去。这个过程叫「合约迁移」,很麻烦。所以测试一定要充分。
2.4 Solidity语言入门
Solidity是写以太坊智能合约的主要语言。它语法跟JavaScript有点像,但有很多独特的地方。
先看一个最简单的合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HelloWorld {
string public message;
constructor(string memory _message) {
message = _message;
}
function setMessage(string memory _message) public {
message = _message;
}
function getMessage() public view returns (string memory) {
return message;
}
}
这段代码做了三件事:
- 定义了一个状态变量
message,存在链上 - 构造函数初始化消息
- 提供了读取和修改的方法
我个人习惯用 0.8.x 版本,因为内置了溢出检查。早期版本(0.7以下)你得自己用SafeMath库,一不小心就踩坑。
Solidity里几个重要的数据类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| uint | 无符号整数 | uint256 public count = 0; |
| address | 以太坊地址 | address public owner; |
| mapping | 键值对存储 | mapping(address => uint) public balances; |
| struct | 自定义结构体 | struct User { string name; uint age; } |
写合约时,我最常犯的错误是忘记考虑Gas消耗。比如在循环里做大量计算,Gas会飙升。你想想看,用户调用一次函数花几百美元,谁受得了?
小技巧:写合约时,尽量把计算逻辑放在链下,链上只做状态变更。比如NFT的元数据,存在IPFS上,链上只存哈希。这样既省钱又高效。
最后说一句:学Solidity最好的方式就是动手写。我建议你先在Remix IDE上练手,部署到测试网试试。别一上来就上主网,那代价太大了。
嗯,这一章就到这。下一章我们讲NFT标准,ERC-721和ERC-1155,这两个是NFT铸造的核心。