以太坊私有链部署
1. 区块链正式进入3.0时代,房地产、供应链等将成应用重点领域
随着区块链的不断发展,区块链的应用覆盖的范围越来越广,伴随可扩展性和效率的提高,区块链应用范围将超越金融范畴,拓展到物流、地产和物联网等领域,成为未来 社会 的一种最底层的协议,这也就意味着区块链将进入3.0时代。
区块链1.0时代是以BTC(去中心化概念)为代表,更多的是起到一种分布式记账的作用如BTC、Ripple、BCH、莱特币、狗狗币等。更多的是充当数字货币记账用的。当然第一个阶段发展的也并不完美,比特币还有很多问题需要解决,比如扩容,闪电支付,硬分叉等。
随着进一步完成,区块链来到了2.0时代,以ETH(智能合约)代表,进入合约阶段。
ETH为代表的区块链2.0是一大进步,但仍然存在着很多问题,比如通道拥堵,交易速度慢,分叉风险,高额手续费等等。举例来说,风靡一时的加密猫( CryptoKitties)在以太坊平台上线后,最高时占据了约25%的以太坊网络,造成了整个以太坊网络的拥堵,严重地影响了其他以太坊用户的体验。目前的发展就是处于第一个阶段到第二个阶段的过度过程。
在告别了1.0和2.0时代之后,得益于技术的不断发展,区块链变得更加实用。这也意味着区块链将彻底脱离去初创时期的金融属性,凭借其去中心化等特性,进入到各行各业的实际应用场景中去。
这也意味着区块链正式开启其3.0时代——全面应用的时代。而3.0时代的区块链产业结构,也更加复杂,今天就为大家简单分析一下。
3.0时代区块链产业分为基础层、服务层、应用层三个层次。
(1)、基础层
对应的产业链上中下游包括:上游底层技术及基础设施(核心技术、设备、底层平台部署方式),中游服务层主要是面向开发者提供基于区块链技术的应用;下游应用层包括金融、供应链管理、智能制造、政府企业、服务、 社会 应用等。
硬件、技术及基础设施厂商主要提供区块链应用所必备的芯片、矿机、矿池、硬盘、路由器等基础设施。
底层平台部署方式可以分为公有链、联盟链、私有链。
底层技术包括核心基础组件、协议和算法。基于底层核心技术组件,针对不同应用场景提供不同功能,包括智能合约、可编程资产、激励机制、成员管理等。
基础层提供底层区块链或分布式账本技术框架,主要包括以太坊、Hyperledger Fabric、R3 Corda、FISCO BCOS等。
(2)、服务层
服务层是指BaaS(Blockchain as a Service)平台,国内主要的BaaS平台有蚂蚁区块链BaaS平台、腾讯云TBaaS、平安壹账链BaaS平台等。
主要是面向开发者提供基于区块链技术的应用,是在底层技术的基础上提供智能合约、信息安全、数据服务等产品化服务,提高开发者在平台层开发应用的便捷性和可拓展性。
应用及服务厂商负责区块链通用技术及技术扩展平台研发、数字货币教育与存储平台搭建等工作,为行业应用层提供技术支持。
(3)、应用层
应用层表现为核心应用组件,包括智能合约、可编程资产、激励机制、成员管理等。
是指区块链的终端使用者或服务供应商,现在区块链的主要应用场景有跨境支付、防伪溯源、供应链金融、贸易融资、电子票据、ABS等。
服务对象分为两大类:B端(起步阶段):区块链+(金融、供应链管理、版权保护、教育);C端(率先落地):区块链+(共享经济、泛 娱乐 )。
下游区块链应用领域为区块链技术与现有行业的结合运作,现在,多个行业已经开启了区块链3.0的应用时代。
(1)、区块链+供应链
区块链+供应链实现商品信息全流程追溯。传统供应链的溯源防伪系统存在信息不透明、数据容易篡改、安全性差和相对封闭等弊端,而利用区块链技术和物联网技术,可将商品的原材料采买过程,生产过程和流通过程的信息进行整合和追溯,真正实现跨越品牌商、渠道商、零售商、消费者,精细到一物一码的全流程正品追溯,显著提升用户信任体验。
(2)、区块链+物联网
搭建万物互联时代的信息交流网络。随着物联网中设备数量的增长,区块链的分布式特性为物联网自我治理提供了途径,可以帮助物联网中的设备理解彼此,并了解不同设备间的关联,从而实现对物联网的分布式控制。
(3)、区块链+医疗
保障医疗数据安全共享。运用区块链技术对医疗数据进行数学加密,可有效防止医疗数据被恶意修改等风险。应用区块链技术开发的医疗数据共享和交换系统,将加密后的医疗数据上传,可以实现数据在患者、各医疗机构之间快速、高效、安全地进行共享和流通,有效简化了医疗数据的调用流程,为精确诊断病情提供数据保障。
(4)、区块链+房地产
区块链在房地产行业的潜在应用场景非常多,常见的如房产交易。买卖产权的过程中的痛点在于:交易过程中和交易后缺乏透明,大量的文书工作,潜在的欺诈行为,公共记录中的错误等等,而这些还仅仅只是一部分。区块链提供了一个途径去实现无纸化和快速交易的需求。此外,房地地产区块链应用可以帮助记录、追溯和转移地契、房契、留置权等等,还给金融公司、产权公司和抵押公司提供了一个平台。区块链技术致力于安全保存文件,同时增强透明性,降低成本。此外,区块链还应用建筑工程领域,在当前大火的城市更新也有很多企业在应用这一技术。例如深圳的兰房链就基于区块链提出了区块链+城市更新/建筑工程/房地产开发等一揽子解决方案,全面服务于房地产行业诸多领域,目前其官网、移动应用均已上线。
此外,区块链在供应链金融、股票交易、银行业等已经有了很多的应用,此处不再一一赘述。
作为我国十四五规划的重要内容之一,官方早已提出要加快推动 区块链技术和产业创新发展 ,积极推进 区块链和经济 社会 融合发展 。
而要实现上述两个发展,其关键在于以下两点:
1、区块链技术核心技术突破。
区块链技术是目前我国和欧美差距最小的技术,官方特别强调在这个新兴领域我国要走在理论最前沿、占据创新制高点、取得产业新优势。要推动协同攻关,加快推进核心技术突破,为区块链应用发展提供安全可控的技术支撑。
目前区块链技术大多数依然停留在概念炒作阶段,很多业务场景单纯为了区块链而区块链。目前为止我国还没有人能在全球范围内解决三元悖论等核心技术困境,因此我们必须回归基础理论和核心技术,通过长期潜心研究,才能取得重大突破。
事实上,官方对区块链技术理论技术和后续的应用发展提出了非常高的要求,做好区块链基础理论研究,着力攻克一批关键核心技术,真正把技术研发的担子挑起来,是当前区块链发展的关键。
2、提升国际话语权和规则制定权。
不同于以往的信息技术,区块链技术具有很强的扩张性,或者叫侵略性,它的规则或者话语权决定了它的影响范围,因为每一个上链开展业务的个体或机构必须服从区块链所定的规则,无论中外均是如此。举个例子,大家使用windows系统时必须要服从windows的规则,但是windows只是为用户规定了信息交互的规则,这对我们来说是可以接受的,而区块链则规定了产业治理规则,区块链的治理规则凭借其分布式特征,其影响力可迅速超越国界和地域限制。
为了实现上述两点,我们要加强人才队伍建设,建立完善人才培养体系,打造多种形式的高层次人才培养平台,培育一批领军人物和高水平创新团队。
区块链作为架构性创新技术,对复合型人才需求巨大,要求从事者掌握涉及密码学、信息科学、基础数学等多种专业技术知识。发展区块链,必须加强学科深度交叉融合的人才队伍建设,从基础研究、应用研发、产业融合等方面前瞻和系统性地建立人才培育体系。
区块链技术是未来数字经济的重要组成部分,对于各行各业,它都有着丰富的优势。尽管已经进入3.0时代,但区块链在各行各业的垂直落地应用,才刚刚开始。
对于区块链的未来,你怎么看?
2. 如何创建私链
创建创世配置文件:
首先需要创建一个“创世”json配置文件,此文件描述了创世区块的一些参数。下面就是文件中的内容:
{
"coinbase": "",
"config": {
"homesteadBlock": 5
},
"difficulty": "0x20000",
"extraData": "0x",
"gasLimit": "0x2FEFD8",
"mixhash": "",
"nonce": "0x0",
"parentHash": "000000000000000000000000",
"timestamp": "0x00",
"alloc": {
"":
{
"balance":""
}
}
}12345678910111213141516171819
将上面这段代码复制到一个文本文件里并起名为genesis.json
创世!:
为了不和主链的数据冲突,这里建议建立自己的私链数据文件夹。在我的电脑上在E盘建了一个EthDBSpace作为以太坊实验工作区,并在里面创建了一个PrivChain文件夹作为我的第一个私链的数据存放文件夹
这里为了方便管理将genesis.json放在了EthDBSpace文件夹下
打开Windows命令行
键入如下命令
geth --datadir "E:\EthDBSpace\PrivChain" init "E:\EthDBSpace\genesis.json"1
–datadir 选项用来指定我们私链的数据目录。在我的电脑上是E:\EthDBSpace\PrivChain
init 命令为创世命令,后面紧跟着我们的创世配置文件路径。
点击回车后执行结果如下
此时创世完成!
创建账户:
为了在私链上做实验,我们还需要在私链上建立自己的账户
Windows命令行键入
geth --datadir "E:\EthDBSpace\PrivChain" console1
我们由于已经创世成功所以第二次进入客户端时我们不用再次指定genesis.json文件路径,而是直接–datadir 指明私链数据路径即可。
console命令用来开启geth的命令行。
点击回车后,客户端会先经过一阵初始化。在命令提示符出现后,说明已经进入geth console
在geth命令行中键入
personal.newAccount('Your Password')1
personal.newAccount 函数用来创建账户,其中参数为账户密码
点击回车后会出现
账户创建成功后会在命令下方以绿色字符列明创建账户的地址,也即账户的公钥
我们可以先查下账户余额,在geth命令行中键入:
my=eth.accounts[0]
eth.getBalance(my)12
my=eth.accounts[0],此句的目的是将我们刚创建的账户地址赋值给my变量。这样可以简化后续账户地址输入。其中eth.accounts记录了本机上所有账户地址。由于我们第一次创建账户,所以目前电脑上只有一个账户。所以这里我们用eth.accounts[0]提取第一个账户地址。eth.getBalance函数用来获得账户余额,参数填入账户地址。这里的my变量记录的就是第一个账户的地址。
希望我的回答可以帮到您哦
3. 以太坊多节点私有链部署
假设两台电脑A和B
要求:
1、两台电脑要在一个网络中,能ping通
2、两个节点使用相同的创世区块文件
3、禁用ipc;同时使用参数--nodiscover
4、networkid要相同,端口号可以不同
1.4 搭建私有链
1.4.1 创建目录和genesis.json文件
创建私有链根目录./testnet
创建数据存储目录./testnet/data0
创建创世区块配置文件./testnet/genesis.json
1.4.2 初始化操作
cd ./eth_test
geth --datadir data0 init genesis.json
1.4.3 启动私有节点
1.4.4 创建账号
personal.newAccount()
1.4.5 查看账号
eth.accounts
1.4.6 查看账号余额
eth.getBalance(eth.accounts[0])
1.4.7 启动&停止挖矿
启动挖矿:
miner.start(1)
其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
停止挖矿,在 console 中输入:
miner.stop()
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。
1.4.8 转账
目前,账户 0 已经挖到了 3 个块的奖励,账户 1 的余额还是0:
我们要从账户 0 向账户 1 转账,所以要先解锁账户 0,才能发起交易:
发送交易,账户 0 -> 账户 1:
需要输入密码 123456
此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions 查看当前待确认交易。
使用 miner.start() 命令开始挖矿:
miner.start(1);admin.sleepBlocks(1);miner.stop();
新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币:
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
用同样的genesis.json初始化操作
cd ./eth_test
geth --datadir data1 init genesis.json
启动私有节点一,修改 rpcport 和port
可以通过 admin.addPeer() 方法连接到其他节点,两个节点要要指定相同的 chainID。
假设有两个节点:节点一和节点二,chainID 都是 1024,通过下面的步骤就可以从节点二连接到节点一。
首先要知道节点一的 enode 信息,在节点一的 JavaScript console 中执行下面的命令查看 enode 信息:
admin.nodeInfo.enode
" enode://@[::]:30303 "
然后在节点二的 JavaScript console 中执行 admin.addPeer(),就可以连接到节点一:
addPeer() 的参数就是节点一的 enode 信息,注意要把 enode 中的 [::] 替换成节点一的 IP 地址。连接成功后,节点一就会开始同步节点二的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
通过 admin.peers 可以查看连接到的其他节点信息,通过 net.peerCount 可以查看已连接到的节点数量。
除了上面的方法,也可以在启动节点的时候指定 --bootnodes 选项连接到其他节点。 bootnode 是一个轻量级的引导节点,方便联盟链的搭建 下一节讲 通过 bootnode 自动找到节点
参考: https://cloud.tencent.com/developer/article/1332424
4. 以太坊私有链搭建(2)--修改挖矿难度
官放解释就不多说了,Difficulty值越大,越难出区块,意味着交易不容易确认,默认的机制是难度越来越大,对私有链一般是不可接受的,当然这个值也不是越小越好,这样的话也会让机器的很卡,所以这个值要根据项目自己确定。
创世区块中的的难度能影响整体的挖矿速度,但是并不能改变难度上升这个趋势,所以在自己的项目中,仅仅在创世区块中指定难度是不够的。
当前geth版本 1.7 unstable
源文件 consensus/ethash/consensus.go 行290
好了,这里也不多想怎么实现了,我也看不懂,简单改下返回难度为恒定值就会~~
将这个函数改为
重新make geth,试试看出块难度是不是恒定了。
5. 区块链并不是一条链三种链都跑哪些应用
当前区块链的应用部署类型有三种——公有链、私有链、联盟链,看看他们有什么区别?都有哪些典型的应用?
公有链:对所有人开放,任何人都可以参与
私有链:对单独的个人或实体开放
联盟链:对特定的组织团体开放
6. 以太坊开发(2):在以太坊私有链上的基本操作
在上一讲 如何使用geth搭建以太坊私有链 完成了私有链的搭建,下面介绍在私有链上的基本操作。
启动私有链后在命令行输入:
执行完之后可以查看到生成的账户地址为
查询账户余额:
刚刚创建的私有链账户都是没有余额的,需要通过挖矿才会产生eth,下面介绍如何在私有链上挖矿。
在geth环境下执行:
这时候查看日志geth.log可以看到以太坊私有链有个启动的百分比,到100就正式启动了:
挖矿开始:
这时候有个疑问,挖矿挖到的eth到哪了,其实默认到了eth.account[0],就是第一个账户上:
如何修改挖矿所得的账户:
命令如下:
下面开始进行转账:
这时候出现报错,原因是转账的账户没有解锁,需要输入密码解锁转账的账户才能完成转账操作:
7. Docker 搭建以太坊私有链
首先需要安装 Docker,Docker 的安装和使用可以参看阮一峰老师的 《Docker 入门教程》 。
Ethereum 官方是支持 docker 的,可以参看 官方文档 。
centOS
其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我们当前的 ethereum 目录,挂到了docker 的 /root 下。
在 Windows 环境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能启动容器,原因不明,所以在 Windows 下先不要使用目录挂载。
各字段具体用途参看 官方文档 。
Windows
Windows 不必创建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器启动后创建。
centOS
Windows
运行成功后执行
进入 docker 容器命令行
因为 Windows 没有挂载共享目录,所以 root 目录下没有 genesis.json 文件,我们要在这里手动创建 genesis.json 文件,内容要和 centOS 的一致。
data 用来存放区块数据
geth 的参数参看 以太坊客户端Geth命令用法-参数详解
启动私有节点后进入 geth 命令行执行:
输出的内容就是节点信息,我们在手动连接节点是会用到,注意要把“0.0.0.0“换成你自己的IP,然后将这个信息发送给其他节点。手动连接节点有两种方式:
当然不管使用哪种方法连接节点都要保证创世区块文件 genesis.json 一致,还有在启动时 networkid 也要一致。
至此以太坊私有链已搭建完毕。
geth命令
docker命令
8. 搭建geth私有链和联盟链网络
操作系统:linux或Mac OS
安装geth执行以下命令:
linux:sudo apt-get install ethereum
Mac OS:brew install ethereum
直接创建两个geth的工作目录,用于之后的组建联盟链的使用:
mkdir eth-private1
mkdir eth-private2
首先 cd eth-private1 进入节点1的工作目录该目录下执行下面命令
geth --datadir data --nodiscover console (data是之后geth节点的数据目录,可自行修改)
使用geth自带的工具 puppeth 用于生成创世区块,过程如下:
puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, please)
输入私链名称后,会出现二级菜单,现在2:配置一个新的创世快
What would you like to do? (default = stats)
再次出现二级菜单,让你选择共识机制(这里采用poa共识)
Which consensus engine to use? (default = clique)
Ethash - proof-of-work(PoW) :工作量证明,通过算力达成共识 (以太坊就是使用这种方式)
Clique - proof-of-authority(PoA): 权威证明、通过预先设定的权威节点来负责达成共识 (不消耗算力,一般用于私有链测试开发)
如果选择Pow的共识方法,直接输入1,回车即可。
如果选择PoA的共识方法,输入2后会提示让你选择处快的间隔时间,一般测试开发使用可以设置相对的将处快时间设置较少5秒即可,然后会让你选择哪个账户来作为权威生成区块(至少有一个,输入刚才创建的账户,若只是单节点就输入那个节点目录生成的地址,若想组建联盟链就填写生成的两个地址)
How many seconds should blocks take? (default = 15)
选择好共识机制后会让你指定给那些账号初始化ether(至少有一个),输入我们刚才创建的账户地址回车即可。
Which accounts should be pre-funded? (advisable at least one)
选择输入私有链的网络ID,任意数字即可(不能为1,1是公链),也可以不输入会给定一个随机数作为私有链的网络ID
Specify your chain/network ID if you want an explicit one (default = random)
选择导出创世区块配置文件
选择导出创世区块配置文件的保存路径,可以保存到当前目录,直接按回车即可
Which file to save the genesis into? (default = my-private-chain.json)
INFO [02-09|14:56:33] Exported existing genesis block
这样就完成了创世区块文件的配置了,直接退出puppeth即可。
输入命令 geth --datadir data init private.json 其中data自己制定,private.json就是刚才生成的创世区块
若出现如图错误:
输入命令:
geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 进入控制台
--datadir data:节点的数据目录
--syncmode full:块同步的方式(若只是单节点可不填)
--port 2001: 网卡监听端口
--networkid 1234:网络标识符
--rpc:开启rpc服务
--rpcport "8545":rpc服务的端口
--rpccorsdomain "*":允许跨域请求的域名列表(逗号分隔)(浏览器强制)
--rpcaddr "0.0.0.0" :HTTP-RPC服务器接口地址(默认值:“localhost”)
--rpcapi "db,eth,net,web3,personal,admin,clique":基于HTTP-RPC接口提供的API(私有链可以任意开发,公有链需要谨慎)
--nodiscover:不允许节点自动加入
若想搭建联盟链,必须保证创世区块一致,进入到刚才创建的eth-private2的目录
将之前生成的创世区块拷贝过来,初始化创世区块,然后使用启动命令启动分别启动两个节点,进入控制台,使用 admin.nodeInfo 命令获取节点的信息
总结:
两个服务器部署两个节点是可以联通的,但是只能使用两个节点对应的地址进行挖矿,所以只能是两个节点对应两个地址进行挖矿,使用poa共识,当一个节点挂掉,挖矿停止,因为poa共识挖矿必须超过50%的节点进行钱增,现在只是两个节点,挂掉一个节点挖矿就会停止等待另一个节点的确认,停掉的节点可以通过正常运作的节点信息重新连接到网络中。
问题:
同步块有可能报错情况:
1:Synchronisation failed "retrieved hash chain is invalid" 解决目前找到的方法是removedb 数据目录 ,重新init创世区块
2:内存溢出初步确认为开启rpc服务造成的,有可能服务器恶意被黑,暴力破解密码,占有内存,解决,将服务器的ip设置一条防火墙
若存在问题可给本人留言或访问本人的github: https://github.com/qi-shuo/geth-document 记录了一些本人搭建使用的命令
9. 可以用云服务器搭建以太坊私有链节点吗
可以的,但是建议使用海外服务器会比较好,另外服务器的配置要中等或以上。
10. CentOS 6.5上搭建以太坊私有链,编译时报错: make: *** [geth] Error 1,请各位大神指教
build/env.sh go run build/ci.go install ./cmd/geth
make: *** [geth] Error 1
没有这个目录,或者这个目录权限不够