区块链 之 搭建以太坊私有链

区块链 之 搭建以太坊私有链

作者:邹祁峰
邮箱:[email protected]
博客:http://blog.csdn.net/qifengzou
日期:2018.03.02 13:32
转载请注明来自”祁峰”的CSDN博客

1 引言

本人使用的是Ubuntu操作系统,在搭建以太坊私链的过程中踩到过不少的坑.希望此文能帮助新学者快速的掌握以太坊的搭建过程.

2 安装步骤

如果在Ubuntu中直接使用”apt-get install geth”安装以太坊环境,虽然在终端模式下能够正常使用geth的相关命令,但是进行智能合约的部署操作”truffle migrate”时可能会出现如下异常: [原因:由于truffle与geth的版本不匹配]

Using network ‘development’.

Running migration: 1_initial_migration.js
Deploying Migrations…
… 0x41fc37a37333d251c762c6d1e337e58abe89e941ce94a9655897586e010b0b43
Migrations: 0x4a350b563a48fc1d7e2f85057ae6aabc2b6f3827
Saving successful migration to network…
… 0x1fc8a9c099d743812f0469c83cce6cd3d550d9725fdbe0f59650183d705c4c26
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: unknown transaction
at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
…(此处省略)

因此, 本人强烈推荐使用源码搭建以太坊环境.

2.1 前期准备

以太坊是使用go语言编写的,因此,首先需要安装和配置go编译环境. 具体过程可在网上查询.

2.2 下载源码

可通过如下命令下载官方源码:

# go get github.com/ethereum/go-ethereum

待以上操作完成后,以太坊源码将会存放在$GOPATH/src/github.com/ethereum/go-ethereum目录下.[备注: 环境变量$GOPATH是安装go程序时配置的变量, 关于go的安装过程请上网查询]

2.3 编译源码

进入源码目录并执行编译操作:

# cd $GOPATH/src/github.com/ethereum/go-ethereum // 切至源码目录
# git checkout release/1.7 // 备注:当master编译失败时可以切换到其他版本进行编译
# make // 备注:执行编译

完成以上编译后, 生成的可执行程序geth就存放在源码中的./build/bin/目录下.只需将geth程序拷贝到$PATH目录中便可使用以太坊了.

3 搭建私链

以太坊节点之间能够相互连接需满足以下2个条件:

1.相同的协议版本
2.相同的networkid

搭建私链最方便的方法是通过geth命令中的--networkid选项, 设置一个与主网不同的networkid(主网networkid值为1), 这也是官方推荐的方式.

3.1 创世区块

序号 机器IP 备注
01 10.168.0.1 初始节点

1.新建目录

# mkdir private-block
# cd private-block

2.新建配置
在私链目录下新建配置文件,配置文件名:genesis.json(可以随便命名)

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

3.创世节点
通过如下命令初始化创世节点:

# geth --datadir ./data/00 init genesis.json

4.启动私链
通过如下命令启动私链, 该命令的各选项含义和作用将在后续博文中进行讲解.

# geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.1 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --nodiscover console

参数描述:

序号 字段 描述 备注
01 datadir 数据加载和存储目录
02 networkid 网络编号, 主网ID为1,私网ID为其他值
03 port 私链节点之间的通信端口
04 rpc 是否开启HTTP-RPC功能 默认关闭
05 rpcaddr 指定HTTP-RPC网卡IP 默认127.0.0.1,导致其他机器无法访问
06 rpcport 指定HTTP-RPC通信端口 默认8545
07 rpcapi 指定提供哪些HTTP-RPC的接口

完成以上操作后,私链就已搭建完成, 这时可以输入以太坊的相关命令进行账户管理/节点管理/挖矿/转账交易等操作了.

5.创建账号
1.查看当前节点的账号列表

> eth.accounts
[]

2.新建账号
通过personal.newAccount()新建账号, 该方法的参数为私钥, 输出结果为公钥.私钥用于数据的加密, 公钥用于数据的解密, 公钥也是账户的地址.

> personal.newAccount(“123456”)
“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”

> eth.accounts // 查看账号信息
[“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”]

3.节点信息
每个区块链节点的enode是唯一的, 新建节点要加入某链, 其需要将该链中某节点的enode加入到自己的远程节点列表中. 可通过以下命令查看enode值:

>admin.nodeInfo.enode // 查看enode信息
“enode://3a5d4f2c15ae0e16bbf1e7c819558373e0b6d4dfcb72a931c3e59ed72f01fc217c97c3556ebb3f0c09afab94fda136f4cb80d757ba75c9f3be7742b3c8834169@[::]:28000?discport=0”

6.挖矿操作
1.开始挖矿

> miner.start()

2.开始挖矿

> miner.stop()

3.账户余额

> eth.getBalance(eth.accounts[0])
635000000000000000000

7.后台运行
如果要后台运行以太坊节点, 则可输入以下指令:

# nohup geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.1 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --unlock '0' &

3.2 添加节点

序号 机器IP 备注
01 10.168.0.2 新增节点

1.初始节点
通过如下命令初始化节点:

# geth --datadir ./data/00 init genesis.json // 配置信息与初始节点一直

2.启动节点
通过如下命令启动私链新节点, 该命令的各选项含义和作用将在后续博文中进行讲解.

# geth --datadir ./data/00 --networkid 15 --port 61910 --rpc --rpcaddr 10.168.0.2 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --nodiscover console

3.创建账号
1.查看当前节点的账号列表

> eth.accounts
[]

2.新建账号
通过personal.newAccount()新建账号, 该方法的参数为私钥, 输出结果为公钥.私钥用于数据的加密, 公钥用于数据的解密, 公钥也是账户的地址.

> personal.newAccount(“123456”)
“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”

> eth.accounts
[“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”]

4.添加节点
由于此时该节点并未与其他节点建立联系, 因此此时该节点还是一个孤立节点. 其要加入刚才的私链中, 需要将其他一个或多个节点加入到本地:

>admin.addPeer(“enode://3a5d4f2c15ae0e16bbf1e7c819558373e0b6d4dfcb72a931c3e59ed72f01fc217c97c3556ebb3f0c09afab94fda136f4cb80d757ba75c9f3be7742b3c8834169@10.168.0.1:28000?discport=0”) // 添加远程节点
>admin.peers // 查看远程节点列表

5.后台运行
如果要后台运行以太坊节点, 则可输入以下指令:

# nohup geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.2 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --unlock '0' &

你可能感兴趣的:(开发记录,区块链)