以太坊学习
在remix上构建简单的水龙头合约
搭建以太坊私链
首先,我们需要创建网络的“创世”(genesis)状态,这写在一个JSON文件里(例如,我们
将其命名为 genesis.json)
1 | { |
核心字段说明
| 字段 | 值 | 含义 |
|---|---|---|
config.chainId |
15 | 链ID,用于区分不同以太坊网络(主网=1,测试网如Goerli=5,私有链可自定义)。 |
terminalTotalDifficulty |
0 | 强制从区块0开始PoS(设为 "0x1" 可模拟主网过渡,但私有链建议直接PoS)。 |
ethash |
{} |
声明使用PoW算法(即使实际运行PoS,Geth 仍需要此字段占位)。 |
difficulty |
“2000” | 初始挖矿难度,值越低越容易挖矿(私有链通常设低值以快速出块)。 |
gasLimit |
“2100000” | 每个区块的Gas上限,限制区块内交易的总计算量(默认与主网一致)。 |
alloc |
{…} | 预分配账户余额,指定初始账户地址及其ETH余额(单位:wei)。 |
要创建一条以它作为创世块的区块链,我们可以使用下面的命令:
1 | geth --datadir ./myChain init genesis.json |
在当前目录下运行 geth,就会启动这条私链,注意要将 networked 设置为与创世块配置里的chainId 一致。
1 | geth --datadir ./myChain --networkid 631024 |
使用console进行交互
1 | geth --datadir ./myChain --networkid 631024 console |

Geth控制台命令
Geth Console 是一个交互式的 JavaScript 执行环境,里面内置了一些用来操作以太坊的 JavaScript 对象,我们可以直接调用这些对象来获取区块链上的相关信息。这些对象主要包括:
| 命令 | 内容 |
|---|---|
| eth | 主要包含对区块链进行访问和交互相关的方法 |
| net | 主要包含查看 p2p 网络状态的方法 |
| admin | 主要包含与管理节点相关的方法 |
| miner | 主要包含挖矿相关的一些方法 |
| personal | 包含账户管理的方法 |
| txpool | 包含查看交易内存池的方法 |
| web3 | 包含以上所有对象,还包含一些通用方法 |
常用命令有:
| 命令 | 作用 |
|---|---|
| personal.newAccount() | 创建账户(Geth v1.11.0版本以上无法使用) |
| personal.unlockAccount() | 解锁账户(Geth v1.11.0版本以上无法使用) |
| eth.accounts | 列出系统中的账户 |
| eth.getBalance(“账户”) | 查看账户余额,返回值的单位是 Wei |
| eth.blockNumber | 列出当前区块高度 |
| eth.getTransaction() | 获取交易信息 |
| eth.getBlock() | 获取区块信息 |
| miner.start() | 开始挖矿 |
| miner.stop() | 停止挖矿 |
| web3.fromWei() | Wei 换算成以太币 |
| web3.toWei() | 以太币换算成 Wei |
| txpool.status | 交易池中的状态 |
注意事项
- 从 Geth v1.11.0 开始,
personalAPI 默认被禁用(出于安全考虑),因为它涉及敏感操作(如账户解锁)
创建账户解决方案:
直接在终端运行以下命令(无需进入控制台):
1 geth account new --datadir ./your_data_dir![]()
eth.sendTransaction({from:"0x935482EE0d200CD36DFF06A5438A96CAC68Fdf45",to:eth.accounts[0 ],value:1000000})//从创世块时,创建的账户向其他账户转账是不成功的,因为keystore中没有这个账户eth.sendTransaction({from:eth.accounts[0],to:"0x935482EE0d200CD36DFF06A5438A96CAC68Fdf45",value:1000000})//从其他账户直接转账是不成功的,因为需要先解锁账户
解锁账户解决方案:
方法 1:使用启动参数解锁账户(推荐)
直接在启动 Geth 时解锁账户(无需调用
personal.unlockAccount):
1 geth --unlock "0xYourAccountAddress" --password ./password.txt
- **
password.txt**:包含账户密码的文本文件(需确保文件权限安全)。- 注意:需配合
--allow-insecure-unlock参数(如果使用 HTTP RPC)。方法 2:使用
eth.sendTransaction自动解锁Geth 支持在发送交易时临时解锁账户:
1
2
3
4
5 eth.sendTransaction({
from: eth.accounts[0],
to: "0xRecipientAddress",
value: web3.toWei(1, "ether")
}, "yourPassword"); // 直接传入密码(不推荐,仅测试用)
1 | 常用语句: |