零基础以太坊开发入门,从环境搭建到你的第一个智能合约
什么是以太坊?为什么值得开发
在开始之前,我们先简单理解两个核心概念:
- 以太坊(Ethereum):不仅仅是一种加密货币(如比特币),更是一个去中心化的区块链平台,它的核心特点是支持“智能合约”——一段自动执行、不可篡改的代码,能实现无需第三方信任的价值交换或逻辑控制(比如投票、众筹、NFT等)。
- 为什么开发?:以太坊是Web3世界的“操作系统”,无论是想构建DeFi应用、NFT项目,还是探索去中心化身份(DID)、DAO组织,掌握以太坊开发都是进入Web3时代的“敲门砖”。
零基础开发前:你需要准备这些“装备”
无需编程基础?不,至少需要一点Python或JavaScript基础(理解变量、函数、循环即可),以及一颗耐心,准备以下工具:
- 电脑环境:Windows/macOS/Linux均可(推荐macOS或Linux,兼容性更好)。
- 浏览器插件:MetaMask(数字钱包,用于与以太坊网络交互,官网下载安装)。
- 代码编辑器:VS Code(免费、插件丰富,安装Solidity插件——后续会用到)。
- 网络连接:稳定的互联网(开发时需要连接以太坊测试网)。
第一步:搭建开发环境——本地“以太坊世界”怎么来
以太坊开发的核心工具是 Truffle Suite(开发框架)和 Ganache(本地区块链节点),简单理解:Ganache是你的“私人以太坊网络”,可以随意测试转账、部署合约;Truffle则帮你管理代码、编译合约、部署到网络。
操作步骤(以macOS/Linux为例,Windows类似):
- 安装Node.js:访问nodejs.org 下载LTS版本(自带npm包管理器),安装后打开终端,输入
node -v和npm -v确认安装成功。 - 安装Ganache:
- 方式一(推荐):下载桌面版Ganache,安装后打开,会看到一个本地区块链界面,默认有10个测试账户,每个账户都有100个“测试用ETH”(虚拟币,仅用于开发)。
- 命令行安装(
npm install -g ganache),运行ganache启动。
- 安装Truffle:终端输入
npm install -g truffle(全局安装),后续用truffle version确认安装成功。
第二步:创建你的第一个以太坊项目
我们用Truffle初始化一个项目,并编写一个简单的“智能合约”——一个能存储和读取数字的“数字钱包”。
初始化项目
在终端进入你想存放项目的文件夹,运行:
mkdir my-first-dapp cd my-first-dapp truffle init
执行后,会生成以下文件夹结构:
contracts/:存放智能合约代码(Solidity语言)。migrations/:部署脚本(告诉Truffle如何部署合约)。test/:测试文件。truffle-config.js:Truffle配置文件。
编写智能合约
打开 contracts/ 文件夹,删除默认的 Migrations.sol,新建 SimpleStorage.sol,输入以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 private storedData; // 存储数字的变量(private表示外部不可直接访问)
// 存储数字的函数
function set(uint256 x) public {
storedData = x;
}
// 读取数字的函数
function get() public view returns (uint256) {
return storedData;
}
}
代码解释:
SPDX-License-Identifier:开源协议(MIT表示可自由使用)。pragma solidity ^0.8.0:指定Solidity版本(0.8.0以上,兼容0.8.x)。contract:智能合约的“容器”,类似Python的class或Java的class。uint256:256位无符号整数(0到2²⁵⁶-1)。public:函数修饰符,表示外部可调用。view:表示函数只读,不修改区块链状态。
第三步:编译与部署——让“代码”上链
智能合约是“文本”,需要编译成机器能识别的“字节码”,再部署到区块链上(这里先部署到本地Ganache)。
编译合约
终端运行:
truffle compile
成功后,build/contracts/ 目录会生成 SimpleStorage.json,这是合约的“ABI文件”(应用程序二进制接口,定义了合约与外部交互的接口)。
配置部署脚本
打开 migrations/ 文件夹,新建 2_deploy_simple_storage.js(数字表示执行顺序),输入:
const SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function (deployer) {
deployer.deploy(SimpleStorage);
};
解释:artifacts.require 引用合约,deployer.deploy 告诉Truffle部署这个合约。
部署到本地网络
终端运行:
truffle develop
会启动一个本地开发节点(类似Ganache,但集成在Truffle中),并进入交互式命令行(truffle (develop)>),输入:
migrate --network develop
(如果之前没关闭Ganache,也可在 truffle-config.js 中配置本地网络,然后直接用 truffle migrate 部署到Ganache)。
看到 Deploying 'SimpleStorage'... 并提示 success 后,合约就部署成功了!记下合约地址(如 0x5FbDB2315678afecb367f032d93F642f64180aa3),后续要用它调用合约。
第四步:与合约交互——调用你的第一个“区块链功能”
部署完合约,怎么“使用”它?比如调用 set 存储数字,再用 get 读取,这里我们用 Web.js(以太坊JavaScript库)在网页中交互。
创建前端页面
在项目根目录新建 src/ 文件夹,里面创建 index.html 和 app.js。
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"> My First DApp</title>
<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script>
</head>
<body>
<h1>Simple Storage DApp</h1>
<input type="number" id="numberInput" placeholder="输入数字">
<button onclick="setNumber()">存储数字</button>
<button onclick="getNumber()">读取数字</button>
<p id="result">结果:--</p>
<script src="app.js"></script>
</body>
</html>
app.js:
// 合约ABI(从build/contracts/SimpleStorage.json复制)
const contractABI = [
{
"inputs": [],
"name": "get",
"outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [{"internalType": "uint256", "name": "x", "type": "uint256"}],
"name": "set",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
];
// 合约地址(部署后终端输出的地址)
const contractAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3";
// 初始化以太坊Provider(连接到本地网络)
const provider = new ethers.providers.Web3Provider(web3.currentProvider);
// 获取MetaMask账户
async function getAccount() {
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
return accounts[0];
}
// 存储数字
async function set