Mac 以太坊开发环境搭建

Mac 以太坊开发环境搭建

一、 系统环境

macos 10.12.3

vim 8.0

wget 1.19.5

二、安装开发环境

2.1 安装Node.js

1
2
3
4
5
brew install node
brew install npm
#node更新
sudo npm install -g n
sudo n stable

2.2 安装Geth

1
2
brew tap ethereum/ethereum
brew install ethereum

2.3 安装solidity编译器

1
2
3
4
npm install -g solc
#验证
$ solcjs --version
0.4.24+commit.e67f0147.Emscripten.clang

2.4 安装web3

1
2
3
4
5
6
7
npm install -g web3
#验证
$ node –p 'require("web3")'
{
[Function: Web3]
providers:{...}
}

2.5 安装truffle框架

1
2
3
4
npm install –g truffle
#验证
$ truffle version
Truffle v4.1.14 (core: 4.1.14)

2.6 安装webpack

1
2
3
4
5
npm install -g webpack
npm install -g webpack-cli
#验证
webpack -v
4.16.5

2.7 安装testrpc

1
npm install -g ethereumjs-testrpc

三、运行私链节点

3.1 创世块配置

创建一个节点目录 node1,并在其中创建私链的创世块配置文件:

1
2
3
~$ mkdir node1
~$ cd node1
~/node1$ touch private.json

private.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"config": {
"chainId": 7878,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}

config.chainId 用来声明以太坊网络编号,选择一个大于 10 的数字即可。

difficulty 用来声明挖矿难度,越小的值难度越低,也就能更快速地出块。

3.2 初始化私链节点

执行 geth 的 init 命令初始化私链节点:

1
~/node1$ geth --datadir ./data init private.json

3.3 启动私链节点

从指定的私链数据目录启动并设定一个不同的网络编号来启动节点:

1
~/node1$ geth --rpc --datadir ./data --networkid 7878 console

创建一个脚本console.sh来简化启动节点时的输入:

1
2
~/node1$ touch console.sh
~/node1$ chmod +x console.sh

console.sh

1
2
3
4
5
6
7
#!/bin/bash
geth --rpc \
--rpcaddr 0.0.0.0 \
--rpccorsdomain "*" \
--datadir ./data \
--networkid 7878 \
console

通过脚本启动节点

1
~/node1$ ./console.sh

3.4 账户操作

3.4.1 创建新账户

在 geth 控制台,使用 personal 对象的 newAccount()方法创建一个新账户,参数为你自己选择的密码:

1
2
> personal.newAccount('78787878')
"0x8d264cf82fc4724104830cd9ac7ef52cb341c1dc"

输出就是新创建的账户地址(公钥).geth 会保存到数据目录下的 keystore 文件中。密码要自己记住,以后还需要用到

3.4.2 查询账户列表

在 geth 控制台,使用 eth 对象的 accounts 属性查看目前的账户列表:

1
2
> eth.accounts
["0xc95b08ee25d45649f55a7413f4b569b535ef5f2b", "0x8d264cf82fc4724104830cd9ac7ef52cb341c1dc"]
3.4.3 查询账户余额

在 geth 控制台,使用 personal 对象的 getBalance()方法获取指定账户的余额,参数为账户地址:

1
2
> eth.getBalance(eth.accounts[0])
0

或者直接输入账户地址:

1
2
> eth.getBalance("0x8d264cf82fc4724104830cd9ac7ef52cb341c1dc")
0

新创建的账户,余额果然为 0。

3.4.4 挖矿

通过miner对象的start()方法启动挖矿

1
miner.start()

停止挖矿

1
miner.stop()
3.4.5 解锁账户

在部署合约时需要一个解锁的账户。在 geth 控制台使用 personal 对象的 unlockAccount()方法来解锁挃定的账户,参数为账户地址和账户密码(在创建账户时挃定的那个密码):

1
2
 > eth.unlockAccount(eth.accounts[0],'78787878')
true

四、构建示例项目

4.1 新建DApp项目

使用webpac模板初始化项目骨架结构:

1
2
3
4
5
~/demo$ truffle unbox webpack
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

4.2 安装项目依赖的NPM包

1
npm install

4.3 修改truffle配置

truffle.js 中,修改 port 为 8545,networks下选择development,因为 geth 默认在 8545 端口监听:

1
2
3
4
5
6
7
8
module.exports = {
networks:{
development: {
...
port: 8545 ...
}
}
}

4.4 启动节点

通过脚本启动

1
2
~$ cd node1
~/node1$ ./console.sh

解锁账户

1
2
> personal.unlockAcount(eth.accounts[0],'78787878')
true

4.5 编译合约

1
~/demo$ truffle compile

4.6 部署合约

执行 truffle migrate

1
~/demo$ truffle migrate

可能出现的错误 Error: exceeds block gas limit

解决方法 首先可能账户余额不足,先挖一段时间的矿, 获取tuffle console里的gaslimit 修改truffle.js添加 gas:XXXX值

1
2
3
$ truffle console
truffle(development)> web3.eth.getBlock("pending").gasLimit
6712390

修改 truffle.js 文件,加入 gas 值为上面所查询的值:

1
2
3
4
5
6
7
8
9
10
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
gas: 6712390,
network_id: "*" // Match any network id
}
}
};

4.7 合约上链

truffle 部署合约后,在等待部署交易提交,是因为我们在私链中还没有启动挖矿。

使用txpool.status 查询交易池状态

1
2
3
4
5
> txpool.status
{
pending:1,
queued:0
}

发现有个交易被挂起 启动挖矿

1
miner.start()

4.8 启动DApp

执行npm命令启动

1
~/demo$ npm run dev

在浏览器 访问http://localhost:8080/

image-20180816122511932

Reference

汇智网以太坊私链geth搭建教程

truffle migrate error