万户资源科技

区块链的应用及开发环境的部署

zhouxiaohui 2019-10-31 技术

最近区块链技术大火,刚好我又正在为客户开发了一款基于以太坊的区块链应用APP,所以写一点儿东西来发表一下自己对于区块链的看法并介绍一下以太坊区块链测试环境的部署,供技术朋友们参考部署以用于研究区块链技术。

一、什么是区块链

本质上区块链是一个分布式去中心化的数据库,具有去中心化、不可篡改、全节点留痕、可以追溯、集体维护、公开透明的特点。

区块链的原理:区块链是一种利用块链式数据结构来验证与存储数据、分布式节点共识算法来生成和更新数据、密码学方式保证数据传输和访问的安全、由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式 。顾名思义,区块链是由区块和链组成的,区块负责承载数据(对于比特币、以太币而言就是交易数据),链将区块链接起来,而且这种链接并非简单的链接,对于每个区块而言,他在链条上的前区块的哈希值,会作为该区块内容的组成部分,这样做可以提升整个链条的防篡改能力。

通俗点儿来举个例子:我们一个村,以前都是会计记录整个村子的收入支出账,现在用了区块链的技术,于是家家有个账本子(每家一个区块节点),大家共同参与记账。村子有需要记录的账务时,用村子的广播喊一声(可能同时存在多个要记录的账务),这个时候每个人都要通过账本子上上一页记录的账务的数据,算一道非常难的题目,来得出本次账本子上头部应该写的编号(hash值随机数),谁家先算出来谁家就得到记账权和工作奖励(挖矿奖励),然后这家就广播告诉全村人这笔已经加上时间的交易,全村人共同核对这笔交易是否有效,并记录到自己的账本子上(新区块)。

二、区块链的应用

首先,区块链不等于比特币,比特币只是运用了区块链的技术,区块链本质是一个分布式去中心化的数据库,是一种底层技术。

1、  支付、清算、结算:去掉中间环节,不受任何人、任何实体的控制,点对点直接交易,数据在所有节点完整复制,攻击者没有单一的攻击入口,也没有任何人可以篡改数据(删、改的操作可能性基本为0),安全性更高。

2、  财税应用:比如发票,一旦使用区块链的技术,偷税漏税完全不可能了。当然,很多人认为要是用了这个,企业的税收没办法避开了,增加了负担,我个人认为不会增加负担,那些偷税漏税的税收征收起来了,国家在税率方面就会适当调整,毕竟之前不法分子偷税漏税的那一块,我个人认为是转嫁到那些合法缴税的人身上了。

3、  安全及防伪溯源:如粮食安全溯源。

4、  数字货币:虚拟币如比特币(当前价格:64430元人民币一枚)、以太币(当前价格:1290元人民币一枚)。

5、  知识产权保护。

6、  区块链信用,写在链上,老赖无处藏身。

7、  医疗:不用换个医生就要这检查那检查,所有的检查记录都带时间戳写在链上。

8、  弘扬社会正气:比如什么开房记录,写在链上,花钱也没地方能处理了。

……

三、基于以太坊geth测试环境部署

1、首先购买一台服务器,目前阿里云双十一活动,若有未注册未实名的公司可以拿到1-3折的高配置服务器。如果打算连接以太主网,那服务器配置就要非常好了,我目前用的是4核CPU、8核内存、20M带宽、400G SSD数据磁盘(连接主网的话,一定要选SSD磁盘,否则嘿嘿,同步不了,磁盘也一定要足够大,同步数据大约花了我200G左右吧),一个月服务器费用5-6K的样子。如果自己用来测试研究的,不是开发应用,那就不需要链接主网,就没必要这么豪华的配置了。如果只是研究测试,可以买香港服务器,省去备案的麻烦。

2、下面以Linux CentOS 操作系统为例来部署开发环境:

1)、挂载数据磁盘 (这个没什么好说的,很简单)

2)、更新centos服务器并下载git、wget、vim、gcc-c++、ntp组件、nodejs以及添加epel第三方安装源(最好直接用这个命名,这里可以避免后面安装Ethereum客户端的非常多的大深坑,我一个深坑都没躲过)

命令:

#yum update -y && yum install git  wget bzip2 vim gcc-c++ ntp epel-release nodejs cmake –y

