基于以太坊搭建私有链

简介

本文主要学习以太坊的底层操作,环境搭建,查看系统信息,账号创建,挖矿,交易,智能合约部署等操作

安装

机器:Mac
源码:https://github.com/ethereum/g... 本文以go版本的ethereum为例
如果是其它机型请参照 官方安装文档

brew tap ethereum/ethereum
brew install ethereum

# 如果希望基于ethereum的develop分支安装,执行 brew install ethereum --devel
brew install ethereum

初始化

以默认方式启动会连接以太坊主链,同步数据到本地,占用本地磁盘空间,所以不建议这么做。我们以私链的方式运行即可。运行私有链那么就必须定义自己的创世区块

默认方式启动,单机环境不建议使用,命令供参考

> geth

或dev模式运行
> get --dev console 2>> geth-log

# 如果这种方式启动,进入控制台需要使用 geth attach 命令

初始化
在指定目录下新建一个目录用于保存生成的数据

cd /tmp && mkdir blockchain && cd blockchain
mkdir data
touch genesis.json

目录结构如下
.
├── data
└── genesis.json

genesis.json:初始化私有链的配置文件,配置创世区块信息
data:存放区块链数据的目录。

genesis.json内容如下

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0x4c4b40"
}

参数解释:

alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a":{"balance":"100000000000000000000000000000"}}
nonce:一个64位随机数,用于挖矿。
mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。
difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。
coinbase:默认挖矿的矿工账号。
timestamp:设置创世块的时间戳。
parentHash:上一个区块的hash值,因为是创世块,所以值是0。
extraData:附加信息,随便填。
gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。

接下来我们就需要将创世区块的初始信息写入区块链中,使用geth init命令

cd /tmp/blockchain
geth --datadir "./data" --networkid 31415926 --rpc --rpccorsdomain "*" init ./genesis.json

大致会输出如下信息:

INFO [03-12|19:36:02] Allocated cache and file handles
INFO [03-12|19:36:02] Writing custom genesis block
INFO [03-12|19:36:02] Persisted trie from memory database
INFO [03-12|19:36:02] Successfully wrote genesis state

此时的目录结构就变成如下:

.
├── data
│  ├── geth
│  │  ├── chaindata
│  │  │  ├── 000001.log
│  │  │  ├── CURRENT
│  │  │  ├── LOCK
│  │  │  ├── LOG
│  │  │  └── MANIFEST-000000
│  │  └── lightchaindata
│  │      ├── 000001.log
│  │      ├── CURRENT
│  │      ├── LOCK
│  │      ├── LOG
│  │      └── MANIFEST-000000
│  └── keystore
└── genesis.json

其中keystore目录用来保存账户信息,geth目录用来保存区块信息。

启动私有链

geth --datadir data --networkid 31415926 --rpc --rpccorsdomain "*" --nodiscover console

输出如下即表示成功进入 geth 的控制台:

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.2-stable/darwin-amd64/go1.10
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

基本操作

  1. 创建账号
# 查看一下系统有的用户
> eth.accounts
[]

# 查看详细的用户信息
> personal

# 创建两个账号用于转账,或者使用 personal.newAccount() 也会提示输入密码
> personal.newAccount('123456')
> personal.newAccount('123456')

> eth.accounts
["0x18a6581a285f40ac3faaa646e13d7c6dd87276f4", "0x2455572ef500cf8634a4090d6d6096c588013e2a"]
# 此时可以看下 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户密钥(丢了它,你就等于丢了币)
  1. 挖矿

账号创建好了,但是一开始账号都没有 ether,这时就需要挖矿获取币了。
使用miner.start()命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase 账户中的,也就是第一个账户。

# 查看账号1下的余额
> eth.getBalance(eth.accounts[0])

# 查看coinbase账号
> eth.coinbase
0x18a6581a285f40ac3faaa646e13d7c6dd87276f4

# 如果想要把挖到的矿存入其他账户,可以使用
> miner.setEtherbase(eth.accounts[1])
true

开始挖矿,我们先把coinbase改成账号1
> miner.setEtherbase(eth.accounts[0])
true

# 如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。
> miner.start(1)
INFO [05-31|19:57:17] Updated mining threads                   threads=0
INFO [05-31|19:57:17] Transaction pool price threshold updated price=18000000000
INFO [05-31|19:57:17] Starting mining operation
INFO [05-31|19:57:17] Commit new mining work                   number=12 txs=0 uncles=0 elapsed=194.667µs
INFO [05-31|19:57:19] Successfully sealed new block            number=12 hash=82d29d…65290c
INFO [05-31|19:57:19]  

相关推荐