以太坊作为全球领先的智能合约平台,不仅仅是一种加密货币,更是一个去中心化的、可编程的区块链操作系统,为构建去中心化应用(DApps)提供了强大的基础设施,本文旨在为开发者提供一份详尽、循序渐进的以太坊开发攻略,从环境搭建到智能合约编写,再到前后端交互,助你迈出以太坊开发的第一步,并逐步构建出自己的DApp。
以太坊开发基础准备
在正式开始编码之前,我们需要了解一些核心概念并搭建好开发环境。
核心概念理解
- 区块链与以太坊:区块链是一种分布式账本技术,以太坊则是实现了图灵完备的智能合约功能的区块链平台。
- 智能合约:运行在以太坊虚拟机(EVM)上的自动执行的程序,是DApp的后端逻辑,通常用Solidity语言编写。
- 账户 (Accounts):分为外部账户(EOA,由用户控制,拥有私钥)和合约账户(由代码控制,没有私钥)。
- Gas:执行以太坊网络上的操作(如交易、合约部署与调用)所需的费用,用于防止网络滥用和补偿矿工。
- 钱包 (Wallets):管理以太坊账户私钥的工具,如MetaMask,是与以太坊交互的入口。
- DApp (Decentralized Application):由智能合约(后端)和传统前端(用户界面)组成的去中心化应用。
开发环境搭建
- a. 安装Node.js 和 npm/yarn:
- 访问 Node.js官网 下载并安装LTS版本。
- npm(Node Package Manager)会随Node.js一同安装,或可选择安装yarn(
npm install -g yarn)。
- b. 安装代码编辑器:
- Visual Studio Code (VS Code) 是目前最流行的选择,拥有丰富的插件生态。
- 推荐安装Solidity插件(由Juan Blanco开发)、Hardhat插件、Prettier等。
- c. 安装MetaMask:
- 浏览器插件(Chrome, Firefox, Brave等)或手机App。
- 创建新钱包,妥善保存助记词(这是你资产的唯一凭证,切勿泄露!)。
- 切换到以太坊主网或测试网(如Goerli测试网,用于开发测试)。
- d. 安装Hardhat:
- Hardhat是一个流行的以太坊开发环境,编译、测试、部署智能合约非常方便。
- 在终端中执行:
npx hardhat,然后按照提示初始化一个新的Hardhat项目,选择"Create a JavaScript project"(或TypeScript),回答相关问题,安装依赖。
智能合约开发 (Solidity + Hardhat)
智能合约是DApp的核心。
Solidity 基础语法
-
版本声明:
pragma solidity ^0.8.0;(指定编译器版本) -
合约结构:
contract HelloWorld { // 状态变量 string public greeting; // 构造函数 constructor(string memory _greeting) { greeting = _greeting; } // 函数 function setGreeting(string memory _greeting) public { greeting = _greeting; } function getGreeting() public view returns (string memory) { return greeting; } } -
数据类型:
uint(无符号整数),int(有符号整数),bool,address,string,bytes, 数组,映射(mapping)等。 -
可见性修饰符:
public(自动生成getter函数),private,internal,external。 -
状态修饰符:
view(不修改状态),pure(不读取也不修改状态),payable(可接收以太币)。 -
特殊函数:
constructor(构造函数,仅调用一次),fallback()/receive()(接收以太币或调用不存在函数时触发)。
使用Hardhat编写和测试合约
-
a. 创建合约:
- 在
contracts目录下创建新的Solidity文件,如HelloWorld.sol。
- 在
-
b. 编写测试:
- 在
test目录下创建测试文件,如helloWorld.test.js(使用Mocha和Chai框架)。const { expect } = require("chai"); const { ethers } = require("hardhat");
describe("HelloWorld", function () { it("Should return the new greeting once changed", async function () { const HelloWorld = await ethers.getContractFactory("HelloWorld"); const helloWorld = await HelloWorld.deploy("Hello, world!"); await helloWorld.deployed();
expect(await helloWorld.getGreeting()).to.equal("Hello, world!"); const setGreetingTx = await helloWorld.setGreeting("Hola, mundo!"); // 等待交易被挖矿 await setGreetingTx.wait(); expect(await helloWorld.getGreeting()).to.equal("Hola, mundo!"); }); - 在
-
c. 运行测试:
- 终端中执行:
npx hardhat test
- 终端中执行:
