作者:邹祁峰
邮箱:[email protected]
博客:http://blog.csdn.net/qifengzou
日期:2018.03.02 13:32
转载请注明来自”祁峰”的CSDN博客
本人使用的是Ubuntu操作系统,在搭建以太坊私链的过程中踩到过不少的坑.希望此文能帮助新学者快速的掌握以太坊的搭建过程.
如果在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)
…(此处省略)
因此, 本人强烈推荐
使用源码搭建以太坊环境.
以太坊是使用go语言编写的,因此,首先需要安装和配置go编译环境. 具体过程可在网上查询.
可通过如下命令下载官方源码:
# go get github.com/ethereum/go-ethereum
待以上操作完成后,以太坊源码将会存放在$GOPATH/src/github.com/ethereum/go-ethereum目录下.[备注: 环境变量$GOPATH是安装go程序时配置的变量, 关于go的安装过程请上网查询]
进入源码目录并执行编译操作:
# cd $GOPATH/src/github.com/ethereum/go-ethereum
// 切至源码目录
# git checkout release/1.7
// 备注:当master编译失败时可以切换到其他版本进行编译
# make
// 备注:执行编译
完成以上编译后, 生成的可执行程序geth就存放在源码中的./build/bin/目录下.只需将geth程序拷贝到$PATH目录中便可使用以太坊了.
以太坊节点之间能够相互连接需满足以下2个条件:
1.相同的协议版本
2.相同的networkid
搭建私链最方便的方法是通过geth命令中的--networkid
选项, 设置一个与主网不同的networkid(主网networkid值为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' &
序号 | 机器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' &