以太坊私链与智能合约部署学习(博主修正篇)—— 第一篇
以太坊(Ethereum)自2017年5月诞生以来,发展迅速。作为了一个小白,博主初步打算上个车,过个瘾。那什么是以太坊?请参看度娘的解释(https://baike.baidu.com/item/%E4%BB%A5%E5%A4%AA%E5%9D%8A/20865117?fr=aladdin)。
事物是个新事物,也是个好东西,但资料不多,所以小白博主也只能慢慢找寻资料,慢慢记录自己填坑的过程。
第一篇的主题是:以太坊私链的创建:)
一、配置环境与软件安装
1、安装geth
以下的资料来自:http://8btc.com/article-4537-1.html
MAC OSX
首先确保已安装 homebrew,没有安装过的可以在命令行下执行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 进行安装
brew tap ethereum/ethereum
brew install ethereum
WINDOWS
访问 https://geth.ethereum.org/downloads/
下载并安装 Geth for Windows
LINUX
git clone https://github.com/ethereum/go-ethereum
sudo apt-get install -y build-essential golang
cd go-ethereum
make geth
在这里,我们约定,go-ethereum的绝对路径为:/alidata/go-ethereum。
如果你觉得按照上面的命令能顺利执行,那就图森破了。这里有两点需要注意:
首先:千万选用ubuntu而不是centos,各种库无法编译,单单填centos依赖库的坑都能把搓衣板跪穿。对于像我这样的小白级别,建议跟着教程走,调通了demo之后再去折腾centos。
其次:golang的安装,要到https://www.golangtc.com/download下载go1.9.2.linux-amd64.tar.gz,进行编译安装。因为apt-get下载后的版本是1.6,而go-ethereum需要的最低版本是1.7。报错信息为:go-ethereum 1.6 Makefile:15: recipe for target 'geth' failed。编译步骤:
tar -xvf go1.9.linux-amd64.tar.gz
mv go /usr/local/src
mkdir $HOME/gosrc && cd $HOME/gosrc
mkdir bin pkg src
更新系统变量:
vim ~/.profile
export GOROOT=/usr/local/src/go
export GOPATH=$HOME/gosrc
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOROOT/bin
source ~/.profile
安装完Golang之后,再进入/alidata/go-ethereum,进行make geth,就可以顺利编译了。成功之后执行/alidata/go-ethereum/build/bin/geth -h,有如下回显则说明安装成功:
2、安装npm
因为solc的安装要依赖于nodejs的npm组件。这一步相对简单:apt-get install npm
3、安装solc
按照教程示例,只需要简单的npm install -g solc,慢慢坐着等即可。
运行一段时间后,你会发现,自己又太天真了,天朝的网络质量,可以让你等到天荒地老。天朝的问题,只能在天朝内解决,我们可以依靠无所不能的大淘宝:
npm install -g cnpm --registry=https://registry.npm.taobao.org
apt-get install install nodejs-legacy
cnpm install solc
cnpm install -g solc
注意:到这里,solc安装成功。(但博主仍感觉有什么地方怪怪的,之后的文章会进一步求证,广大客官就先不用纠结了,答案近期分晓)
二、配置私链节点
以下这一部分,参照http://8btc.com/article-4537-1.html 说明的步骤进行操作,不会有问题。
1、创世区块的设置
创建/alidata/godblock/路径,这个路径的名称随意,觉得怎么牛B就怎么取。在这个路径下创建genesis.json文件和data目录。
genesis.json 的内容如下:
{
"config": {
"chainId": 123456,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x4c4b40",
"alloc": {}
}
解释一下各个参数的作用:(来自:http://blog.csdn.net/sportshark/article/details/51855007)
mixhash |
与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。. |
nonce |
nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。 |
difficulty |
设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度 |
alloc |
用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。 |
coinbase |
矿工的账号,随便填 |
timestamp |
设置创世块的时间戳 |
parentHash |
上一个区块的hash值,因为是创世块,所以这个值是0 |
extraData |
附加信息,随便填,可以填你的个性信息 |
gasLimit |
该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。 |
2.2 初始化
在命令行下进入刚才创建的文件夹/alidata/godblock/,输入如下命令:
/alidata/go-ethereum/build/bin/geth --datadir data init genesis.json
2.3 启动节点
/alidata/go-ethereum/build/bin/geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
geth的参数解释:
identity |
区块链的标示,随便填写,用于标示目前网络的名字 |
init |
指定创世块文件的位置,并创建初始块 |
datadir |
设置当前区块链网络数据存放的位置 |
port |
网络监听端口 |
rpc |
启动rpc通信,可以进行智能合约的部署和调试 |
rpcapi |
设置允许连接的rpc的客户端,一般为db,eth,net,web3 |
networkid |
设置当前区块链的网络ID,用于区分不同的网络,是一个数字 |
console |
启动命令行模式,可以在Geth中执行命令 |
不出所料,这时节点将成功启动,并进入JavaScript控制台,如下图所示:
第一篇就先到这里吧,下一篇将一步一步地布署属于小白的第一个智能合约。不见不散:)
参考文章:
http://8btc.com/article-4537-1.html 以太坊私链与智能合约部署入门教程
http://blog.csdn.net/sportshark/article/details/51855007 区块链开发(一)搭建基于以太坊的私有链环境
http://npm.taobao.org/ 淘宝NPM镜像
http://blog.csdn.net/weixin_40139875/article/details/77879915 go-ethereum 1.6 Makefile:15: recipe for target 'geth' failed