3)、安装go语言

#cd /usr

#一定要安装最新版的go语言版本,去官网查好了再安装,我第一次安装的不是最新版,后面同步的时候卡了我一个星期,每次都在7820000区块的位置不动了,国内国外的文档找遍了也不知道原因,后面我都要放弃这个go语言客户端版本了,打算安装另一个语言版本的时候,发现另一个语言版本的文档中描述了这个问题(同步主网遇到,测试环境应该还好)

#wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
#解压golang并将工作目录移动到/usr/local/go
#tar -C /root -xzf go1.10.3.linux-amd64.tar.gz
#mv /root/go /usr/local
#配置GOROOT和PATH
#echo "export GOROOT=/usr/local/go" >> /etc/profile
#echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
#source /etc/profile
#验证安装是否成功
#go version

3)、安装go-ethereum

#mkdir /www/goeth
#cd /www/goeth
#git clone https://github.com/ethereum/go-ethereum.git
#cd go-ethereum
#make all
#echo "export PATH=$PATH:/www/goeth/go-ethereum/build/bin" >> /etc/profile
#source /etc/profile
#验证geth是否安装成功
#geth version
#下面创建的目录用来存储同步的区块数据的
#mkdir gethdata

4)、同步网络时间(非常重要,大深坑,深不见底)

#systemctl enable ntpd
#systemctl start ntpd

5)、开启防火墙

#systemctl start firewalld

6)、放开端口(阿里云的服务器记得添加安全组)

#firewall-cmd --zone=public --add-port=8545/tcp –permanent
#firewall-cmd --zone=public --add-port=30303/tcp –permanent

7)创建创世区块 (搭建自己的私有链)

#如果是要搭建自己的私有区块链,就需要这一步,如果是链接其他的区块就不需要这一步。
#举个例子,假如你想要自己开发一个应用,这个应用是从0开始的,你是这个链条的创始者,那么就需要这一步。否则,你直接连接其他网络,加入到其他网络就可以了,就不需要这一步了。
#vi /www/goeth/go-ethereum/gethdata/genesis.json
#写入下面这些内容:
{
   "config": {
        "chainId": 100,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "coinbase" : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x20000",
    "extraData" : "",
    "gasLimit" : "0x2fefd8",
    "nonce" : "0x0000000000000042",
    "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp" : "0x00",
    "alloc": { }
}

配置解释:

参数名称

参数含义

chainId

指定了独立的区块链网络id,网络id在连接到其它节点的时候会用到,以太坊公网id是1,不同的id网络的节点无法相互连接

homesteadBlock

HomesteadBlock是以太坊的第二个主要版本,第一个是Frontier,这个值设置为“0”表示目前正在使用Homestead版本

eip155Bloc

eip是ethereum   improvement proposal的缩写,我们的链不会提议分叉,所以设置为“0”即可

eip158Block

同上

minhash

与nonce配合用于挖矿,由上一个区块的一部分生成的hash,注意它和nonce的设置需要满足以太坊的yellow paper,4.3.4. Block Header Validity, (44)章节所描述的条件。

nonce

一个用于挖矿的64位随机数,可以随便填写。和mixhash的设置一样,需要满足以太坊的Yellow   paper, 4.3.4.Block Header Validity (44)章节所描述的条件。

difficulty

设置当前区块的难度,如果数值过大,挖矿时间较长,在测试环境为节省算力和等带时间可设置较小值。

alloc

用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以不需要预置有币的账号,需要的时候再创建即可

coinbase

矿工的账号,随便填写

timestamp

设置创世区块的时间戳

parentHash

上一个区块的哈希值,因为是创世区块,所以这个值是0

extraDat

可以写入32byte大小的任意数据,每个block都会有,由挖出block的miner来决定要不要写点什么。该参数可以填你的个性信息,但必须为十六进制的字符串。

gasLimit

该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为是私有链,所以填最大。

#初始化创世区块:
#cd /www/goeth/go-ethereum/gethdata
#geth --datadir /www/goeth/go-ethereum/gethdata init genesis.json

8)、启动本节点并同步区块数据

