# Mac OS
brew tap ethereum/ethereum
brew install ethereum
geth --help # 检查是否安装成功
其他系统的 geth 安装操作:点击此处
# 创建节点工程, data0 存放区块链数据
mkdir $HOME/Desktop/private_chain
mkdir $HOME/Desktop/private_chain/data0
# 创建两个账户, 因测试,密码可为 123
geth --datadir $HOME/Desktop/private_chain/data0 account new
geth --datadir $HOME/Desktop/private_chain/data0 account new
我们得到两个公钥。例如 公钥1
和 公钥2
。
作为区块链的起始区块,其他区块直接或间接引用到创世区块。因此要运行以太坊私有链,需要定义自己的创世区块,创世区块信息写在一个 JSON 格式的配置文件中。
将下面的内容保存到一个 json 文件中,例如 genesis.json
。保存在 $HOME/Desktop/private_chain/
。
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {
"公钥1": {
"balance": "20000000000000000000"
},
"公钥2": {
"balance": "0"
}
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
├── config: 链配置,新区块的出块规则依赖链配置。
├────── chainId: 即区块链网络 id,用于连接其他节点,不同 id 网络的节点无法相互连接。以太坊公网 id 为 1。
├── alloc: 即分配,创世初始账户的资产配置,直接将账户资产写入区块中。
├── coinbase: 即「生成交易」中的 from。
├── difficulty: 挖矿难度系数,与出块速度成负相关。
├── extraData: 额外数据。
├── gasLimit: 十六进制,燃料上限。
├── nonce: 随机数。
├── parentHash: 母区块的哈希值。
└── timestamp: UTC 时间戳。
此时的目录结构应该是这样的:
private_chain
├── data0
└── genesis.json
# 进入工程目录
cd $HOME/Desktop/private_chain
# 写入创世区块
geth --datadir data0 init genesis.json
返回的信息中看到 Successfully wrote genesis state
,写入创世区块成功。
# 启动节点并进入交互式控制台
geth --datadir data0 --networkid 10086 console
返回的信息中看到 Welcome to the Geth JavaScript console!
,启动节点成功。
# 交互式控制台中
# 查询账户
> eth.accounts
# 查询账户余额
> eth.getBalance(eth.accounts[0])
> eth.getBalance(eth.accounts[1])
查询到第一个账户有余额 20000000000000000000
,第二个账户有余额 0
。
# 交互式控制台中
# 向第二个账户转账 5000 wei。报错 authentication needed: password or unlock。
eth.sendTransaction({'to': eth.accounts[1], 'from': eth.accounts[0], 'value': 5000})
# 转账前解锁
personal.unlockAccount(eth.accounts[0])
# 再转账则成功
eth.sendTransaction({'to': eth.accounts[1], 'from': eth.accounts[0], 'value': 5000})
# 开启挖矿对交易进行打包。打包一个区块之后就停止挖矿。
miner.start(1);admin.sleepBlocks(1);miner.stop();
经过上述操作,查看第二个账户余额,就会发现为 5000,即转账成功。