区块链发展背景:码农的区块链:搭建一个私有链环境!
最近在研究区块链。打算先搭建一个测试环境开始运行。这里记录整个搭建过程,供后来人参考。整体上,分为三个步骤,安装相关软件,初始化系统,建立集群,以及最后一步,挖矿。我们采用的是以太坊,相对其他区块链,这是一个成熟的环境。虽然近期有硬分支的事件,对企业应用来说,功能上还算是比较完善的。
安装部署
1、安装Go环境
如果机器无法上外网,还得配置一下代理。Ubuntu配置代理的方式网上很多,这里不介绍。
curl-Ohttps://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
tar-C/usr/local-xzfgo1.5.1.linux-amd64.tar.gz
mkdir-p~/go;echo"exportGOPATH=$HOME/go">>~/.bashrc
echo"exportPATH=$PATH:$HOME/go/bin:/usr/local/go/bin">>~/.bashrc
source~/.bashrc
2、安装ethereum
sudoapt-getinstallsoftware-properties-common
sudoadd-apt-repository-yppa:ethereum/ethereum
sudoadd-apt-repository-yppa:ethereum/ethereum-dev
sudoapt-getupdate
sudoapt-getinstallethereum
在执行sudoadd-apt-repository-yppa:ethereum/ethereum的时候碰到这个问题:
:~#sudoadd-apt-repository-yppa:ethereum/ethereum
CannotaddPPA:'ppa:ethereum/ethereum'.
PleasecheckthatthePPAnameorformatiscorrect.
按照AskUbuntu的意见,修改为:
sudoapt-getinstallsoftware-properties-common
sudo-Eadd-apt-repository-yppa:ethereum/ethereum
sudo-Eadd-apt-repository-yppa:ethereum/ethereum-dev
sudoapt-getupdate
sudoapt-getinstallethereum
3、安装solc编译器
sudoadd-apt-repositoryppa:ethereum/ethereum-qt
sudoadd-apt-repositoryppa:ethereum/ethereum
sudoapt-getupdate
sudoapt-getinstallcpp-ethereum
同样的,如果碰到PPAName错误的警示,则执行如下操作:
sudo-Eadd-apt-repositoryppa:ethereum/ethereum-qt
sudo-Eadd-apt-repositoryppa:ethereum/ethereum
sudoapt-getupdate
sudoapt-getinstallcpp-ethereum
这样相关软件已经安装完毕。
搭建私链
1、启动geth服务
geth--datadir"/root/chain"console
其中datadir用于指定数据目录。这个目录不能够预先创建,否则命令会失败。执行结果如下:
2、创建账号
执行之后,进入geth的交互模式。接着建立一个账号,然后退出。这个账号用于执行创世操作。然后exit退出
>personal.newAccount("密码");
"0xea5c99831c2e4a0e094facdbac1befcf6c92e543"
>exit
3、创建创世区块
编译创建创世区块所需要的脚本,注意alloc下的key需要和上述的账号保持一致。
{
"alloc":{
"0xea5c99831c2e4a0e094facdbac1befcf6c92e543":{
"balance":"1000"
}
},
"nonce":"0x0000000000000042",
"difficulty":"0x020000",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp":"0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData":"CNNMoneyJackMainterview:Warsstartwhentradestops,20160902",
"gasLimit":"0xffffffff"
}
各个参数的含义如下:
mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellowpaper,4.3.4.BlockHeaderValidity,(44)章节所描述的条件。.
nonce:nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellowpaper,4.3.4.BlockHeaderValidity,(44)章节所描述的条件。
difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc:用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase:矿工的账号,随便填
timestamp:设置创世块的时间戳
parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
extraData:附加信息,随便填,可以填你的个性信息
gasLimit:该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
创建数据存放地址并初始化创世块
geth--datadir"/root/chain"initgenesis.json
执行结果如下:
4、启动私链
执行如下脚本
geth--identity"phoenix"--rpc--rpccorsdomain"*"--datadir"/root/chain"--port"30303"--rpcapi"db,eth,net,web3"--networkid98888console
各参数说明如下:
identity:区块链的标示,随便填写,用于标示目前网络的名字
init:指定创世块文件的位置,并创建初始块
datadir:设置当前区块链网络数据存放的位置
port:网络监听端口,默认是8080
rpc:启动rpc通信,可以进行智能合约的部署和调试。它在geth中通常被默认激活。
rpcapi:设置允许连接的rpc的客户端,一般为db,eth,net,web3
networkid:设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console:启动命令行模式,可以在Geth中执行命令
此外,还可以使用如下参数:
nodiscover:使用这个命令可以确保你的节点不会被非手动添加你的人发现。否则,你的节点可能被陌生人的区块链无意添加,如果他和你有相同的初始文件和网络ID。
maxpeers:如果你不希望其他人连接到你的测试链,可以使用maxpeers0。反之,如果你确切知道希望多少人连接到你的节点,你也可以通过调整数字来实现。
rpcapi:这个命令可以决定允许什么API通过RPC进入。在默认情况下,geth可以在RPC激活web3界面。请注意在RPC/IPC界面提供API,会使每个可以进入这个界面(例如dapp’s)的人都有权限访问这个API。注意你激活的是哪个API。Geth会默认激活IPC界面上所有的API,以及RPC界面上的db,eth,net和web3API。
rpccorsdomain:这个可以指示什么URL能连接到你的节点来执行RPC定制端任务。务必谨慎,输入一个特定的URL而不是wildcard(*),后者会使所有的URL都能连接到你的RPC实例。
启动后界面如下,光标停留在最后的命令行上,可以执行以太坊命令。可以看到Listeningon[::]:30303和WelcometotheGethJavaScriptconsole!的提示,说明已经启动成功
注意:如果想将Ubuntu作为永久区块链节点使用,当使用nohup命令时,Geth启动参数console必须去掉,否则Geth会自动停止。
执行结果如下:
5、查看节点信息
常用命令:
net.listening:查看网络是否在监听;
admin.peers:查看当前连接的节点。目前还是空的。
admin.nodeInfo:查看当前节点的信息。
执行:
>admin.nodeInfo
得到当前节点信息如下:
{
enode:"enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e[::]:30303",
id:"dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
ip:"::",
listenAddr:"[::]:30303",
name:"Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
ports:{
discovery:30303,
listener:30303
},
protocols:{
eth:{
difficulty:131072,
genesis:"0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
head:"0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
network:98888
}
}
}
注意enode节点,这是当前节点的标识。后续会用到这个值。
6、查看账户信息
在创建创世节点时,我们创建了个默认账户。可以通过如下命令查看账户余额。
>eth.accounts
["0x4b691e86c622127ed8e1d49899ad8c1d19834327"]
>primary=eth.accounts[0]
"0x4b691e86c622127ed8e1d49899ad8c1d19834327"
>balance=web3.fromWei(eth.getBalance(primary),"ether");
20
配置第二台私链服务器
第二台私链服务器,需要把第一台的步骤基本都要重复一遍。两台服务器配置一样才可以通讯。需要改变的地方是:
第三步创建genesis.json的时候,完全使用第一台服务器的配置,不要用新建的account来创建。
需要将第一台服务器添加到静态节点列表中。
添加静态节点列表
在{datadir}下添加文件static-nodes.json,内容如下:
[
"enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e第一个节点的IP地址:30303"
]
执行如下脚本启动节点:
geth--identity"phoenix"--rpc--rpccorsdomain"*"--datadir"/root/chain"--port"30303"--rpcapi"db,eth,net,web3"--networkid98888console
启动成功后,查看当前连接的节点:
>admin.peers
[{
caps:["eth/62","eth/63"],
id:"dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
name:"Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
network:{
localAddress:"10.15.244.204:56808",
remoteAddress:"10.15.244.203:30303"
},
protocols:{
eth:{
difficulty:131072,
head:"0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
version:63
}
}
}]
挖矿
激动人心的时刻到了。作为一个伪金融圈人士,最大的梦想,古时候叫拥有一个聚宝盆,现在叫拥有一个印钞权,在数字货币时代,叫拥有一个挖矿机。自己搭建的区块链,想怎么挖就怎么挖吧。
私链启动起来之后,挖矿其实很简单了。首先必须保证的有一个账号:
>eth.accounts
["0x1b39aa2446de648dd6928a759c542690cc32757b"]
>eth.getBalance(eth.accounts[0]).toNumber();
0
账号里没钱。那就开始挖吧。挖矿其实很简单,一个命令就开始了。默认的,挖到的钱,都放在当前账号中。如果有多个账号,默认的放到第一个账号中。在geth环境下,运行:
>miner.start();
或者运行命令行:
geth--mine--minerthreads=4
minerthreads用来指定运行的线程数。默认为当前CPU的核数。如果有多个账号,可以指定挖矿收入放到第几个账号,注意编号是从0开始的:
miner.setEtherbase(eth.accounts[0])
或者命令行执行:
geth--etherbase0--mine2>>geth.log//0isindex:firstaccountbycreationorderOR
geth--etherbase'0x1b39aa2446de648dd6928a759c542690cc32757b'--mine2>>geth.log
半小时后,查看下账户余额:
>eth.getBalance(eth.accounts[0]).toNumber();
1.5971875e+21
话说,e+21,那是多大的数字啊??一辈子还没见过这么多钱。头条的同学们,记得帮忙点赞啊。
声明:本文由入驻区块网专栏作者撰写,观点仅代表作者本人,绝不代表区块网赞同其观点或证实其描述。
更多名家专栏精品文章:http://www.qukuaiwang.com.cn/zhuanlan.html