#cd /www/goeth/go-ethereum/gethdata
#nohup geth 
--identity "万汇_Node" 
--rpc 
--rpcaddr 127.0.0.1 
--rpcapi 'db,eth,net,web3,personal' 
--datadir /www/goeth/go-ethereum/gethdata 
--networkid 1 &
#注意这里networkid 1,这里的1指的是主网,如果是私有链改为创世区块配置中的chainId
#当然,如果你创建了区块,别人要连接你的区块,他就不需要上面第7步了,直接在这里填写你的chainId就可以了。
#上面的命令会在/www/goeth/go-ethereum/gethdata目录下生成同步日志nohup.out。
#可以使用下面命令打印日志
#cd /www/goeth/go-ethereum/gethdata
#tail -f nohup.out
#如果同步报错了,使用下面命令清除数据后再重新同步
#geth removedb --datadir /www/goeth/go-ethereum/gethdata

9)、查看同步状态

#另起一个ssh窗口
#geth attach ipc:/www/goeth/go-ethereum/gethdata/geth.ipc
#eth.syncing
#输出参数解释(如果同步完成会输出false,以下是未完成同步的时候输出):
- startingBlock:开始同步的起始区块编号;
- currentBlock:当前正在导入的区块编号;
- highestBlock:通过所链接的节点获得的当前最高的区块高度;
- pulledStates:当前已经拉取的状态条目数;
- knownStates:当前已知的待拉取的总状态条目数;

#其他的一些命令:

连接节点数量 : net.peerCount

查看自己节点信息 : admin.nodeInfo

是否监听节点 : net.listening

连接点数组 : admin.peers

查看区块高度 : eth.blockNumber

账户余额一定要同步完全结束才行,否则一律是0

查看账户余额 : eth.getBalance("以太账号")

当前节点中存在账号:personal.listAccounts

// 主网CPU挖矿,想都别想,显卡挖矿最好的配置500多天有机会能挖到一枚吧,一枚1300元人民币,算一算够不够电费和你电脑的损坏,哈哈

启动挖矿:miner.start()

停止挖矿: miner.stop()

节点当前每秒可算出的hash数量:eth.hashrate

查看挖矿是否已经停止,false已停止:eth.mining

获取挖矿账户余额:eth.getBalance(eth.coinbase)

10)、supervisor监听geth进程

#我在开发的过程中,geth客户端经常挂掉,即使使用nohup后台运行,实在没办法,不能每次都要我手动来启动吧,只好用supervisor搞一个守护进程。

#安装supervisor

# yum install epel-release
# yum install -y supervisor
# systemctl enable supervisord # 开机自启动
# systemctl start supervisord # 启动supervisord服务
# systemctl status supervisord # 查看supervisord服务状态
# ps -ef|grep supervisord # 查看是否存在supervisord进程
#自动生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
#vi /etc/supervisord.conf

//可以直接修改这个文件,可以另外新建一个文件,我采用新建一个配置文件的方式,所以我在这里最底部添加如下:

#在文件底部的[include]的files后面加上值

/www/goeth/go-ethereum/gethdata/supervisord_geth.conf 与前面的conf空格隔开

# supervisord_geth.conf文件的配置内容:

[program:geth-ethereum]
command=/www/goeth/go-ethereum/build/bin/geth --identity "万汇_Node" --rpc --rpcaddr 127.0.0.1 --rpcapi 'db,eth,net,web3,personal' --datadir /www/ goeth /go-ethereum/gethdata --ethash.dagdir "/www/ goeth /go-ethereum/gethdata/geth/ethash" --rpccorsdomain "*" --networkid 1 --mine console 2>> /www/ goeth /go-ethereum/gethdata/geth.log
;numprocs=1                 ; 默认为1
;process_name=%(program_name)s   ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/www/goeth/go-ethereum/gethdata   ;
;user=root                    ;
autostart=true
autorestart=true             ; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
startsecs = 5                ; 启动 5 秒后没有异常退出,就当作已经正常启动了
startretries=9999            ; 当进程启动失败后,最大尝试启动的次数,当超过3次后,supervisor将把此进程的状态置为FATAL
exitcodes=0
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true         ; 重定向输出的日志
logfile_backups=10
stdout_logfile_maxbytes=8MB
stdout_logfilie =/www/goeth/go-ethereum/gethdata/supervisord_geth.log
loglevel=info


文章关键词
区块
应用
开发
环境
部署
qq qq tel
服务热线:

027-6552-0496