环境准备与基础配置

在开始搭建以太坊开发环境前,需确保CentOS7系统满足基本要求,并完成基础配置,以下是详细步骤:

1 系统要求

  • 操作系统:CentOS7.x(64位)
  • 内存:至少4GB(推荐8GB以上,运行节点或编译工具时更流畅)
  • 存储:至少50GB可用空间(用于安装Go、Node.js、Geth等工具及区块链数据)
  • 网络:稳定的互联网连接(用于下载依赖包)

2 更新系统并安装基础工具

打开终端,执行以下命令更新系统并安装必要的开发工具:

# 更新系统软件包
sudo yum update -y
# 安装基础开发工具(gcc、make、wget等)
sudo yum groupinstall "Development Tools" -y
sudo yum install wget curl git vim -y

3 配置防火墙与SELinux

CentOS7默认使用firewall和SELinux,需开放必要端口(如P2P端口30303、RPC端口8545等):

# 开启防火墙并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 开放常用端口(根据实际需求调整)
sudo firewall-cmd --permanent --add-port=30303/tcp  # Geth P2P端口
sudo firewall-cmd --permanent --add-port=30303/udp  # Geth P2P端口
sudo firewall-cmd --permanent --add-port=8545/tcp  # HTTP-RPC端口
sudo firewall-cmd --permanent --add-port=8546/tcp  # WebSocket-RPC端口
sudo firewall-cmd --reload
# 临时关闭SELinux(生产环境建议配置规则而非直接关闭)
sudo setenforce 0
# 永久关闭(需重启系统,生产环境慎用)
# sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

安装Go语言环境

以太坊核心工具(如Geth)使用Go语言开发,需先安装Go环境,推荐安装Go 1.19或更高版本(以太坊官方兼容版本)。

1 下载Go安装包

访问Go官方下载页面(https://golang.org/dl/)获取Cent7对应的tar包,或直接使用wget下载:

# 下载Go 1.19.5版本(可根据需要替换为最新版本)
wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz

2 解压并配置环境变量

# 创建/usr/local/go目录并解压(推荐安装到/usr/local,避免覆盖系统Go)
sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
# 配置环境变量(编辑/etc/profile文件)
sudo vim /etc/profile

在文件末尾添加以下内容:

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

保存后执行以下命令使配置生效:

source /etc/profile

3 验证Go安装

go version  # 查看Go版本(应显示go version go1.19.5 linux/amd64)
go env      # 查看Go环境变量(确认GOROOT、GOPATH等配置正确)

安装以太坊核心工具Geth

Geth(Go-Ethereum)是以太坊官方实现的Go语言客户端,支持节点运行、交易签名、智能合约交互等功能。

1 通过Go模块安装Geth

推荐使用Go官方模块安装,确保获取最新稳定版本:

# 设置Go代理(加速下载,国内用户可选)
export GOPROXY=https://goproxy.cn,direct
# 安装Geth(默认安装到$GOPATH/bin)
go get -u github.com/ethereum/go-ethereum@latest

2 配置Geth命令到系统PATH

若Go环境变量配置正确,$GOPATH/bin已包含在PATH中,可直接使用geth命令,若未找到,可手动创建软链接:

# 确认geth安装路径
ls $GOPATH/bin/geth
# 创建软链接到/usr/local/bin(可选,方便全局调用)
sudo ln -sf $GOPATH/bin/geth /usr/local/bin/geth

3 验证Geth安装

geth version  # 查看Geth版本(显示版本号及commit信息)

安装Node.js与Truffle框架

Truffle是以太坊流行的开发框架,用于智能合约编译、测试和部署,需依赖Node.js环境。

1 安装Node.js(推荐使用版本管理器nvm)

使用nvm(Node Version Manager)可灵活管理Node.js版本,避免系统环境冲突。

安装nvm

# 下载nvm安装脚本
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
# 重新加载终端配置(或执行source ~/.bashrc)
source ~/.bashrc

安装Node.js(推荐LTS版本)

# 安装Node.js 18 LTS版本(以太坊开发兼容性较好)
nvm install 18
# 切换到Node.js 18并设置为默认版本
nvm use 18
nvm alias default 18
# 验证安装
node -v  # 应显示v18.x.x
npm -v   # 显示npm版本

2 安装Truffle框架

# 全局安装Truffle(npm会自动处理依赖)
npm install -g truffle
# 验证Truffle安装
truffle version  # 显示Truffle版本及环境信息

安装其他开发工具(可选)

1 安装MetaMask浏览器插件

MetaMask是以太坊区块链钱包,支持与DApp交互,直接在Chrome、Firefox等浏览器访问https://metamask.io/下载插件并安装,无需命令行操作。

2 安装Solc(Solidity编译器)

智能合约语言Solidity需编译器solc,可通过npm安装:

# 安装solc(与Truffle版本兼容)
npm install -g solc
# 验证solc版本
solcjs --version

环境验证与测试

完成上述步骤后,需验证各工具是否正常协同工作。

1 创建测试智能合约项目

# 创建项目目录
mkdir eth-demo && cd eth-demo
# 初始化Truffle项目(会生成contracts、migrations、test等目录)
truffle init
# 查看项目结构
ls -l

2 编译测试合约

# 编辑contracts/Contract.sol(示例合约)
vim contracts/Contract.sol

输入以下测试合约代码:

pragma solidity ^0.8.0;
contract Contract {
    uint256 public value;
    constructor() {
        value = 100;
    }
    function setValue(uint256 _value) public {
        value = _value;
    }
}

编译合约:

truffle compile  # 成功后生成build/contracts/Contract.json

3 启动私有测试节点

使用Geth启动一个私有测试链(无需连接主网,适合开发调试):

# 在项目目录下执行,启动私有节点(端口30303,数据目录./data)
geth --datadir ./data --networkid 15 --http --http.addr "0.0.0.0" --http.port 8545 --http.api "eth,net,web3,personal" --allow-insecure-unlock

参数说明:

  • --datadir:指定区块链数据存储目录
  • --networkid 15:设置私有网络ID(避免与主网冲突)
  • --http:开启HTTP-RPC服务
  • --http.addr "0.0.0.0":允许任意IP访问(生产环境需限制为特定IP)
  • --http.port 8545:RPC服务端口
  • --http.api:开放的API接口

4 部署合约并交互

在新的终端窗口中,执行以下步骤部署合约:

连接到Geth节点

# 启动Geth控制台
geth attach http://localhost:8545

创建账户并解锁

# 创建新账户(密码需记录)
personal.newAccount("your_password")
# 查看账户列表(第一个账户为默认账户)
eth.accounts
# 解锁账户(部署合约